ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스칼라 문법편] CH02 변수 다루기
    레거시/레거시-누구나 쉽게 스칼라+플레이 2019. 1. 28. 22:16
    반응형

    * 이 포스팅은 책 "누구나 쉽게 스칼라+플레이 - 고락윤 한빛 미디어"를 읽고 필자가 정리한 것입니다.

    CH02 변수 다루기

    01. 변수 선언



    "컴파일러야 3 보이지? 알아서 맞는 자료형 주고 알아서 메모리 공간 확보해놔. 알아서 해!"


    이전 장에서 간략하게 살펴봤던 것처럼 보통 기존의 C, Java 등의 프로그래밍 언어는 자료형을 선언한 후에, 변수 명을 선언해주었습니다. 이렇게 말이죠.

    int a = 5;
    final String b = "바뀔 수 없어요.";


    스칼라에서는 이렇게 바꿀 수 있습니다. 참고적으로 var 는 바뀔 수 있는 변수를 선언하는 것이고, val은 final 자료형 처럼 바뀔 수 없는 변수를 선언하는 것입니다.

    var a: Int = 5;
    val b: String = "바뀔 수 없어요!"


    그런데 말입니다~ 스칼라는 자료형 선언을 제거할 수 있어요. 컴파일러가 똑똑하기 때문에, 컴파일러가 대입되는 값을 읽어 자료형을 추론하기 떄문이죠. 다음의 코드처럼 바꿀 수 있답니다.

    var a = 5
    val b = "바뀔 수 없어요!"


    어때요? 스크립트 언어처럼 느껴지지 않나요? 여기서 중요한 점은, 스칼라는 변수 선언 시, 값의 초기화도 이루어져야 합니다. 때문에 아무런 값이 없을 때 다음의 2가지 방식으로 초기화할 수 있습니다.

    var a = null
    var b = None


    책에 따르면, 보통 null 보단 None 키워드가 자주 쓰인다고 합니다. 또한 null과 None은 val 과는 자주 쓰이지 않습니다. 왜냐하면, 계속 None 상태가 유지되는 것은 거의 없기 때문이죠.

    02. 기본 자료형


    자 스칼라의 변수 선언에 대해 알아보았으니, 자료형에 대해서 알아보도록 하죠. 스칼라의 자료형은 보통 다음과 같이 나눌 수 있습니다.

    1. Any
    1. AnyVal
        1. Byte
        2. Short
        3. Int
        4. Long
        5. Char
        6. Boolean
        7. Unit (Unit의 경우 특정한 값을 나타내지는 않고, 비어 있습니다)
        8. String (엄밀히 말하면, AnyRef 이지만, 동작이 AnyVal 과 유사합니다.)
    2. AnyRef
        1. 내장 클래스 객체
        2. 사용자 정의 클래스 객체
    


    먼저 살펴볼 것은, AnyVal 자료형들입니다. 다른 언어들에서는 Primitive Data Type 즉 기본 자료형으로 쓰입니다. 동작 역시 같습니다. 값을 복사해서 변수에 대입하는 형식이죠. 무슨 말이냐면, 다음의 코드를 봅시다.

    var a = 10
    var b = a
    a = 7
    println(a)
    println(b)


    이 코드의 출력 값은 다음과 같습니다.

    7
    10
    


    값을 복사해서 변수의 저장한다는 것은 즉, a, b 는 서로 영향을 주지 않는다는 것입니다. 다음은 기본 AnyVal 자료형들의 크기와 범위를 나타내는 표입니다.

    자료형크기범위
    Byte1 Byte-2 ^ 7 ~ 2 ^ 7 - 1
    Short2 Byte-2 ^ 15 ~ 2 ^ 15 - 1
    Int4 Byte-2 ^ 31 ~ 2 ^ 31 -1
    Long8 Byte-2 ^ 63 ~ 2 ^ 63 - 1
    Float4 Byte1.4E-45 ~ 3.40E38
    Double8 Byte4.9E-324 ~ 1.79E308
    Boolean1 Bytetrue or false
    String가변문자열 Char의 연속


    03. 참조 자료형


    참조 자료형은, 위에서 보시다시피 크게 내장 클래스 객체, 사용자 정의 클래스 객체가 있습니다. 내장 클래스 객체는 List 등의 컬렉션 클래스들 과 같이 내장 라이브러리에 존재하는 클래스로 만드는 객체들이고 사용자 정의 클래스 객체는 직접 사용자가 모델링해서 만든 클래스의 객체들을 말합니다. 이들은 값을 복사하는 것이 아닌 참조값을 복사해서 변수에 대입합니다. 예를 들어 사용자 정의 클래스 Car가 있다고 가정하겠습니다. 다음의 코드가 있다고 합시다.


    val a = new Car("벤츠")
    val b = a
    
    a.setName("타요")
    
    println(a)
    println(b)


    이렇게 했을 때 출력 값은 다음과 같습니다.(여기서 Car의 toString은 Car[name=$name] 이라고 가정합니다.)


    Car[name=타요]
    Car[name=타요]
    


    분명 a의 이름을 바꿨는데, b의 이름 역시 변경되었습니다. 이렇게 된 이유는, a, b 모두 객체의 참조 값을 가리키고 있기 때문입니다. 즉 참조 자료형의 값을 분리시키려면 기존 객체의 값을 토대로 객체를 새로 만들어주어야 합니다. 클래스와 객체에 대한 내용은 추후에 다시 설명하도록 하겠습니다.

    한가지만, 더 살펴보도록 하죠. 스칼라에서는 type 예약어를 사용할 수 있습니다. C 나 C++ 의 경험이 있으시다면, typedef 예약어를 떠올리시면 됩니다. 쉽게 말해서 type 예약어는 해당 자료형을 다른 이름으로 부를 수 있게 만들어줍니다. 다음의 예제를 살펴봅시다.

    type Nmae = String
    
    val a: Name = "A" 
    val b: String = "B"


    위 코드는 실제로 2개의 String 변수를 만드는 것이지만 사람이 보았을 때, Name, String형의 자료를 각각 하나씩 만들었다라고 볼 수 있습니다. 기존 자바였다면, String 을 필드로 갖는 Name 클래스로 만들었어야 했지만, 스칼라에서는 보다 간편하게 타입을 사용할 수 있게, 이러한 키워드를 지원합니다. 실제로 튜플 자료형이나, 함수 타입 역시, 보기 편하게 type 키워드를 사용하여 별칭을 만들 수 있습니다. 다음처럼 말이죠.


    type Person = (String, Int)
    type FType = String => Int //함수 표현 식


    자 이번 장의 내용은 여기까지입니당~ 어떠신가요> 더 배워보고 싶다면, 다음 장 조건문과 반복문에서 만나요~!

Designed by Tistory.