2. 스칼라 첫걸음

dev.jhjhj·2021년 5월 24일
0

Scala

목록 보기
1/10

2.1 스칼라 인터프리터 사용법

2.1.1 스칼라 설치

https://www.scala-lang.org/download (Java 8 JDK, Java 11 JDK 설치 필수)
IDE Plugin 설치

2.1.2 스칼라 인터프리터

스칼라 인터프리터 : 스칼라 표현식과 프로그램을 쓸 수 있는 대화형 셸 (Shell), 스칼라의 대화형 셸은 'scala'라고 부른다.

스칼라 인터프리터를 사용하는 방법

C:\>scala
Welcome to Scala 2.13.5 (OpenJDK 64-Bit Server VM, Java 1.8.0_282).
Type in expressions for evaluation. Or try :help.

scala>
scala> 1+2
res0: Int = 3
res0은 스칼라 인터프리터가 자동으로 생성하주는 이름 (0번째 결과 result 라는 뜻)

콜론( : ) 뒤에 결과의 타입(여기서는 Int)를 정의

스칼라 패키지는 전역 네임스페이스를 분할해준다는 점에서 자바 패키지와 비슷하다.
(ex. java.lang.util..)
자바의 모든 원시타입(primitive type)은 스칼라 패키지에 대응하는 클래스가 있다.
ex ) java : boolean / scala : scala.Boolean

scala> res0 * 3
res1: Int = 9

'res번호' 식별자(Identifier)는 다음과 같이 변수로 사용할 수 있다.

scala> println("Hello, World!")
Hello, World!

println 함수는 문자열을 출력한다. (자바의 System.out.println과 유사)

2.2 변수 정의

2.2.1 var 와 val

val : 불변한 (immutable) 변수, 자바의 final 과 유사
var : 가변(mutable) 변수, 재할당 가능

scala> val msg = "Hello, World !"
val msg: String = Hello, World !

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

Scala 는 Java 라이브러리를 기반하며, scala 파일 (* .scala)은 자바 클래스 바이트 코드로 컴파일되어 JVM 에서 실행 된다.

하지만, Scala는 Java와는 다르게 static이라는 키워드가 없다. 

대신  Scala에 object 객체를 만들어 필드와 메소드를 구현한다면, Java의 static 키워드를 사용한 것과 같이 구현하여 메모리를 할당한다. 

참고 링크 : https://stackoverflow.com/questions/34349871/how-memory-allocation-takes-place-in-scala

ex )스칼라 class A

class A{  
    val arg1=1
    def myFun(arg2:Int)=arg1
}

javap를 사용하여 바이트코드를 decompile한 class A

public class A extends java.lang.Object{
    private final int arg1;
    public int arg1();
    public int myFun(int);
    public A();
}

ex ) 스칼라 object A

object A{
    val arg1=1
    def myFun(arg2:Int)=arg1
}

javap를 사용하여 바이트코드를 decompile한 object A

public class A$ extends java.lang.Object{
    public static final A$ MODULE$;
    private final int arg1;
    public static {};
    public int arg1();
    public int myFun(int);
    public A$();
}

2.2.2 타입추론

scala> val msg = "Hello, World!"
msg: String = Hello, World!

타입을 명시하지 않았지만, 스칼라 인터프리터가 String 타입으로 타입을 추론한다.

2.3 함수 정의

함수 정의는 def 로 시작한다. 

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

2.3.1 스칼라 함수 정의의 기본 형식

스칼라 컴파일러가 파라미터의 타입을 추론하지 않기 때문에 파라미터 타입을 명시해줘야 한다.

함수 결과 타입은 생략해도 되지만, 함수가 재귀적이라면 결과 타입을 반드시 명시해야만 한다.

2.3.2 스칼라 함수의 리터럴 문법 (중괄호 생략)

함수 내용이 한문장이라면, 다음과 같이 중괄호를 생략하여 작성할 수 있다. 
def max(x: Int, y: Int) = if (x>y) x else y

2.3.3  Unit()

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

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

2.4 스칼라 스크립트 작성

2.4.1 스칼라 확장자

스칼라 파일의 확장자는 scala 이다.
스칼라는 스크립트의 각 문장을 파일에 있는 순서대로 순서대로 실행한다. 

2.4.2. 명령행 인자 arg

스칼라 스크립트는 arg 라는 스칼라 배열에 명령행 인자를 받는다.
스칼라 배열은 0 부터 시작하여, index를 괄호 안에 넣어서 배열의 원소에 접근이 가능하다. 대괄호 [] 가 아닌 괄호() 를 사용한다. 

$ scala helloarg.scala planet
Hello, planet!

2.4.3 주석 

한줄 주석은 //
여러 줄에 걸쳐서 //  사이의 문자들을 무시
val msg = "Hello, Scala"
// 한줄 주석 사용

/
여러 줄에 걸쳐서 사용하고
싶을 때는 다음과 같이 사용한다.
/

2.4.4 String과 + 연산자

String은 + 연산자로 이어붙일 수 있다.
scala> val msg = "Hello, " + "world!"
val msg: String = Hello, world!

2.5 While 문, if문

val arr = List("Scala", "is", "Fun", "!!!!!")  // 문자열 리스트 생성

var i = 0
while (i < arr.length) {
	println(arr(i))
	i += 1  // scala에서는 i++ ++i를 사용 할 수 없다.
}

// 결과
// Scala
// is
// Fun
// !!!!!

2.6 foreach와 for 이터레이션

2.6.1 foreach

앞서 작성한 while 루프는 명령형 스타일, 보통 자바, C++, C 등에서 사용하는 프로그래밍 방식(작동 지시를 하나하나 명령하는 방식)

스칼라는 함수형(Functioanl) 스타일로 프로그래밍이 가능

val msg= List("Scala", "is", "nice")
msg.foreach(str => println(str))

// msg에 있는 foreach 메소드를 호출하여 str인자로 값을 넘긴다.
str에 문자열을 받았기 때문에 스칼라 인터프리터는 String으로 타입추론을 한다. 타입을 명시적으로 작성할 수도 있다.

val msg= List("Scala", "is", "nice")
msg.foreach((str: String) => println(str))

인자를 하나만 받는다면, 축약형으로 작성할 수 있다. foreach 메소드에 해당 인자 이름을 붙일 필요가 없다. 

val msg= List("Scala", "is", "nice")
msg.foreach(println)

2.6.2. for

for (arg <- args)
println(arg) // 여기서 arg는 val 타입이다. (불변)
for 루프를 돌 때마다 arg에 새 값이 들어가기 때문에 arg가 var 처럼 보일 수 있는 데,

실제로는 val (불변)이기 때문에 for 본문에서 값을 재할당할 수 없다. 

profile
어제보다 더 나은

0개의 댓글