변수와 데이터 타입

변수와 데이터 타입

이 섹션에서는 Scala의 변수와 데이터 타입을 살펴볼게요.

출처: Scala 3 Book

본문

두 종류의 변수

Scala에서 새 변수를 만들 때는 그 변수가 불변인지 가변인지를 선언해요.

변수 타입 설명
val 불변 변수를 만들어요. Java의 final과 같아요. 가변 변수가 필요한 이유가 없는 한, 항상 val로 변수를 만드는 게 좋아요.
var 가변 변수를 만들어요. 변수의 내용이 시간에 따라 바뀌어야 할 때만 써야 해요.

valvar 변수를 만드는 방법은 이 예시들이 보여줘요.

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

IntDouble이 기본 숫자 타입이기 때문에, 보통은 데이터 타입을 명시적으로 선언하지 않고 만드는 게 일반적이에요.

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

정말 큰 숫자가 필요할 때는 BigIntBigDecimal 타입을 써요.

Scala 2 and 3

var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)

DoubleFloat는 근사적인 십진수인 반면, BigDecimal은 정밀한 산술 연산에 사용해요.

Scala에는 StringChar 데이터 타입도 있어요.

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" 장을 참고하세요.

더 알아보기 (Learn more)