Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[14일차 Kotlin] 캡슐화와 Property(프로퍼티) 본문

Computer/Kotlin

[14일차 Kotlin] 캡슐화와 Property(프로퍼티)

Wise-99 2023. 5. 17. 18:20

 

 

출처 : 안드로이드 앱스쿨 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 메서드를 호출하는 것을 사용한다.