클래스와 프로퍼티
1. 클래스와 프로퍼티 개념
Java에서의 클래스 정의
public class Person {
private final String name;
public Person(String name){
this.name = name;
}
public String getName() {
return name; // this.name 이어야 하는거 아닌가?
}
}
Kotlin에서의 클래스 정의
class Person(val name: String)
- val 키워드로 선언된 프로퍼티는 읽기 전용이며, 내부적으로 private 필드와 public 게터를 생성.
- Java의 VO(Value Object) 개념과 유사함.
2. 프로퍼티와 접근자
Java에서의 접근자 메서드
Person person = new Person("Bob");
System.out.println(person.getName());
Kotlin에서의 접근자
val person = Person("Bob", true)
println(person.name) // 자동으로 게터 호출
println(person.isMarried)
person.isMarried = false // 자동으로 세터 호출
- Kotlin에서는 프로퍼티를 직접 사용해도 내부적으로 게터/세터를 자동 호출.
- val 프로퍼티는 getter만 제공.
- var 프로퍼티는 getter와 setter를 제공.
3. 커스텀 접근자
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() { // 커스텀 게터
return height == width
}
}
- 프로퍼티에 커스텀 게터를 추가하면, 접근할 때마다 값이 동적으로 계산됨.
- 위의 isSquare 프로퍼티는 height와 width가 같을 경우 true 반환.
- 더 간결하게 표현 가능:
val isSquare: Boolean get() = height == width
4. Kotlin 소스코드 구조
패키지 사용
package geometry.shapes
import java.util.Random
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean get() = height == width
}
fun createRandomRectangle(): Rectangle {
val random = Random()
return Rectangle(random.nextInt(), random.nextInt())
}
- package 문을 사용해 패키지 단위로 코드 관리 가능.
- 다른 패키지에서 선언을 가져오려면 import 필요.
다른 파일에서 사용
package geometry.example
import geometry.shapes.createRandomRectangle
fun main() {
println(createRandomRectangle().isSquare)
}
5. Kotlin과 Java의 차이점
특징JavaKotlin
클래스 필드 |
private 필드 + 게터/세터 |
프로퍼티로 직접 접근 가능 |
읽기 전용 필드 |
final 키워드 사용 |
val 키워드 사용 |
가변 필드 |
private 필드 + set 메서드 |
var 키워드 사용 |
커스텀 접근자 |
get 메서드 수동 작성 |
get() = ... 형태로 간결하게 정의 |
패키지 구조 |
디렉터리 구조 필수 |
디렉터리와 무관 |
6. 결론
- Kotlin의 프로퍼티 개념은 Java보다 훨씬 간결하고 직관적.
- val과 var를 이용해 게터/세터를 자동으로 생성.
- 커스텀 접근자를 활용하면 불필요한 필드 없이 동적인 프로퍼티 정의 가능.
- 패키지 구조가 Java보다 유연하여 더 자유로운 코드 작성 가능.
참고
- 드미트리 제메로프,스베트라나 이사코바, Kotlin in Action (에이콘출판, 2017)