Tour of Scala

클래스

Language

스칼라의 클래스는 객체를 만들기 위한 설계도입니다. 클래스에는 멤버 라고 통칭할 수 있는 메서드, 값, 변수, 타입, 객체, 트레잇, 클래스를 포함할 수 있습니다. 타입, 객체, 트레잇은 투어에서 나중에 다루겠습니다.

클래스 정의

가장 단순한 클래스 정의는 예약어 class와 식별자만 있는 것입니다. 클래스명은 대문자로 시작하는 것이 관례입니다.

class User

val user1 = new User

예약어 new는 클래스의 인스턴스를 만들기위해 사용합니다. User 클래스는 생성자를 정의하지 않았기 때문에 인자가 없는 기본 생성자를 갖습니다. 생성자와 클래스 몸체를 정의하고자 한다면, 다음의 클래스 정의 예제를 참고하십시오:

class Point(var x: Int, var y: Int) {

  def move(dx: Int, dy: Int): Unit = {
    x = x + dx
    y = y + dy
  }

  override def toString: String =
    s"($x, $y)"
}

val point1 = new Point(2, 3)
point1.x  // 2
println(point1)  // prints (2, 3)

Point 클래스에는 네 개의 멤버가 있습니다: 변수 x, y와 메서드 move, toString. 많은 다른 언어와 달리 기본 생성자는 클래스 서명부(signature)에 있습니다 (var x : Int, var y : Int). move 메소드는 두 개의 정수 인자를 취하여 정보를 전달하지 않는 Unit 타입의 값 ()을 반환합니다. 이것은 자바 같은 언어의 void와 유사합니다. 반면에 toString은 인자를 취하지 않고 String 값을 반환합니다. toStringAnyReftoString을 대체하므로 override 예약어로 지정됩니다.

생성자

생성자는 다음과 같은 기본 값을 제공하여 선택적 매개변수를 가질 수 있습니다:

class Point(var x: Int = 0, var y: Int = 0)

val origin = new Point  // x and y are both set to 0
val point1 = new Point(1)
println(point1.x)  // prints 1

이 버전의 Point 클래스에서 xy 인자는 기본 값 0을 가지므로 인자를 꼭 전달하지 않아도 됩니다. 생성자는 인자를 왼쪽부터 읽으므로 y 값만 전달하고 싶다면 매개변수의 이름을 지정해야 합니다.

class Point(var x: Int = 0, var y: Int = 0)
val point2 = new Point(y=2)
println(point2.y)  // prints 2

이것은 명료성 향상을 위한 좋은 습관이기도 합니다.

Private 멤버와 Getter/Setter 문법

멤버는 기본적으로 public으로 지정됩니다. private 접근 지시자를 사용함으로써 클래스 외부로부터 멤버를 숨길 수 있습니다.

class Point {
  private var _x = 0
  private var _y = 0
  private val bound = 100

  def x = _x
  def x_= (newValue: Int): Unit = {
    if (newValue < bound) _x = newValue else printWarning
  }

  def y = _y
  def y_= (newValue: Int): Unit = {
    if (newValue < bound) _y = newValue else printWarning
  }

  private def printWarning = println("WARNING: Out of bounds")
}

val point1 = new Point
point1.x = 99
point1.y = 101 // 경고가 출력됩니다

이 버전의 Point 클래스에서는 데이터가 private 변수 _x_y에 저장됩니다. 이 private 데이터에 접근하기 위한 메서드 def xdef y가 있고, _x_y 값을 검증하고 설정하기위한 def x_=def y_=가 있습니다. setter 메서드를 위한 특별한 문법에 주목하십시오: getter 메서드 식별자에 _=를 덧붙이고 매개변수가 뒤따르는 형식입니다.

기본 생성자에서 valvar로 지정된 매개변수는 public 입니다. val은 불변을 의미하기 때문에 다음의 예처럼 값을 변경할 수 없습니다.

class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3  // <-- 컴파일되지 않습니다

val 또는 var로 지정되지 않은 매개변수는 private 값이므로 클래스 내에서만 참조가능합니다.

class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x  // <-- 컴파일되지 않습니다

Contributors to this page: