[Kotlin]get() / set()

dada·2021년 8월 26일
0

Kotlin

목록 보기
7/14
post-thumbnail

✅자바의 캡슐화

  • 자바는 클래스 사용 시 내부의 데이터를 '캡슐화'함.
  • 캡슐화란? 데이터를 다루는 코드를 클래스안에 가두기 위해 필드를 private로 선언하고, getters, setters를 모든 변수의 값을 얻고,세팅하기 위해 다 직접 구현해야함
public class Person{
private String name;
public Person(String name){
this.name=name;}

//getter
public String getName(){return name;}
//setter
public void setName(String name){this.name=name;}
}

필드 쓰려면 객체.getName()

✅코틀린의 특성

  • 코틀린은 변수를 만들어주기만 해도 getter,setter를 내부적으로 생성해줌
  • val 변수는 set으로 값변경 불가하니 get만 자동 생성
  • 참고)코틀린은 기본적으로 scope(범위)가 public임 따라서 자바처럼 class앞에 public을 따로 안써줘도됨 생략 가능.
class Person(var String:name){}  
//생성자 파라미터를 전역변수로 만듦과 동시에 getter,setter를 내부적으로 생성해줌
//이때 name필드는 private로 생성됨

필드 쓰려면 객체.name
//마치 name필드를 바로 갖다 쓰는것처럼 보이지만 내부적으로 getter가 호출된것.

class User {
    var name: String = ""  //프로퍼티 선언시 get,set자동생성
    var address: String = "" //프로퍼티 선언시 get,set자동생성
    val phone: Int = 0 //프로퍼티 선언시 get자동생성

    constructor(name: String, address: String, phone: Int) {
        this.name = name
        this.address = address
        //this.phone=phone :val프로퍼티는 값 변경 불가
    }
}

✅get, set커스텀하기

  • field: 변수의 값
  • value:내가 변수에 할당하려는 값, set의 파라미터로 들어오는 값
  • get 코드 작성 시 get으로 호출될때 반환될 'return'을 반드시 작성
class UserInfo {
    var name: String = ""
        set(value) {
            if (value == "김연아")
                field = "$value 는 천재입니다"
            else field=value
        }
    //get()은 따로 변경하지 않음
    
    var address: String = ""
        set(value) {
            if (value == "한국") {
                field = "대한민국"
            } else field = value
        }
        get() {
            return "$field 에 거주하고 있습니다"
            //println("$field 에 거주하고 있습니다") 불가능! 반드시 return문 작성
        }
        
    var phone: Int = 0

    constructor(name: String, address: String, phone: Int = 321) {
        this.name = name
        this.address = address
        this.phone = phone
    }
}

fun main(args: Array<String>) {
    val user1 = UserInfo("김연아", "한국")
    println(user1.name)
     //김연아 는 천재입니다
    println(user1.address)
    //대한민국 에 거주하고 있습니다
    println(user1.phone)
    //321
   
    val user2 = UserInfo("홍길동", "서울")
    println(user2.name)
    // 홍길동
    println(user2.address)
    //서울 에 거주하고 있습니다
}

class TV2(val chnnels: List<String>) {
    var onOrOff: Boolean = false
    var currentChannel = 0
        set(value) {
            field = value
            if (field > 2) {
                field = 0
            } else field = field
            if (field < 0) {
                field = 2
            } else field = field
        }
        get() {
            println("호출됨")
            return field //get으로 불려나간다는건 어떤 값을 반환해야하니까 return해줘야됨
        }
//field는 원래 있던 값이고 value는 새롭게 할당하는 값임
// 변수에 새로운 값 넣어서=value로 새로운 할당값 들어올때마다 set이 호출됨
//set{}안에다가 currentChnnel=value 할당하면 안됨!! 무한할당->set무한호출
//field에 value값을 넣어주면 set호출 안되고 값만 잘 들어감

 var currentChannel = 0
 set(value) { 
 currentChannel=value}
//이렇게 하면 할당아닐까? 안됨 무한루프빠짐
//currentChnnel에 value할당하면 또 다시 set실행됨 즉 value가 변수에 들어온다=set호출된다
//이러면 계~속 set호출되면서 currentChnnel에 무한히 할당되면서 set무한 실행
//할당될때 set{}코드블럭이 계속 실행되니까 무한반복
//        }

    fun switch() {
        onOrOff = !onOrOff
        if (onOrOff == true) {
            println("TV 켜짐")
        } else {
            println("TV 꺼짐")
        }
    }

    fun chnnelUp() {
        currentChannel++
        println(chnnels.get(currentChannel))
    }

    fun chnnelDown() {
        currentChannel--
        println(chnnels.get(currentChannel))
    }
}

fun main(args: Array<String>) {
    var tv = TV2(listOf<String>("K", "M", "S"))
    tv.switch()
    tv.chnnelUp()
    tv.chnnelUp()
    tv.chnnelUp()
    tv.chnnelUp()
    tv.chnnelUp()
    tv.chnnelUp()
}

참고
https://hongku.tistory.com/347
https://ddolcat.tistory.com/577

profile
'왜?'라는 물음을 해결하며 마지막 개념까지 공부합니다✍

1개의 댓글

comment-user-thumbnail
2022년 1월 30일

get, set에 대해 명료하게 알게 됐네요 ㅎㅎ
좋은 글 감사합니다 :)

답글 달기