[Android/Kotlin] getter와 setter

WonDDak·2023년 11월 28일
0

Android

목록 보기
4/6

getter 와 setter에 대해 알아보자

예시 1

class Test1 {
    val test1: Int = 0
    var test2: Int? = null
}

위와 같은 코드를 Java로 변환해보자

Android Studio에서 Tools > Kotlin > show Kotlin ByteCode를 통해 확인 할 수 있다.

public final class Test1 {
   private final int test1;
   @Nullable
   private Integer test2;

   public final int getTest1() {
      return this.test1;
   }

   @Nullable
   public final Integer getTest2() {
      return this.test2;
   }

   public final void setTest2(@Nullable Integer var1) {
      this.test2 = var1;
   }
}

val로 선언된 변수는 get함수만 생기고
var로 선언된 변수는 get과 set 함수가 같이 생긴다.

즉 코틀린에서는 변수 선언 방식에 따라 getter/setter이 자동으로 생성된다

예시 2

위와 같이 같은 방식외에도 직접 임의의 getter와 setter를 지정해 줄수도 있다.

class Test2 {
    var test: Int? = null
        get() = field
        set(value) {
            field = if (value == null) null else (value * 2)
        }
    
    init {
        test = 545
        println(test)
    }
}

위와 같은 예제가 있다고 하자

get할시에는 test의 값을 가져오고
set을 할시에는 null이면 null값을 이외에는 들어온값에 2배를 넣도록 하엿다.

위 class에서는 test= 545로 초기화 해주므로 println(test)에서는 1090이 나옴을 알 수 있다.

public final class Test2 {
   @Nullable
   private Integer test;

   @Nullable
   public final Integer getTest() {
      return this.test;
   }

   public final void setTest(@Nullable Integer value) {
      this.test = value == null ? null : value * 2;
   }

   public Test2() {
      this.setTest(545);
      Integer var1 = this.getTest();
      System.out.println(var1);
   }
}

자바로 변환된 코드를 보면 우리가 지정한 되로 get과 set함수가 만들어 졌음을 알 수 있다.

Test2 실행해보기

예시 3

작업을 하다보면 두가지 형태를 본적이 있을 것이다. 두형태는 뭐가 다를까?

val a :Int = 1 
val a :Int
	get() = 1

아래 와 같이 정의하고 java로 바꾸어 보자

class Test3 {
    var number = 4

    val getterNumber
        get() = number

    val localNumber = number
    
}
public final class Test3 {
   private int number = 4;
   private final int localNumber;

   public final int getNumber() {
      return this.number;
   }

   public final void setNumber(int var1) {
      this.number = var1;
   }

   public final int getGetterNumber() {
      return this.number;
   }

   public final int getLocalNumber() {
      return this.localNumber;
   }

   public Test3() {
      this.localNumber = this.number;
   }
}
  • getterNumber의 경우 초기화 되지 않고 오로지 get 함수만 생성되었다.
  • number의 경우 number가 4로 초기화 되고 get함수는 number를 반환하도록 되었다.
  • localNumber의 경우 시작시 number 값으로 초기화 되고 get시에 localNumbe를 반환하도록 되었다.

그렇다면 여기서 추가적인 작업을 해보자 init에 다음과 같은 추가작업을 하였다 결과는?

	init {
        println(getterNumber)
        println(localNumber)
        number += 1000
        println(getterNumber)
        println(localNumber)
    }

Test3 실행해보기
결과는 아래와 같이

4
4
1004
4

이다 그이유는 getterNumber의 경우 number의값이 반환되므로 number가 바뀌면 변화가 생기지만
localNumber이 경우 number의 값으로 최초 초기화가 됬을뿐 get은 localNumber의 값을 반환한다.


감사합니다.

profile
안녕하세요. 원딱입니다.

0개의 댓글