kotlin을 배우면서 custom getter / setter에 대해 알게 되었다.
멤버 변수 아래 작성하고 get, set 함수 내에서 값에 대한 접근은 field 키워드를 사용한다는 것이 java와 달랐다.
그런데 왜 custom일까? 하는 생각으로 빌드된 바이트 코드를 디컴파일해서 java 코드로 살펴보기 시작했다.
IntelliJ IDEA에서 [Tools] → [Kotlin] → [Show Kotlin Bytecode] → [Decompile]로 디컴파일된 java 코드를 확인할 수 있다.
다음은 kotlin에서 custom set 함수를 작성하고 컴파일 후 바이트 코드를 디컴파일한 java 코드이다.
나는 set 함수만 작성했지만 java 코드를 보면 getResult라는 getter 메서드가 있다.
그러면 기본 setter는 어떻게 생겼을지 궁금증이 생겨서 custom setter를 주석 처리하고 컴파일 후 다시 디컴파일해서 코드를 살펴봤다.
custom setter로 작성할 때 추가했던 코드가 제거되고 value였던 파라미터 이름도 var1로 변경 되었다.
위의 경우는 var로 선언한 변수라서 getter / setter가 있다 치고 val로 변경했을 때는 어떻게 될까? 싶어서 val로 변경하고 다시 컴파일, 디컴파일 과정을 거쳤다.
결과는 다음과 같다.
불변 변수라서 setter는 없고 getResult()만 남아 있다.
결론은 내가 getter와 setter를 만들지 않아도 자동으로 생성되어 있고 val의 경우 setter는 없고 getter는 있다는 것이다.
값을 가져오기 위해 getter가 있어야 겠다는 생각으로 이미 존재하는 것을 추가해야 될 코드가 없는데도 만드는 것은 불필요하다.