[ 클래스 ]
// 자바 클래스 Person
public class Person {
// property
private final String name;
// 생성자
public Person(String name) {
this.name = name;
}
// Getter
public String getName() {
return name;
}
}
// 코틀린 클래스 Person
class Person(val name: String)
∘ 값 객체 (Value Object) : 코드 없이 데이터만 저장하는 클래스
∘ 코틀린의 기본 가시성은 public이므로 변경자 생략 가능
[ 프로퍼티 ]
1. 클래스 & 프로퍼티 선언
클래스의 목적 : 데이터를 캡슐화하고 캡슐화한 데이터를 다루는 코드를 한 주체 아래 가두는 것
∘ 객체지향 언어인 자바에서 객체는 고유한 속성(특징)을 가지는데, 그 속성을 칭하는 단어를 프로퍼티(property)라고 한다.
∘ 이 속성의 진짜 모습, 즉 '실체'를 담는 곳이 필드(field, 멤버변수)이다.
∘ Java의 class
˙ 데이터를 필드에 저장한다.
˙ 멤버 필드의 가시성 : private
˙ 클라이언트가 접근하는 통로인 접근자 메소드(accessor method)를 제공한다. : Getter & Setter
˙ 필드와 접근자를 묶어 프로퍼티라 부른다.
∘ Kotlin의 class
class Person (
val name: String, // 1. 읽기 전용 프로퍼티
var isMarried: Boolean // 2. 쓸 수 있는 프로퍼티
) {
...
}
˙ 필드와 접근자 메소드를 완전히 대신하는 프로퍼티 사용 가능
˙ 코틀린의 기본 가시성은 public
˙ val 프로퍼티
˙ 클래스 안의 val : 비공개 필드 & 공개 Getter 생성
˙ 읽기 전용 프로퍼티
˙ public name: String 프로퍼티 생성
˙ public getName() : String 함수 생성(Getter)
˙ var 프로퍼티
˙ 클래스 안의 var : 비공개 필드 & 공개 Getter & 공개 Setter 생성
˙ 쓰기 가능 프로퍼티
˙ public isMarried: Boolean 프로퍼티 생성
˙ public isMarried() 함수 생성(Getter)
˙ public setMarried() 함수 생성(Setter)
2. Person 클래스 사용하기
// new 키워드를 사용하지 않고 생성자 호출
val person = Person("Hyoung", false)
// 직접 호출한것 처럼 보여도 실제로는 Getter를 사용하고 있다.
println(person.name) // Hyoung
println(person.isMarried) // false
∘ 대부분의 프로퍼티에는 프로퍼티의 값을 저장하기 위한 필드가 존재 : backing field
∘ 원한다면 cutom Getter 를 통해 프로퍼티 값을 그때그때 계산할 수 있다.
[ 커스텀 접근자 ]
class Rectangle (val height: Int, val width: Int) {
fun getPerm() { // 0
return (height + width) * 2
}
val perimeter: Int // 1
get() {
return (height + width) * 2
}
val isSquare: Boolean // 2
get() = height == width
}
fun main() {
val rec = Rectangle(3, 5)
println(rec.perimeter) // 16
println(rec.isSquare) // false
}
0. fun getPerm()
˙ 파라미터가 없는 함수를 정의하는 방식
1. val Perimeter: Int
˙ 커스텀 게터를 정의하는 방식
˙ 내가 만든 사각형(rec)의 둘레를 저장할 필요가 없다.
˙ rec.perimeter 의 호출을 통해 그때그때 사각형의 둘레를 계산하여 사용
2. val isSquare: Boolean
˙ 커스텀 게터를 정의하는 방식
˙ 내가 만든 사각형(rec)이 정사각형인지의 여부를 저장할 필요가 없다.
˙ rec.isSquare 의 호출을 통해 그때그때 정사각형 여부 계산하여 사용
파라미터가 없는 함수를 정의하는 방식 vs 커스텀 게터를 정의하는 방식
구현이나 성능상의 차이 없음 & 가독성의 차이
일반적으로 클래스의 특성을 정의하고 싶다면 프로퍼티를 사용한다.
[ 코틀린 소스코드 구조: 디렉터리와 패키지 ]
∘ 파일의 맨 앞에 package 문 사용 가능
∘ 다른 packag에서 정의된 선언을 사용하려면 import 를 통해 불러와야 한다.
∘ 패키지 이름 뒤에 .* 를 추가하면 하위의 모든 선언을 임포트할 수 있다.
∘ 코틀린에서도 자바의 방식을 따라 패키지별로 디렉터리를 구성하는것이 좋다.
∘ 여러 클래스를 한 파일에 넣는 것을 주저하지 말것
'Kotlin > Kotlin In Action' 카테고리의 다른 글
[Kotlin] 2-5. 코틀린의 예외 처리 (0) | 2022.05.15 |
---|---|
[Kotlin] 2-4. 이터레이션: while & for (0) | 2022.05.15 |
[Kotlin] 2-3. 선택 표현과 처리 : enum과 when (0) | 2022.05.15 |
[Kotlin] 2-1. 함수와 변수 (0) | 2022.03.31 |
[Kotlin] 1. 코틀린이란? (0) | 2022.01.19 |