Skip to content

Latest commit

Β 

History

History
448 lines (317 loc) Β· 9.87 KB

2021-03-25-scala-base-1.md

File metadata and controls

448 lines (317 loc) Β· 9.87 KB

슀칼라 기본 1

이번 ν¬μŠ€νŒ…μ€ μŠ€μΉΌλΌμ— λŒ€ν•œ 정리 μž…λ‹ˆλ‹€.

λ³€μˆ˜ μ„ μ–Έ

var <μ‹λ³„μž>[: <νƒ€μž…>] = <ν‘œν˜„μ‹>
val <μ‹λ³„μž>[: <νƒ€μž…>] = <ν‘œν˜„μ‹>

val

val identification: String = "hello world"

λΆˆλ³€μ˜ νƒ€μž…μ„ κ°–λŠ” μ €μž₯ λ‹¨μœ„

var

var identification: String = "hello"

값을 μ €μž₯ν•˜κ³  κ·Έ 값을 κ°€μ Έ 올수 μžˆλ„λ‘ ν• λ‹Ή λ˜κ±°λ‚˜ μ˜ˆμ•½λœ λ©”λͺ¨λ¦¬ 곡간에 λŒ€μ‘ν•˜λŠ” μœ μΌν•œ μ‹λ³„μžλ₯Ό 의미

val VS var

μŠ€μΉΌλΌμ—μ„œλŠ” 관둀상 λ³€μˆ˜λ³΄λ‹€ 값을 μ„ ν˜Έλ‚˜λŠ”λ°, μ΄λŠ” 값을 μ‚¬μš©ν•˜λ©΄ μ†ŒμŠ€ μ½”λ“œκ°€ μ•ˆμ •μ  + 예츑 κ°€λŠ₯ 이기 λ•Œλ¬Έ

val 은 값을 ν• λ‹Ήν•˜λ©΄ λκΉŒμ§€ 값이 λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ½”λ“œλ₯Ό 읽고, λ””λ²„κΉ…ν•˜λŠ” 일이 쉬움

λ™μ‹œ, λ©€ν‹° μŠ€λ ˆλ“œ μ½”λ“œμ—μ„œ μ ‘κ·Ό κ°€λŠ₯ν•œ ν™˜κ²½μ—μ„œ var보닀 더 μ•ˆμ •μ μ΄κ³  μ—λŸ¬κ°€ λ°œμƒν•  ν™•λ₯ μ΄ 적음

λ³€μˆ˜ μ‹λ³„μž κ·œμΉ™

  1. ν•˜λ‚˜μ˜ 문자 λ‹€μŒμ—λŠ” 아무것도 μ—†κ±°λ‚˜, ν•˜λ‚˜ μ΄μƒμ˜ 문자 λ˜λŠ” μˆ«μžκ°€ λ”°λΌμ˜΄

    val d = 10
    val d1 = 10
    val d1d = 10
    val d1d1 = 10
  2. 1번 λ’€μ—λŠ” μ–Έλ”μŠ€μ½”μ–΄(_)λ₯Ό 덧뢙일 수 있고, κ·Έ λ‹€μŒμ— ν•˜λ‚˜ μ΄μƒμ˜ λ¬Έμžμ™€ 숫자 λ˜λŠ” μ—°μ‚° κΈ°ν˜Έκ°€ λ’€λ”°λ₯Έλ‹€.

        val d1d1_+ = 10
        val d1d1_a = 10
        val d1d1_1 = 10
        val d1d1__1 = 10
  3. ν•˜λ‚˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ μ—°μ‚°μž 기호.

        val + = 10
        val ++ = 10
  4. λ‚˜ν•˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ 문자λ₯Ό ν•œ 쌍의 μ—­μΈμš©λΆ€ν˜Έ(backquote)둜 λ‘˜λŸ¬ μ‹Όλ‹€.

    var `s` = 10
        `s` = 20
    var `s.d` = 10
        `s.d` = 20

λ¬Έμžμ—΄

