2020.08 To Do List
스칼라의 변수 선언 키워드는 val
와 var
2가지 종류가 있다. val
키워드는 Java의 변수와 유사하며, **한번 선언 후, 초기화(Initialized)**하면 수정(재할당, reassigned)이 불가능하다. var
키워드로 선언한 변수는 수정이 가능하다.
val msg: java.lang.String = "Hello, World!"
print(msg) // Hello, World!
// but Can`t Modify
msg = "Hello, Scala World!"
// Occur Error.
// error: reassignment to val
var msg1: String = "Hello, World!"
print(msg1)
// print "Hello, World!"
msg1 = "Hello Scala World!"
print(msg1)
// print "Hello Scala World!"
변수 선언 시, 명백하게 변수의 타입을 선언하지 않아도 스칼라 인터프리터는 변수의 타입을 추론하여 자동으로 변수의 타입을 할당 해준다. 보통 변수의 타입을 선언하지 않는 것이 불필요한 코드를 줄여 깔끔한 코드를 만들 수 있지만, 종종 명확하게 타입을 선언해야 하는 경우도 있을 것이다.
val msg2 = "Scala Is Good"
--> msg2: String = Scala Is Good
msg2.isInstanceOf[String]
--> msg2: Boolean = True
val msg3 = 1
--> msg3: Int = 1
msg3.isInstanceOf[Int]
--> msg3: Boolean = True
함수의 선언은 def
키워드를 사용한다. 모든 함수의 파라미터의 타입(Type)을 무조건 선언해야 한다. 1개 이상일 경우는 콤마(,)로 구분 한다. 스칼라 인터프리터는 함수의 파라미터 타입은 추론 하지 않기 때문에 무조건 정의를 해줘야 한다.
max는 함수의 이름이고, 괄호 안에 있는 목록은 max함수에서 사용하는 파라미터의 목록이며, : Int
부분이 max함수의 result type을 가리키면 함수의 몸체(Body)와 =(equal) 같다라는 의미를 가진다.
def max(x: Int, y: Int): Int = {
if(x>y) x
else y
}
스칼라 인터프리터는 함수의 result type도 추론 가능하기 때문에 result type을 생략하고 함수를 선언 할 수 있다. 하지만, 재귀 함수(Recursive Function) 일 경우에는 명확하게 result type를 정의 해줘야 한다.
def max(x: Int, y: Int) = {
if(x>y) x
else y
}
스칼라도 자바와 마찬가지로 람다식을 제공하고 있기 때문에 람다식 표현으로 함수를 정의 할 수 있다.
val add = (x: Int, y: Int) => {
x + y
}
// add: (Int, Int) => Int = <function2>
var add1 = (x: Int, y: Int) => {
x + y
}
add(1,2)
// res32: Int = 3
함수의 result type이 없는 경우에는 Unit타입을 가지며, "리턴 값이 없다"라는 것을 가리킨다. Java의 void 타입과 유사하다고 볼 수 있다.
val greet = () => {
print("Hello Greeting")
}
greet: () => Unit = <function0>
스칼라는 명령형(imperative)과 함수형(functional) 프로그래밍 방식 둘 다 사용 할 수 있다. 반복구문을 작성할 때 명령형 프로그래밍보다는 함수형 스타일로 선언하는 것이 더 효율적이고 보기 좋다.
첫번째 코드는 명령형 스타일로 리스트형 데이터를 출력하는 코드이며, 두번째 코드는 함수형 스타일로 리스트형 데이터를 출력하는 코드이다.
var args: List[String] = List()
args = args :+ "Scala"
args = args :+ "is"
args = args :+ "Good"
// 1. Imperative style
var i = 0;
while(i < args.length){
println(args(i))
i += 1;
}
// 2. Function style
args.foreach((arg) => println(arg))
// If a function literal consists of one statement that takes a single argument,
// you need not explicitly name and specify the argument
args.foreach(println)
node.js나 java의 람다식 표현처럼 사용하면 된다. 스칼라에서만 적용되는 한가지 심플한 문법이 한가지 있다. 파라미터가 1개이며, 함수 바디에 한 문장으로 구성되면 파라미터의 이름과 함수 바디에 사용되는 매개변수 이름을 선언하지 않아도 된다.