티스토리 뷰

728x90
반응형

 

오늘은 2장 스칼라 첫걸음을 학습해 보도록 하겠습니다.

이번장과 다음장 3장까지 스칼라의 전반적인 내용을 살펴 봅니다.

간단하게 알고 넘어가지 좋은 부분이니 가벼운 마음으로 학습해 보겠습니다.

 


 

1단계: 스칼라 인터프리터 사용법을 익히자

 

스칼라 인터프리터란?

스칼라 표현식과 프로그램을 쓸 수 있는 대화형 셸(Shell)로, 스칼라의 대화형 셸은 scala라고 부릅니다.

 

scala> 1 + 2

res0: Int = 3

 

  • 계산 결과 값의 이름은 res0으로 0번째 결과라는 뜻
  • 결과의 타입 → Int
  • 입력 표현식을 계산해서 얻은 결과값 → 3
Int 타입은 scala 패키지의 Int 클래스를 의미합니다.

 

 

'res번호' 식별자(identifier)는 나중에 재사용할 수 있습니다.

아래 예시에서 확인할 수 있습니다.

scala> res0 * 3

res1: Int = 9

 

 


2단계 : 변수를 정의해 보자.

  • val : 자바의 final 변수와 비슷하고, 다시 할당할 수 없습니다.
  • var : 재할당이 가능합니다.

 

scala> val msg = "Hello, world!"

msg: String = Hello, world!

 

스칼라는 문자열을 자바 String클래스로 구현합니다. → java.lang.String

스칼라는 사용자가 입력하지 않은 Type을 알아낼 수 있습니다. 이를 타입 추론이라 합니다.

변수 이름 앞에 타입을 지정하는 자바와 달리, 스칼라는 변수 이름 뒤에 콜론으로 분리해서 타입을 적습니다.

scala> val msg2: java.lang.String = "Hello again, world!"
msg2: String = Hello again, world!
 
scala> val msg3: String = "Hello yet again, world!" // 간단하게 변수 이름 사용 가능
msg3: String = Hello yet again, world!

 

이제, msg객체에 재할당을 시켜봅시다다. 에러가 발생할 것입니다.

scala> msg = "Goodbye cruel world!"
           ^
       error: reassignment to val

 

변수를 재할당 하고 싶다면 var 변수를 사용해야 합니다.

scala> var greeting = "Hello, world!"
greeting: String = Hello, world!
 
scala> greeting = "Leave me alone, world!"
greeting: String = Leave me alone, world!

 

만약, 무엇인가 잘못 입력했다면 인터프리터는 계속해서 기다리게 됩니다.
이럴경우 엔터를 두 번 눌러서 해결하면 됩니다.
참고적으로, 스칼라에서는 var을 사용하여 재할당 하는 것보다 val을 사용하길 권장하고 있습니다.
특별한 경우가 아니라면 val을 사용하는 습관을 들여보도록 합시다.

 

 


3단계 : 함수를 정의해보자.

 

이번에는 스칼라에서 함수를 작성하는 방법에 대해 알아봅시다.

scala> def max(x: Int, y: Int): Int = {
           if (x > y) x
           else y
       }
 
max: (x: Int,y: Int): Int

 

함수 정의는 def로 시작합니다.

이후 함수이름(max), 괄호 안에 파라미터 목록이 옵니다.

스칼라 컴파일러가 파라미터 타입은 추론하지 않기 때문에 모든 파라미터에는 타입 지정을 반드시 수행해야 합니다.

 

파라미터 목록 뒤 콜론 이후에는 결과 타입을 정의합니다.

이후 등호(=), 중괄호({})가 오고, 중괄호 안에는 함수의 본문이 들어가게 됩니다.

마지막에 return 등의 반환 명령어는 주로 생략합니다.

중괄호를 생락하고 한 줄로 작성해도 무방합니다.

스칼라는 세미콜론(;)을 사용해서 문장을 구분하지만 이를 생략해도 되는 경우가 흔합니다.

 

 

* 참고

파라미터(parameter) 인자(argument)를 가능하면 구분하여 사용하길 권장합니다.
 - 파라미터(형식 인자(formal parameter), 매개변수) : 함수 본문에서 함수가 전달받은 값을 가리킬 때 사용하는 이름(x, y)
 - 인자(실인자(actual parameter)): 함수를 호출하면서 실제로 함수에 넘기는 값(3, 5)

 

 

