클래스는 스칼라에서 객체를 만드는데에 필요한 청사진이다. 메소드를 담을수 있고 값과 변수, 타입, 객체, traits, 클래스도 담을 수 있다.

이들은 다 합쳐서 멤버라고 불린다.

defining a class

단순히 키워드 class를 쓰고 identifier를 붙여서, 그리고 문법적으로 대문자로

//scala2
class User

val user1 = new User

//scala3
class User

val user1 = User()

키워드 new는 클래스의 인스턴스를 하나 만들때 사용,

기본적으로 인자를 받지 않는 기본 컨스트럭터가 있다.

하지만 보통 클래스 본체와 함께 생성자를 원하는 경우도 있을 것이다.

//scala2

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)
println(point1.x)  // prints 2
println(point1)    // prints (2, 3)

//scala3

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)"
end Point

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

→ unit 은 어떤 계산만 하고 값을 반환하지 않겟다는 의미로 쓰일수 있는것 같다.

→ point 클래스는 네개의 멤버가 있다

→ 변수 x,y 그리고 move라는 메소드, toString이라는 메소드

기본 생성자(var x: Int, var y: Int)가 클래스 선언부에 바로 선언,호출된다.

move 메소드는 두개의 정수를 받아서 unit 값을 반환한다. → 아무런 정보를 담고있지 않다.

대부분 자바 계통의 언어의 void와 비슷하다.

toString은 반면에 아무런 인자를 받지않고, string갑을 반환