val test = "hello \n world"
-> hello 
    world
  • String에 λ³€μˆ˜ 넣을 경우

    val test2 = s"$test"

Type

Scala의 νƒ€μž… ꡬ쑰 계측은 λ‹€μŒκ³Ό κ°™λ‹€

μΈμŠ€ν„΄μŠ€ λΆˆκ°€λŠ₯

Any

λͺ¨λ“  νƒ€μž…μ˜ 루트

AnyVal

λͺ¨λ“  κ°’ νƒ€μž…μ˜ 루트

AnyVal을 ν™•μž₯ν•œ νƒ€μž…μ€ 데이터λ₯Ό ν‘œν˜„ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” 핡심 값듀이기 λ•Œλ¬Έμ— κ°’ νƒ€μž…(value type)라 ν•œλ‹€.

λ‹€λ₯Έ νƒ€μž…λ“€κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ ‘κ·Όλ˜μžλ§Œ, 객체둜 νž™ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜κ±°λ‚˜ JVM κΈ°λ³Έκ°’μœΌλ‘œ μŠ€νƒμ— μ§€μ—­μ μœΌλ‘œ 할당됨

AnyRef

λͺ¨λ“  μ°Έμ‘°(값이 μ•„λ‹Œ) νƒ€μž…μ˜ 루트

AnyVal μ΄μ™Έμ˜ λͺ¨λ“  νƒ€μž…λ“€μ΄ AnyRefλ₯Ό 루트둜 가진닀.

였직 객체둜 νž™ λ©”λͺ¨λ¦¬μ—λ§Œ ν• λ‹Ήλœλ‹€.

'Ref'λΌλŠ” μš©μ–΄λŠ” λ©”λͺ¨λ¦¬ μ°Έμ‘°λ₯Ό 톡해 μ ‘κ·Όλ˜λŠ” μ°Έμ‘°(reference) νƒ€μž…μž„μ„ μ˜λ―Έν•œλ‹€.

Nothing

λͺ¨λ“  νƒ€μž…μ˜ ν•˜μœ„ 클래슀

λͺ¨λ“  νƒ€μž…μ˜ μ„œλΈŒ νƒ€μž… - ν”„λ‘œκ·Έλž¨ 흐름에 μ‹¬κ°ν•˜κ²Œ 영ν–₯을 쀄 수 μžˆλŠ” μ—°μ‚°μ—μ„œ ν˜Έν™˜μ„± μžˆλŠ” λ°˜ν™˜κ°’μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ‘΄μž¬ν•¨.

ex) return ν‚€μ›Œλ“œλŠ” λ°˜ν™˜ νƒ€μž…μ„ Nothing으둜 가지고 μžˆμ–΄ μ΄ˆκΈ°ν™” 도쀑 μ‚¬μš©ν•  수 μžˆλ‹€. λ˜ν•œ κ·Έ κ°’( 예λ₯Όλ“€μ–΄ ν•¨μˆ˜μ˜ κ°’)에 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

Nothing은 νƒ€μž…μœΌλ‘œλ§Œ μ‚¬μš©

Null

null 값을 μ˜λ―Έν•˜λŠ” λͺ¨λ“  AnyRef νƒ€μž…μ˜ ν•˜μœ„ 클래슀

μ΅œν•˜μœ„μ— 쑴재 null Type을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ 쑴재

Stringνƒ€μž…κ³Ό ν˜Έν™˜λ˜κΈ° λ•Œλ¬Έμ— null을 String νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— ν• λ‹Ή ν•  수 있음

μ΄λŠ” 슀칼라 ꡬ문이 μ˜ˆμ•½λœ ν‚€μ›Œλ“œ 보닀 μ‹€μ œ νƒ€μž…κ³Ό μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 더 μ’‹μ•„ν•œλ‹€λŠ” 사싀을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆκ°€λœλ‹€κ³ ν•¨

Unit

값이 μ—†μŒμ„ λ‚˜νƒ€λƒ„

val na = ()
type -> Unit

μΈμŠ€ν„΄μŠ€ κ°€λŠ₯

Char

μœ λ‹ˆμ½”λ“œ 문자

이 νƒ€μž…μ€ λ‹€λ₯Έ μˆ«μžμ™€ μ–‘λ°©ν–₯ μ „ν™˜μ΄ κ°€λŠ₯함

Boolean

true or false

|, & VS ||, &&

μ „μžμ˜ κ²½μš°λŠ” κ²°κ³Ό 값을 λ°˜ν™˜ν•˜κΈ° 전에 연산에 μ—°κ΄€λœ λͺ¨λ“  인수λ₯Ό κ²€μ‚¬ν•œλ‹€.

ν›„μžλŠ” 순차적으둜 κ²€μ‚¬ν•˜λ©΄μ„œ 순차적으둜 κ²€μ‚¬ν•˜λ©΄μ„œ μΆ©λΆ„ν•˜λ‹€λ©΄ 뒀에 μžˆλŠ” μΈμˆ˜λ“€μ„ ν‰κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€.

String

λ¬Έμžμ—΄

Numeric Type

μˆ«μžν˜• νƒ€μž…

μžλ£Œν˜• λ³€ν™˜

to

(5.0).toByte, 47.toFloat
  • ν•˜λ‚˜μ˜ 값을 ν˜Έν™˜λ˜λŠ” κ°’μœΌλ‘œ λ°”κΏ”μ£ΌλŠ” μ „ν™˜ ν•¨μˆ˜

νŠœν”Œ

νŠœν”Œ

λ‘˜ μ΄μƒμ˜ 값을 κ°€μ§€λŠ” μˆœμ„œκ°€ μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ, νŠœν”Œμ— ν¬ν•¨λœ 값은 μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆλ‹€.

λ…Όλ¦¬μ μœΌλ‘œ 값을 λΆ„λ₯˜ν•  ν•„μš”κ°€ 있고 κ·Έ 값듀을 ν•˜λ‚˜μ˜ μ‘μ§‘λœ λ‹¨μœ„λ‘œ ν‘œν˜„ν•˜λŠ”λ° μœ μš©ν•¨

κ·ΈλŸ¬λ‚˜ λ¦¬μŠ€νŠΈμ™€ λ°°μ—΄κ³Ό 달리 νŠœν”Œμ˜ μš”μ†Œλ“€μ„ λ°˜λ³΅ν•  수 μ—†μŒ

νŠœν”Œμ€ ν•˜λ‚˜μ΄μƒμ˜ 값을 λ‹΄κΈ°μœ„ν•œ μ»¨ν…Œμ΄λ„ˆ 일 뿐이닀.

val info = (5, "Korben", true)

Type -> (Int, String, Boolean)

info._2 -> Korben
----------------------------------------------------------------

val infos = "red" -> "0xff0000"

Type -> (String, String)

ν‘œν˜„μ‹

val amount = {
  val x = 5 * 20
  x + 10
}

amount = 110

if else

if (<λΆ€μšΈμ‹>) <ν‘œν˜„μ‹>

if ( 47 % 3 ) println("Not a multiple of 3")

if ꡬ문을 ν‘œν˜„μ‹μœΌλ‘œ μ‚¬μš©ν•  경우

val result = if (false) "what does this return?"

Type -> Unit

λ‹€μŒκ³Ό 같이 Unit을 λ°˜ν™˜ν•œλ‹€.

μœ„μ—μ„œ resultκ°€ νƒ€μž…μ΄ μ§€μ •λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ»΄νŒŒμΌλŸ¬λŠ” κ°€μž₯ μ ν•©ν•œ νƒ€μž…μ„ μΆ”λ‘ ν•œλ‹€.

μœ„ ifλŠ” μΆ”λ‘ ν• μ‹œ Unitμ΄λ‚˜ String으둜 λ°˜ν™˜ 될수 있기 λ•Œλ¬Έμ— 이 λ‘˜μ˜ 루트 클래슀인 Anyλ₯Ό μ„ νƒν•œλ‹€.

