티스토리 뷰
프로퍼티(Property)
• 클래스(객체)가 가지고 있는 변수
1. getter / setter
• getter
- 클래스의 프로퍼티에 접근 할 때
ex) person.name
• setter
- 클래스의 프로퍼티 값을 설정할 때
ex) person.name = "홍길동"
• 기본적으로 프로퍼티에 값을 저장하는 것이나, 저장되어 있는 값을 불러오는 것은 코틀린에서 제공해주지만, 특별한 기능을 추가하고 싶을 경우 개발자가 직접 작성할 수 있다.
• getter와 setter 모두 작성 가능하고, 둘 중 하나만 독립적으로 작성할 수도 있다.
• 모든 프로퍼티마다 설정할 수 있다.
• 해당 프로퍼티는 field로 받는다.
class Book() {
var title: String = "타이틀"
get() { // title의 getter 설정
// getter에 넣고 싶은 특별한 기능 추가
println("현재 title 값인 ${field} 리턴")
return field
}
set(value: String) { // title의 setter 설정
// setter에 넣고 싶은 특별한 기능 추가
println("title을 ${value}(으)로 변경")
field = value
}
var subtitle: String = "서브 타이틀"
}
val book = Book()
println(book.title) // book 객체의 title 프로퍼티에 접근 -> getter 실행
book.title = "돈키호테" // book 객체의 title 프로퍼티 값 설정 -> setter 실행
println(book.title) // book 객체의 title 프로퍼티에 접근 -> getter 실행
2. lateinit
• 코틀린은 기본적으로 변수를 선언할 때 초기값을 할당해주어야 함.
• 초기화를 나중에 하고싶을 때 lateinit을 사용할 수 있음.
• lateinit으로 선언한 변수는 호출 전까지는 꼭 값을 할당해주어야 하고, isInitalized로 초기화 여부를 확인 후 사용해야 함.
* 더블 콜론 (::)
- Reflection : 런타임(실행 중)에 프로그램의 구조를 조사할 수 있는 기능
- 변수 앞에 사용하면 변수를 객체 취급하여 변수 안의 메소드를 사용할 수 있다.
ex) ::title.isInitalized, ::title.getter
class Book2() {
lateinit var title: String // title 프로퍼티 lateinit으로 선언(초기값 할당 나중에)
fun nextPage() {
if (::title.isInitialized) { // title이 초기화가 되었다면
println("다음 페이지") // 다음 페이지 출력
} else { // title이 초기화가 아직 안 되어 있으면
println("초기화 필요") // 초기화 필요 출력
}
}
}
val book2_1 = Book2()
//println(book2_1.title) // 오류 발생 : 아직 초기화되지 않았다.
book2_1.nextPage() // 초기화 필요 출력
book2_1.title = "돈키호테"
book2_1.nextPage() // 다음 페이지 출력
val book2_2 = Book2()
book2_2.nextPage() // 초기화 필요 출력 : book2_1와 book2_2는 다른 객체이기 때문에
• lateinit을 사용하기 위한 규칙
- 인자를 생략하고 주 생성자 안에서 바로 프로퍼티를 선언할 때는 사용할 수 없다.
- nullable 타입에는 사용할 수 없다.
- getter / setter를 사용할 수 없다.
- val로 프로퍼티 선언 시 사용할 수 없다.
- 원시 자료형에는 사용할 수 없다.
class Book3(lateinit var title: String) // 오류 발생 : 주 생성자 안에서 선언 시 사용 불가
lateinit var title: String? // 오류 발생 : nullable 타입 사용 불가
lateinit var title: String // 오류 발생 : getter / setter 사용 불가
get() {return field}
set(value: String) {field = value}
lateinit val title : String // 오류 발생 : val로 선언 시 사용 불가
lateinit var title : Int // 오류 발생 : 원시 자료형 사용 불가
* 원시 자료형과 참조 자료형
- 참고 글 : https://jaeyeong951.medium.com/%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-%EC%9B%90%EC%8B%9C-%ED%83%80%EC%9E%85-a07f698a3581
3. lazy
• 선언 시 초기값을 할당하지 않았다가, 변수를 호출 또는 접근 시 초기화한다.
• 사용할 수도 있고 그렇지 않을 수도 있는 변수들, 그 중 코드가 많이 무거운 변수들에게 주로 사용.
• 람다 함수를 사용한다. -> return 키워드를 사용하는 것이 아닌 마지막 줄이 자동 리턴.
• lazy 함수 안에 다른 작업도 가능하지만 리턴 값은 꼭 넣어야 함.
class Book4() {
val title: String by lazy {
println("lazy 사용") // 다른 작업 가능.
//return "셜록홈즈" // 오류 발생 : return 키워드 불가능
//title = "셜록홈즈" // 오류 발생 : title 인식 못 함.
//field = "셜록홈즈" // 오류 발생 : field는 getter / setter에서만 사용 가능. field 인식 못함.
"셜록홈즈" // 맨 마지막 줄 return됨.
}
}
val book4 = Book4()
println(book4.title)
메소드(Method)
• 클래스(객체)가 가지고 있는 함수
class FootballPlayer(name: String, uniform: String, ball: String) {
val name: String
val uniform: String
val ball: String
init {
this.name = name
this.uniform = uniform
this.ball = ball
}
fun kick() { // kick() 메소드
// 반복, 예외처리, 흐름제어 등
println("${name}이(가) 공을 찬다.")
}
fun pass() { // pass() 메소드
println("${name}이(가) 패스한다.")
}
}
val fbPlayer1 = FootballPlayer("홍길동", "빨간색 유니폼", "축구공")
val fbPlayer2 = FootballPlayer("고길동", "파란색 유니폼", "축구공")
fbPlayer1.kick()
fbPlayer2.pass()
* 클래스 내부에서만 사용할 메소드는 네이밍할 때 _를 붙이는게 암묵적인 룰
이 글은
패스트 캠퍼스 Android 앱 개발의 정석 with Kotlin 올인원 패키지 Online
강의를 듣고 공부한 내용을 바탕으로 작성되었습니다.
'📱 Android > 💻 Kotlin' 카테고리의 다른 글
[Android/Kotlin] 17. 상속 (0) | 2022.10.12 |
---|---|
[Android/Kotlin] 16. 접근 제한자 (0) | 2022.10.12 |
[Android/Kotlin] 14. 클래스(Class) (1) | 2022.10.11 |
[Android/Kotlin] 13. 일급 시민, 고차 함수, 람다식 (0) | 2022.10.07 |
[Android/Kotlin] 12. 출력 (0) | 2022.10.07 |