For Programmer

11. 코틀린 - 세터(setter)와 게터(getter) 본문

Programming language/Kotlin

11. 코틀린 - 세터(setter)와 게터(getter)

유지광이 2021. 8. 25. 02:09

Java에서는 setter와 getter를 생성하기위해 엄청나게 많은 코드가 필요하다. 예를들어 보면

public class Person { 
	private String name; 

	// constructor 
    public Person(String name){ 
    this.name = name; 
    } 

	// get method
    get set method public String getName() { 
    return this.name; 
    } 
	// set method
	public void setName(String name){ 
		this.name = name; 
	} 
}

다음과 같이 name private 변수하나에 20줄 가까이 코드가 나오게 된다.

하지만 위의 코드를 코틀린은 구현하면 한줄 안에 해결 할 수 있다. 

class Person(var name: String)

위의 코드만으로 자동으로 생성자와 세터 게터까지 만들어준다.(val는 게터만 생성)

 

따라서 main함수에서 Person객체를 생성 후 name을 호출할 경우 세터 게터와 같은 방식으로 호출해 준다. 코틀린은 기본적으로 범위(Scope)가 Java와 다르게 Public이다. 따라서 class앞에 접근자 public을 따로 써주지 않아도 되며 또한 기본적으로 class내부의 property에 setter와 getter를 자동적으로 제공해준다. 그러므로 우리는 변수에 접근하는 것도 setter와 getter 로 접근할 수 있는 것이고 단순히 우리는 해당 변수에 접근하고 값을 변경하는 것도 사실 setter,getter가 호출되는거라고 생각할 수 있다.

그런데 이 setter와 getter를 사용자가 커스텀할 수도 있다.

class TV(val channels : List<String>){

     var a:Int = 9
        set(value) {
            println("값이 변경 되었습니다.")
            field = value+1
        }
        get() {
            println("값이 호출 되었습니다.")
            return field
        }
  }

-> 위의 코드에서 set과get은 변수 a와 관련 있다. set은 값의 변경 혹은 대입이 일어날 때 호출이 되고 get은 값의 호출이 일어날 때 호출된다. 

또한 Field가 굉장히 중요한대 set의 매개변수 value에는 대입되는 값이 들어온다. 그값을 만약에 set함수 내부에서 변수 a에 직접적으로 넣으려고 할때 즉, a = value +1 이런식으로 사용하게 된다면 a에 값의 대입이 또 일어나기 때문에 set내부에서 또 set을 호출하게 되고 이는 결국 무한루프를 돌게 된다. 이럴때 쓰는 것이 Field이다. a 대신 Field에 값을 저장하게 되면 a에 값을 저장하는 것과  동일한 효과를 준다. 따라서 변수 a에 조건을 주어 값을 저장하고자 할 때 set 함수 내부에서 다음과 같이 사용할 수 있다.

class TV(val channels : List<String>){

     var a:Int = 9
        set(value) {
            println("값이 변경 되었습니다.")
            field = if(value > 5) value else 0
            println(a) // field의 값 출력
            
        }
        get() {
            println("값이 호출 되었습니다.")
            return field
        }
    
    fun main(array: Array<String>){
    	tv.a = 5 //a의 set 호출로 0이 출력됨
}
값이 변경 되었습니다.
값이 호출 되었습니다.
0

-> 위의 식에서도 main함수 내의 tv.a = 5 에의해 값의 변경인 setter가 우선 호출이 된다. 그 다음 setter내부에서 a를 println(a)로 출력을 위해 호출하였기 때문에 getter내부의 "값이 호출되었습니다"라는 문구가 출력 후 return field에 의해 a값 0이 반환된다. get내부에서도 return a 를 하게되면 a를 리턴하면서 a가 호출이 된것으로 판단하여 계속해서 get을 호출하여 무한 루프에 빠지게 되니 field를 사용하여 a를 대신하여 반환하게 해야한다.

 

setter와 getter는 자바뿐만아니라 코틀린에서도 굉장히 중요하기 때문에 자주 사용하며 익혀야 한다.

 

 

'Programming language > Kotlin' 카테고리의 다른 글

11. 코틀린 - 상속  (0) 2021.08.25
12. 코틀린 - 변수와 접근제어자  (1) 2021.08.25
10. 코틀린 - Class(클래스)  (0) 2021.08.24
9.(2) 코틀린 - 반복문(while문)  (0) 2021.08.24
9. 코틀린 - 반복문(for문)  (0) 2021.08.24
Comments