if..else

if (<λΆ€μšΈμ‹>) <ν‘œν˜„μ‹>
else <ν‘œν˜„μ‹>

----------------------------------------------

if (x > y) x else y

μœ„ μž‘μ„±λœ ꡬ문을 보면 xy둜 if else문의 전체λ₯Ό 이루고 μžˆλ‹€.

μŠ€μΉΌλΌλŠ” μ‚Όν•­μ—°μ‚°μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ°, μœ„ μ½”λ“œλ₯Ό 보면 if else 블둝이 ν•œμ€„μ— κ°„κ²°ν•˜κ²Œ λ§žμ•„ 떨어지기 λ•Œλ¬Έμ— μ‚Όν•­ ν‘œν˜„μ‹μ΄ μ‹€μ œλ‘œ ν•„μš”ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€. ( λ³„λ‘œ μ™€λ‹Ώμ§€λŠ” μ•ŠλŠ”λ‹€. )

if..else ν‘œν˜„μ‹μ΄ ν‘œν˜„μ‹ 블둝없이 μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€κ³  ν•œλ‹€.

κ·ΈλŸ¬λ‚˜ ν•œμ€„μ— λ§žμ•„ 떨어지지 μ•ŠλŠ”λ‹€λ©΄ 블둝 μ‚¬μš©μ„ κ³ λ €ν•΄μ•Όν•œλ‹€.

맀치 ν‘œν˜„μ‹

맀치 ν‘œν˜„μ‹μ€ Java μ—μ„œ Swtich λ¬Έκ³Ό λ™μΌν•˜λ‹€

case λ³€μˆ˜ λͺ…λͺ… κ·œμΉ™μ€ λ³€μˆ˜λͺ…은 μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•΄μ•Ό ν•œλ‹€λŠ” 것이닀.

val max = x > y match {
		case true => x
		case false => y
}
---------------------------------------------------------------------------
val max = x > y match {
		case true => {
			println(s"$x κ°€ 더 ν½λ‹ˆλ‹€")
			x
		}
		case false => {
			println(s"$y κ°€ 더 ν½λ‹ˆλ‹€")
			y
		}
		case other => {
			println("λ‚˜λ¨Έμ§€ 경우")
		}
}val max = x > y match {
		case true => {
			println(s"$x κ°€ 더 ν½λ‹ˆλ‹€")
			x
		}
		case false => {
			println(s"$y κ°€ 더 ν½λ‹ˆλ‹€")
			y
		}
		case other => {
			println("λ‚˜λ¨Έμ§€ 경우")
		}
}

----------------------------------------------------------------------------

val kind = day match {
		case "MON"|"TUE"|.... =>
		case "SAT"|"SUN" => 
}
----------------------------------------------------------------------------

val kind = day match {
		case "MON"|"TUE"|.... => {
		...
		}
		case "SAT"|"SUN" => {
		....
		}
}

κ°’ 바인딩 νŒ¨ν„΄

case <μ‹λ³„μž> => <ν•˜λ‚˜ μ΄μƒμ˜ ν‘œν˜„μ‹>

--------------------------------------------------------------------------
val text = if(..) {
...
case x => 20
case y => "10"
}

κ°’ 바인딩은 λ³€μˆ˜ λ°”μΈλ”©μœΌλ‘œ μ•Œλ €μ Έ μžˆλŠ”λ° 이λ₯Ό μ΄μš©ν•˜λ©΄ 맀치 ν‘œν˜„μ‹μ˜ μž…λ ₯ νŒ¨ν„΄(x)은 둜컬 값에 바인딩 λ˜μ–΄ case λΈ”λ‘μ˜ λ³Έλ¬Έμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

val x = 10
val status = x match {
        case 9 => 200
        case 10 => {
          println(s"yes $x")
          -1
        }
    }
------------------------------------------------------------------
status -> -1
 yes 10 κ°€ 좜λ ₯됨

