06_1 프로퍼티 접근
프로퍼티와 필드의 차이점
자바의 경우 클래스 내에서 선언한 변수를 '필드'라고 하고 코틀린에서는 '프로퍼티'라고 칭함.
프로퍼티의 경우 접근 매서드인 getter와 setter를 기본적으로 가지고 있기 때문에 자바의 필드와 다른 명칭을 사용하는 것. 코틀린에서는 각 프로퍼티에 대해 접근 메서드를 자동으로 생성하며 주 생성자에 의해 매개변수를 정의할 수 있으므로 간단하게 코딩할 수 있다는 장점이 있다.
class ClassName(var a: String, var b: Double) // 클래스 정의와 함께 주 생성자에서 매개변수를 정의함
코틀린에서의 접근 메서드
- val 로 선언한 프로퍼티는 getter만 가능. 값 바꾸는 것 불가하기 때문에
- var은 내부에서 접근 메서드가 동작. 읽고 쓰기 가능
기본 게터와 세터 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class User(_id: Int, _name: String, _age: Int) {
val id: Int = _id
var name: String = _name // 주 생성자에 의한 초기값 설정
get() = field
set(value) {
field = value
}
var age: Int = _age // 주 생성자에 의한 초기값 설정
get() = field
set(value) {
field = value
}
}
fun main() {
val user = User(2020, "kildong", 20)
user.age = 10 // set(10)
}
|
cs |
- value[다른 이름으로 변경 가능] : 세터에서 매개변수로서 외부의 값을 가지고와 내부의 프로퍼티 값을 셋팅함
- field : 보조 필드. 게터에서 프로퍼티를 참조할 수 있도록 하는 변수. 프로퍼티 이름으로 게터와 세터의 접근이 가능하기 때문에 보조 필드를 사용하지 않고 바로 프로퍼티명을 사용하면 게터를 호출하여 넣는 것과 같기 때문에 게터가 무한 반복되어 호출되는 문제점이 있어 보조 필드를 사용. 세터 또한 이러한 메커니즘이 있기 때문에 보조 필드를 사용해서 세터로 값을 지정해 주는 것
- 접근 메서드는 코드를 통해 커스텀 가능
: 특정 연산을 수행하여 set, get 해야 하는 경우 직접 접근 메서드를 커스텀하여 사용 가능. 그렇지 않은 경우는 자동적으로 내부에서 생성하기 때문에 굳이 작성할 필요가 없음.
- 가시성 지시자 사용 : 외부에서 사용하지 못하게 하려면 private set과 같은 형태로 지정해주면 외부에서 프로퍼티 값 할당 불가
보조 프로퍼티 사용
- 보조 필드 사용 안하고 임시적으로 사용할 프로퍼티를 선언하여 사용하는 경우
- 프로퍼티이므로 가시성 지시자 사용 가능
프로퍼티 오버라이딩
- open 키워드로 프로퍼티 오버라이딩 가능
- 상위 클래스에서 val 로 선언한 경우 오버라이딩 시 var로 변경 가능하지만 var로 선언된 프로퍼티를 val 로 오버라이딩 하는 것은 불가능함
06_2 지연 초기화와 위임
지연 초기화를 하는 경우
- 설정에 의한 초기화 시 매번 생성과 동시에 초기화하기 힘듬
- 즉시 사용하지 않는 객체를 미리 생성, 초기화 하여 메모리 낭비 발생 가능
- 유닛 테스트 시 임시적 객체 생성
- 특정 객체의 의존성이 있는 경우
lateinit 특징
- var 선언 프로퍼티만 가능
- 게터 세터 사용 불가
객체 지연 초기화
- 생정자 호출 시점에서 초기화
lazy 지연 초기화
- val 로 선언된 프로퍼티의 지연 초기화 가능 (읽기 전용)
- 값을 다시 변경 할 수 없음
- 람다식으로 구성됨, lazy 인스턴스 반환값을 가짐
- by 프로퍼티 위임 시 사용하는 키워드
- 프로퍼티 지연 초기화 : 프로퍼티에 최초 접근한 시점에서 해당 프로퍼티 초기화
- 객체 지연 초기화 :
by
- 하나의 클래스가 다른 클래스에 위임하도록 선언
- 위임하는 클래스의 멤버를 참조 없이 호출 가능
- 프로퍼티에서의 위임 : 프로퍼티의 접근 메소드를 특정 객체에게 위임 -> get, set의 수행을 위임한 특정 객체가 수행하도록 만듬
참고 및 인용 도서 : Do it! 코틀린 프로그래밍
'NSLog(@"%@", dailyLog)' 카테고리의 다른 글
[Android] 안드로이드 구성 요소 (0) | 2020.08.17 |
---|---|
[Android, Kotlin] 데이터 클래스와 기타 클래스 (0) | 2020.08.09 |
[Kotlin 20200804] 객체 지향 프로그래밍 - 인터페이스 (0) | 2020.08.04 |
[Kotlin 20200803] 객체 지향 프로그래밍 (0) | 2020.08.03 |
[Kotlin 20200802] 객체 지향 프로그래밍 - 클래스와 객체 (0) | 2020.08.03 |
댓글