안드로이드 개발자의 창고
[14일차 Kotlin] 캡슐화와 Property(프로퍼티) 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 캡슐화란?
- 객체가 가지고 있는 변수는 메서드에 구현한 코드가 정상적으로 동작하기 위한 데이터를 담고 있다.
- 만약 변수에 엉뚱한 데이터가 담긴다면 구현한 코드가 정상적으로 동작한다고 하더라도 정상적인 결과가 나올 수 없게 된다.
- 이에 변수의 직접적인 접근을 차단하여 외부에서 값을 변경하지 못하도록 막는 것을 캡슐화라고 부른다.
📖 Property란?
- 캡슐화가 적용된 변수는 외부에서의 접근이 차단된다.
- 캡슐화가 적용된 변수에 대해 메서드를 통해 값을 설정하거나 가져다 사용할 수 있도록 구성한 것을 Property 라고 부른다.
- 변수에 값을 넣는 메서드를 setter라고 부른다.
- 변수가 가지고 있는 값을 반환하는 메서드를 getter라고 부른다.
📖 property 작성방법
- private 키워드를 변수에 설정하여 외부에서 접근하지 못하도록 막는다.
- 변수들 중에 외부에 공개하고자 하는 변수에 대해 setter와 getter를 지정한다.
주생성자 사용하기
- 주 생성자의 매개 변수를 정의할 때 var, val를 지정하면 Property로 작성된다.
- var 는 getter, setter 모두 작성된다.
- val 은 getter 만 작성된다.
클래스의 멤버변수
- 클래스의 변수를 선언할 때 var와 val에 따라 Property가 작성된다.
- var의 경우 setter와 getter가 모두 작성된다.
- val의 경우 getter만 작성된다.
📖 예제 코드
TestClass1과 TestClass2
class TestClass1(var a1:Int, var a2:Int)
class TestClass2{
var v1 = 0
val v2 = 0
var v3 = 0
get() {
println("getter 호출")
return field
}
set(value){
println("setter 호출")
if(value in 1..10){
field = value
}
}
val v4 = 0
get(){
println("getter 호출 v4")
return field
}
}
✔️ 코드 해석
- TestClass1
- 생성자의 매개변수로 선언된 변수들은 private 멤버로 정의된다.
- var 의 경우 setter와 getter가 모두 만들어지며, val 의 경우 final 변수로 정의되고 getter만 제공된다.
- TestClass2
- 클래스에 정의한 모든 변수는 private로 정의된다.
- val 변수는 final 변수로 정의된다.
- 변수만 정의하면 var의 경우 setter/getter가 자동으로 만들어지고, val의 경우 getter만 자동으로 만들어준다.
- 만약 getter나 setter를 원하는데로 만들어지게 하겠다면 v3, v4와 같이 getter/setter를 작성해준다.
- 여기에서 field는 해당 변수를 의미한다.
- v3의 set()은 저장하려는 값이 1 ~ 10일 때만 값을 저장하는 코드이다.
main
fun main() {
var t1 = TestClass1(100, 200)
println("t1.a1 : ${t1.a1}")
println("t1.a1 : ${t1.a2}")
t1.a1 = 1000
println("t1.a1 : ${t1.a1}")
val t2 = TestClass2()
t2.v1 = 100 // setter 호출
t2.v3 = 5
println(t2.v1) // getter 호출
println(t2.v2)
println(t2.v3)
println(t2.v4)
t2.v3 = 100
println(t2.v3)
}
✔️ 코드 해석
- println("t1.a1 : ${t1.a1}"); println("t1.a1 : ${t1.a2}")
- a1, a2 변수에 직접 접근하는 것이 아닌 getter 메서드를 호출해서 반환받는 값을 사용한다.
- t1.a1 = 1000
- a1 변수에 직접 접근하여 값을 저장하는 것이 아닌 setter 메서드를 호출하는 것을 사용한다.
'Computer > Kotlin' 카테고리의 다른 글
[14일차 Kotlin] Overriding(오버라이딩) (0) | 2023.05.17 |
---|---|
[14일차 Kotlin] 지연 초기화 - lateinit과 lazy (0) | 2023.05.17 |
[14일차 Kotlin] 접근제한자 (0) | 2023.05.16 |
[14일차 Kotlin] 패키지(Package)와 모듈(Module) (0) | 2023.05.16 |
[14일차 Kotlin] 상속 (0) | 2023.05.16 |