μ™€μΌλ“œμΉ΄λ“œ

val _ = 10

μ™€μΌλ“œ μΉ΄λ“œλŠ” _ 둜 ν‘œν˜„ν•˜λŠ”λ° μ΄λŠ” μˆ˜ν•™, μ‚°μˆ  μ˜μ—­μ—μ„œ 유래 ν–ˆλ‹€κ³  ν•œλ‹€.

val max = x > y match {
		case true => {
			println(s"$x κ°€ 더 ν½λ‹ˆλ‹€")
			x
		}
		case false => {
			println(s"$y κ°€ 더 ν½λ‹ˆλ‹€")
			y
		}
		case _ => {
			println("λ‚˜λ¨Έμ§€ 경우")
		}
}

νŒ¨ν„΄ κ°€λ“œ

νŒ¨ν„΄ κ°€λ“œλŠ” κ°’ 바인딩 νŒ¨ν„΄μ— if ν‘œν˜„μ‹μ„ μΆ”κ°€ ν•˜μ—¬ match ν‘œν˜„μ‹μ— 쑰건뢀 λ‘œμ§μ„ μ„žμ–΄ μ“Έμˆ˜ 있게 ν•œλ‹€.

val status = x match {
        case 9 if x != null => 200
        case 10 => {
          println(s"yes $x")
          -1
        }
    }
------------------------------------------------------------------
status -> -1
 yes 10 κ°€ 좜λ ₯됨

νŒ¨ν„΄ λ³€μˆ˜λ₯Ό μ΄μš©ν•œ νƒ€μž… 맀칭

val result = y match {
	case x: String => s"'x'"
	case x: Double => ....
	case x: Float => ....
	case x: Long => ....
	case x: Int => ....
}

μœ„ μ½”λ“œμ—μ„œ 보면 case에 따라 Type이 λ‹€λ₯Έλ° resultλŠ” 이λ₯Ό λ‹€ λ°›μ„μˆ˜ μžˆλ‹€.

μ΄λŠ” μŠ€μΉΌλΌκ°€ λ‹€ν˜•μ μΈ νƒ€μž…μ„ μ§€μ›ν•œλ‹€λŠ” 것을 보여쀀닀

반볡문

for (x <- 1 to 7) println("hello scala")

μœ„ λ°˜λ³΅λ¬Έμ€ ν‘œν˜„μ‹μ΄ ν˜ΈμΆœλ˜μ§€λ§Œ λ°˜ν™˜κ°’μ—λŠ” μ ‘κ·Όν• μˆ˜ μ—†λ‹€.

μ΄λŠ” yieldλ₯Ό 톡해 ν•΄κ²°ν• μˆ˜ μžˆλŠ”λ°

for (x <- 1 to 7) yield println("hello scala")

---------------------------------------
Vector((), (), (), (), (), (), ())

반볡문 κ°€λ“œ

for (x <- 1 to 7 if x < 5) yield x

-------------------------------------------------------
Vector(1, 2, 3, 4)

반볡문 쀑첩

for { x <- 1 to 2
		 y <- 1 to 3 }
{ println(s"$x, $y") }

----------------------------------------------------------
1, 1
1, 2
1, 3
2, 1
2, 2
2, 3

λ°˜λ³΅λ¬Έμ—μ„œ κ°’ 바인딩

for (x <- 1 to 7 pow << i) yield pow

-------------------------------------------------------
Vector(1, 2, 4, 8, 16....)

while / do while

while (<λΆ€μšΈμ‹>) ν‘œν˜„μ‹

----------------------
do ν‘œν˜„μ‹ while (<λΆ€μšΈμ‹>)

while, do/while의 차이점은 λ‹€λ₯Έ μ–Έμ–΄μ—μ„œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ¨Όμ € ν•œλ²ˆμ‹€ν–‰ν•˜λƒ μ•ˆν•˜λƒμ˜ 차이이닀.

좜처 Learning Scala