[Scala] 기본 타입과 연산

smlee·2023년 8월 8일
0

Scala

목록 보기
5/37
post-thumbnail

이 글은 Programming in Scala 4/e를 읽고 정리한 글입니다.

기본타입


스칼라의 기본 타입과 각 타입이 취할 수 있는 값의 범위는 Java와 유사하다.
위 이미지의 AnyVal에 해당하는 타입들이다.

java.lang 패키지에 있는 String을 제외하면 모든 타입은 scala 패키지의 멤버이다.
Java와 Scala의 기본 타입의 범위가 상응하는 자바 타입 범위와 정확히 일치하므로 스칼라 컴파일러는 스칼라값 타입의 인스턴스를 바이트코드로 만들 때 자유롭게 자바의 원시 타입으로 변환할 수 있다.

리터럴 (literal)

위의 기본 타입의 표에 적혀 있는 모든 타입들은 리터럴로 적을 수 있다.

리터럴(literal)
리터럴은 상숫값을 코드에 직접 적는 방법을 뜻한다.

(1) 정수 리터럴

정수 리터럴은 정수 타입(Integer Type)인 Byte, Short, Long, Int, Char 중 Char를 제외한 모든 정수 타입에 적용된다. 정수 리터럴은 10진 리터럴16진 리터럴이 존재한다.

수가 0x0X로 시작하면 16진수이다.

위와 같이 0x로 시작하는 정수 리터럴들은 scala에서 Int형이며, 16진수인 것을 확인할 수 있다. 이때 주의해야 할 점은, 정수를 초기화하기 위해 리터럴에 사용한 진법과 관계없이 스칼라는 항상 밑을 10으로 하는 정수를 출력해준다는 점이다. 즉, 위의 캡쳐본처럼 16진수로 초기화를 했더라도 출력을 할 때는 10진수로 출력하는 것이다.

(2) 부동소수점 리터럴

부동소수점 리터럴은 십진 숫자들로 이루어진다. 소수점이 있을 수 있으며, 마지막에 Ee 다음에 지수 부분이 있을 수 있다.

위를 부동소수점 리터럴의 예시를 나타낸 것이다. 여기서 눈에 띄는 점은 eE를 사용한 부분, 즉 10의 n승en 혹은 En (이때, n은 정수) 형태로 나타낸 것이다. 즉, 위의 예시의 bigger은 1.2345e1 == 1.2345 * 10^1이므로 위와 같이 12.345를 출력하는 것이다.


또한, 숫자 뒤에 Ll을 붙이면 Long 타입으로 할당된다. 이는 C나 C++에서 사용하는 방식과 같다.

(3) 문자 리터럴

문자 리터럴은 작은 따옴표 안에 유니코드 문자를 넣어서 만든다.

작은 따옴표 사이에 실제 문자를 넣어도 되고, 문자를 유니코드 코드 포인트(unicode code point)를 사용해 지정할 수 있다. 그렇게 하려면 위의 예시처럼 \u 다음에 4자리 16진수를 넣으면 된다.

(4) 심볼 리터럴

심볼 리터럴은 'ident처럼 쓴다. 즉, 작은 따옴표 뒤에 오는 식별자 부분은 알파벳과 숫자를 혼합한 올바른 식별자라면 아무거나 가능한 것이다. 스칼라 컴파일러는 위의 예시인 'identSymbol("ident")이라는 팩토리 메서드로 호출한다.

문자열 인터폴레이션

스칼라는 문자열 인터폴레이션(interpolation)을 위한 유연한 매커니즘을 포함한다. 즉, 문자열 인터폴레이션을 사용하면 문자열 리터럴 내부에 표현식을 내장시킬 수 있는 것이다.

위와 같이 문자열을 이어 붙이는 대신 문자열 내부에서 외부 변수를 넣을 수 있다.

스칼라는 s 외에 fraw라는 인터폴레이터를 제공한다.

1. s

s 인터폴레이터를 냊아된 각 표현식을 평가하고, 그 결과에 대해 toString을 호출한 다음, 내장된 표현식을 toString의 결과로 대치해준다.

2. raw

raw 문자열 인터폴레이터를 사용하면 문자열 이스케이프 시퀀스를 인식하지 못한다. 즉, 위에서 역슬래시가 4개이면 원래대로라면 2개의 역슬래시를 출력할 것이다. (위쪽의 명령어) 하지만 raw를 사용하면 밑의 명령어처럼 이스케이프 시퀀스로 인식하지 않고 문자열 그대로로 인식하여 출력한다.

3. f

f 문자열 인터폴레이터를 사용하면 printf 스타일 형식을 지정할 수 있다.

위의 예시처럼 %.2f와 같이 printf에서 사용하는 인터폴레이터를 사용하여 원하는 형식으로 값을 불러올 수 있다.

객체 동일성

두 객체가 같은지 비교하고 싶다면 ==를 사용하며, 같지 않은지를 비교하려면 !=를 사용한다. 스칼라의 ==는 자바의 ==와 다르다. Java에서는 ==를 사용해 참조 타입과 원시 타입을 비교할 수 있다. 즉, 자바의 ==는 원시 타입에서 값이 같은지를 비교한다. 하지만, 참조 타입에서의 자바 ==는 JVM 힙에서 같은 객체를 가리키는지 비교한다.

스칼라도 참조 동일성을 검사하는 기능이 존재하지만, eq가 그 기능을 담당한다.

📚 Reference

0개의 댓글