개발 이야기/TIL

23.1.17 Kotlin Setter&Getter

혁진 2023. 1. 17. 17:41

이어서 코틀린의 setter와 getter이다. 

14일 글을 조금 더 자세히 적어보고자 한다(수정본..에 가깝다)

Getter & Setter 기본형

1. Kotlin에서는 JAVA와 다르게 primal constructor에 대해 Getter와 Setter을 컴파일 시 생성해준다. 

public class Button {
   private int width;
   private int height;
   //constructor
   public Button(int width, int height){
   	this.width = width
    this.height = height
   }
   //getter
   public int getWidth(){
   	return width;
   }
   public int getHeight(){
   	return height;
   }
    public void setWidth(int value){
        if(value>50){
            width = value
        }
        else{
            width=50
        }
    }
    public void setHeight(int value){
        if(value>50){
            height = value
        }
        else{
            width=50
        }
    }
    
}

을 우리는 코틀린에서는..!

//kotlin
class Button(var width:Int, var height:Int) {
}

만 쓰면 끝이다. 

이때 primal constructor를 선언하는 방법에 따라 조금씩 차이가 있다. 이는 아래와 같다. 

primal constructor 선언방식 Getter 생성 여부 Setter 생성 여부
class Button(width:Int) X X
class Button(var width:Int) O O
class Button(val width:Int) O X

Getter&Setter 호출

//kotlin
class Button(var width:Int, var height:Int) {
}

//get
var btn = Button(20,30)
btn.width
btn.height 

//set 
btn.width = 100

property를 그냥 호출하고, 값을 대입하면 된다. 

Kotlin Class를 JAVA에서 호출하기 

코틀린으로 class를 정의하고 자바에서 호출할 때는 다음과 같이 호출하면 된다. 

//kotlin
class Button(var width:Int, var isHeight:Int) {
}
//JAVA
public static void main(String[] args){

	Button btn = new Person(20, 24);

	person.getWidth();
	person.isHeight();

	person.setWidth(100);
	person.setHeight(12);

}

반대로 JAVA class를 코틀린에서 호출할때는 코틀린에서 호출하던 대로 사용하면 된다. 

 

-Getter와 Setter 커스텀하기 

자동으로 만들어주기는 하지만, 내가 직접 만들고 싶으면 아래와 같이 작성하면 된다.

이 때 feild를 사용한다. field란 무엇일까? 이는 Backing feld라 한다. 

Backing filed란 프로퍼티의 값을 저장하기 위한 필드이다. 이를 만일 사용하지 않고 set을 하려고 한다면, 무한재귀에 빠지는 경우가 발생한다!

따라서 아래와 같이 꼭 field 키워드를 사용하도록 하자.

//kotlin
class Button {
    var width: Int = 0
    get() = field
 // width 이후에 작성한 set이기에 set(value)에 해당하는 field는 width에 관한 값이 됨   
    set(value){
		field = value
    }
    var height: Int = 0
    get() = field
 // height이후에 작성한 set이기에 set(value)에 해당하는 field는 height에 관한 값이 됨   
    set(value){
        if(value>50){
            field = value
        }
        else{
            field=50
        }
    }