2. [2] 클래스와 프로퍼티

(1) 프로퍼티

class Person(
  val name: String,       // 읽기전용 프로퍼티 > (공개)Getter
  var isMarried: Boolean  // 사용 가능한 프로퍼티 > (비공개)Field, (공개)Getter, (공개)Setter
)
  • 프로퍼티 = 필드 + 접근자 메서드
  • 클래스 : 데이터를 캡슐화(Encapsulation) 하여 한 주체 안에 가두어서 필드에 저장
  • 접근자 메서드 : 자신이 사용하는 클라이언트가 데이터에 접근할 수 있도록 하는 통로 [Getter, Setter]

Kotlin은 값을 저장하기 위한 비공개 필드, 그 필드에 값을 저장하기 위한 세터, 값을 읽기 위한 게터로 이루어진 접근자 구현을 제공한다.

val person = Person("Bob", true) // new Keyword를 사용하지 않아도 생성자 호출 가능
println(person.name)  // 프로퍼티 이름을 직접 사용해도 Getter 호출 가능
println(person.isMarried)
  • Kotlin에서 위의 Person 클래스를 다음과 같이 사용할 수 있다.

(2) 커스텀 접근자

class Rectangle(val height: Int, val width: Int) {
  val isSquare: Boolean
  get() { return height == width}
}
val rectangle = Rectangle(41, 43)
println(rectangle.isSquare) // false
  • 해당 클래스처럼 프로퍼티의 접근자를 직접 장성하는 것이 가능함.
  • isSquare 프로퍼티는 자체 값을 저장하는 필드가 따로 필요 없음.
  • 해당 접근자를 Java에서 사용하려면 isSquare 메서드를 호출하면 됨.

(3) 디렉터리와 패키지

  • Kotlin 파일의 맨 앞에 package문을 넣어서 해당 파일 안의 모든 선언(클래스, 함수, 프로퍼티 등)이 해당 함수에 들어간다.
  • 같은 패키지에 속해 있다면 다른 파일에 정의한 선언일지라도 사용 가능
  • 다른 패키지에 속해 있다면 임포트를 통해 선언 가능
  • 패키지 안에 *을 추가하면 패키지 안의 모든 선언을 임포트 할 수 있음.
package geometry.example
import geometry.shapes.createRandomRectangle

fun main(args: Array<String>) {
  println(createRandomRectangle().isSquare)   // 다른 패키지에 있는 함수 임포트
}
  • Kotlin에서는 여러 클래스를 한 파일에 넣을 수도 있고, 파일의 이름도 마음대로 정할 수 있다.
  • 디스크 상의 어느 디렉터리에 소스코드가 있어도 관계없어서, 원하는 대로 소스코드를 구성하는 것이 가능하다.
  • 하지만, Java의 방식을 따르지 않았을 때는, Java 클래스를 Kotlin 클래스로 마이그레이션 할 때 문제가 생길 수 있다.