[Kotlin] get() / set()
자바
- 자바는 클래스 사용 시 내부의 데이터를 '캡슐화'함.
- 캡슐화란? 데이터를 다루는 코드를 클래스안에 가두기 위해 필드를 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
Author And Source
이 문제에 관하여([Kotlin] get() / set()), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dabin/Kotlin-get-set저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)