스칼라의 함수에서 결과 타입은 지정하지 않아도 되지만(지정하는 것을 권장) 함수가 재귀적이라면 결과 타입을 반드시 명시해야 합니다.

결과 타입이 없는 함수의 예시입니다.

 

scala> def greet() = println("Hello, world!")
greet: ()Unit

 

빈 괄호는 함수의 파라미터가 아무것도 없음을 의미합니다.

Unit이라는 결과 타입은 함수가 값을 반환하지 않는다는 뜻입니다.

java의 void타입과 비슷하며, 실제로도 자바에서 void를 반환하는 메소드는 스칼라에서 모두 Unit으로 반환합니다.

 

 


4단계 : 스칼라 스크립트를 작성해보자.

스칼라 스크립트의 확장자는 .scala 입니다.

예시를 하나 확인해 보도록 하겠습니다.

 

// script1.scala
println("Hello, world, from a script!")
$ scala script1.scala
Hello, world, from a script!

 

스칼라 스크립트는 args라는 스칼라 배열에 인자를 받습니다.

스칼라 배열에서의 첫번째 원소는 args[0]이 아닌 args(0)으로 표현합니다.

예시를 확인해 봅시다.

 

// script2.scala
println("Hello, " + args(0) + "!") //script2.scala
$ scala script2.scala planet
Hello, planet!

여기에서는 planet을 명령형 인자로 받아서 이 인자를 arg(0)으로 받았습니다.

 

 


5단계 : while로 루프를 돌고, if로 결정해보자.

while을 사용한 예시는 다음과 같습니다.

하지만 scala에서는 while 보다는 뒤의 foreach 등을 자주 사용합니다.

// script4.scala
var i = 0
while (i < args.length) {
  println(args(i))
  i += 1
}
$ scala script4.scala Scala is fun
Scala
is
fun

 

 

결과를 한 줄로 표현하는 예제 입니다.

// script5.scala
var i = 0
while (i < args.length) {
  if (i != 0)
    print(" ")
  print(args(i))
  i += 1
}
print()
$ scala script5.scala Scala is even more fun
Scala is even more fun

 

 


6단계 : foreach와 for를 사용해 이터레이션 해보자.

 

사실, 5단계의 while을 사용한 스크립트는 명령형 스타일 입니다.

* 명령형 스타일

작동을 지시하는 명령을 한 번에 하나씩 사용하고, 루프로 이터레이션하면서 다른 여러 함수 사이에 공유하는 상태를 변경하는 것으로 보통 자바, C++, C 등에서 사용하는 프로그래밍 방식입니다.

 

 

이 절에서는 함수형 스타일을 적극 사용해 봅시다.

// script4.scala
args.foreach(arg => println(arg))
$ scala script6.scala Concise is nice
Concise
is
nice

 

해당 코드는 args에 있는 foreach 메서드를 호출하고, 인자로 함수를 넘깁니다.

여기서는 arg라는 파라미터를 받는 함수 리터럴(function literal)을 사용합니다.

 

arg의 타입을 지정해주고 싶다면 다음과 같이 사용하면 됩니다.

args.foreach((arg: String) => println(arg))

 

함수 리터럴이 인자를 하나만 받는 문장인 경우, 해당 인자에 이름을 붙일 필요가 없습니다.

훨씬 간결해진 것을 확인할 수 있습니다.

args.foreach(println)

 

함수 리터럴 문법

 

for 문을 사용한 스크립트를 작성해 봅시다.

for (arg <- args)
  println(arg)
$ scala script7.scala arg in args
arg
in
args

 

arg는 반드시 val 입니다.

따라서 for문의 본문에서 arg를 재할당할 수 없습니다.

 

 

Tip!

실제로 스칼라는 함수형이기 때문에 if와 null 사용을 최대한 지양하는 것이 좋다고 합니다.
스칼라에서는 nul 대신 None을 더욱 많이 사용합니다.

그리고 for를 사용하는 것보다 foreach를 사용하는 것을 선호합니다.

 

 

 

다음장은 아래에서 학습할 수 있습니다!

 

[Scala] Programming in Scala - 3장. 스칼라 두 번째 걸음

오늘은 2장에 이어 스칼라 두번째 걸음을 학습해 보자. 이번장에서는 배열과 튜플같은 자료형을 익히고 함수형 스타일을 알아보는 시간 같다. 2,3 장을 한번 훑어보고 뒤에서 더욱 자세히 배워

icandhee.com

 

 


[참고 도서]

 

  • Programming in Scala

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31