변수와 데이터 타입
변수와 데이터 타입
이 섹션에서는 Scala의 변수와 데이터 타입을 살펴볼게요.
출처: Scala 3 Book
본문
두 종류의 변수
Scala에서 새 변수를 만들 때는 그 변수가 불변인지 가변인지를 선언해요.
| 변수 타입 | 설명 |
|---|---|
val |
불변 변수를 만들어요. Java의 final과 같아요. 가변 변수가 필요한 이유가 없는 한, 항상 val로 변수를 만드는 게 좋아요. |
var |
가변 변수를 만들어요. 변수의 내용이 시간에 따라 바뀌어야 할 때만 써야 해요. |
val과 var 변수를 만드는 방법은 이 예시들이 보여줘요.
Scala 2 and 3
// immutable
val a = 0
// mutable
var b = 1
애플리케이션에서 val은 재할당할 수 없어요. 재할당하려고 하면 컴파일러 오류가 나요.
Scala 2 and 3
val msg = "Hello, world"
msg = "Aloha" // "reassignment to val" error; this won't compile
반대로 var는 재할당할 수 있어요.
Scala 2 and 3
var msg = "Hello, world"
msg = "Aloha" // this compiles because a var can be reassigned
변수 타입 선언
변수를 만들 때 타입을 명시적으로 선언할 수도 있고, 컴파일러가 타입을 추론하게 할 수도 있어요.
Scala 2 and 3
val x: Int = 1 // explicit
val x = 1 // implicit; the compiler infers the type
두 번째 형태를 **타입 추론(type inference)**이라고 해요. 이런 종류의 코드를 간결하게 유지하는 데 아주 좋은 방법이에요. Scala 컴파일러는 보통 데이터 타입을 알아서 추론할 수 있는데, 아래 REPL 예시의 출력에서 그 모습을 볼 수 있어요.
Scala 2 and 3
scala> val x = 1
val x: Int = 1
scala> val s = "a string"
val s: String = a string
scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)
원한다면 항상 변수의 타입을 명시적으로 선언할 수 있어요. 다만 이런 단순한 대입에서는 그럴 필요가 없어요.
Scala 2 and 3
val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")
이 방식으로 쓰면 코드가 필요 이상으로 장황해 보이는 걸 알 수 있어요.
내장 데이터 타입
Scala는 기대하는 표준 숫자 데이터 타입을 모두 제공하며, 이들은 전부 완전한 클래스의 인스턴스예요. Scala에서는 모든 것이 객체예요. 숫자 타입의 변수를 선언하는 방법은 아래 예시들이 보여줘요.
Scala 2 and 3
val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0
Int와 Double이 기본 숫자 타입이기 때문에, 보통은 데이터 타입을 명시적으로 선언하지 않고 만드는 게 일반적이에요.
Scala 2 and 3
val i = 123 // defaults to Int
val j = 1.0 // defaults to Double
숫자에 L, D, F 문자(소문자 동일)를 붙여서 Long, Double, Float 값임을 지정할 수도 있어요.
Scala 2 and 3
val x = 1_000L // val x: Long = 1000
val y = 2.2D // val y: Double = 2.2
val z = 3.3F // val z: Float = 3.3
정말 큰 숫자가 필요할 때는 BigInt와 BigDecimal 타입을 써요.
Scala 2 and 3
var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)
Double과 Float는 근사적인 십진수인 반면, BigDecimal은 정밀한 산술 연산에 사용해요.
Scala에는 String과 Char 데이터 타입도 있어요.
Scala 2 and 3
val name = "Bill" // String
val c = 'a' // Char
문자열 (Strings)
Scala 문자열은 Java 문자열과 비슷하지만, 훌륭한 추가 기능이 두 가지 있어요.
- 문자열 보간(string interpolation)을 지원한다.
- 여러 줄 문자열을 만들기 쉽다.
문자열 보간
문자열 보간은 문자열 안에서 변수를 사용하는 아주 읽기 쉬운 방법을 제공해요. 예를 들어 다음 세 변수가 있다고 할게요.
Scala 2 and 3
val firstName = "John"
val mi = 'C'
val lastName = "Doe"
이 변수들을 문자열 안에서 이렇게 조합할 수 있어요.
Scala 2 and 3
println(s"Name: $firstName $mi $lastName") // "Name: John C Doe"
문자열 앞에 문자 s를 붙이고, 문자열 안의 변수 이름 앞에 $ 기호를 붙이면 돼요. 문자열 안에 임의의 표현식을 넣으려면 중괄호로 감싸면 돼요.
Scala 2 and 3
println(s"2 + 2 = ${2 + 2}") // prints "2 + 2 = 4"
val x = -1
println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
문자열 앞에 붙이는 s는 가능한 인터폴레이터(interpolator) 중 하나일 뿐이에요. s 대신 f를 쓰면 문자열 안에서 printf 스타일의 형식 지정 문법을 쓸 수 있어요. 게다가 문자열 인터폴레이터는 그저 특별한 메서드라서 직접 정의할 수도 있어요. 예를 들어 일부 데이터베이스 라이브러리는 매우 강력한 sql 인터폴레이터를 정의해요.
여러 줄 문자열
여러 줄 문자열은 문자열을 큰따옴표 세 개로 감싸면 만들어져요.
Scala 2 and 3
val quote = """The essence of Scala:
Fusion of functional and object-oriented
programming in a typed setting."""
문자열 인터폴레이터와 여러 줄 문자열에 대한 자세한 내용은 "A First Look at Types" 장을 참고하세요.