관리 메뉴

Bbaktaeho

코틀린(Kotlin) 17. 게터와 세터(get, set) 본문

프로그래밍 (Programming)/코틀린 (Kotlin)

코틀린(Kotlin) 17. 게터와 세터(get, set)

Bbaktaeho 2019. 2. 22. 17:15

코틀린에서 속성이란)

최상위 변수(함수나 클래스 외부에 정의된 변수)나 클래스의 멤버 변수로 선언하면 속성으로 간주된다. 클래스의 멤버 변수는 모두 private 제한자로 지정된다. 따라서 해당 클래스의 내부의 게터와 세터를 통해서만 속성을 참조할 수 있다.

val a : String = "최상위" //최상위 변수(게터만 생성)

fun main() {

val MyCar = Car("GDI")

val YourCar = Car()

}

class Car

{

var engine: String //클래스의 멤버 변수(게터,세터 생성)

var tire: String //클래스의 멤버 변수(게터,세터 생성)

var door: Int //클래스의 멤버 변수(게터,세터 생성)

constructor(engine: String = "누우", tire: String = "한국타이어", door: Int = 4)

{

this.engine = engine

this.tire = tire

this.door = door+1

}

}

클래스 속성의 값을 가져오는 것을 게터라고 하고 속성의 값을 변경하는 것을 세터라고 한다.

코틀린에서 속성을 선언하면 게터와 세터가 자동으로 생성된다. 단 변수를 val 로 선언했을 경우 게터만 생성된다.

getter, get)

기본적으로 게터는 자동 호출되어 값을 가져온다.

fun main() {

val MyCar = Car()

println("MyCar.engine = ${MyCar.engine}") //getEngine()

println("MyCar.tire = ${MyCar.tire}") //getTire()

println("MyCar.door = ${MyCar.door}") //getDoor()

}

class Car

{

var engine: String = "현대" //클래스의 멤버 변수

var tire: String = "한국타이어" //클래스의 멤버 변수

var door: Int = 4 //클래스의 멤버 변수

}

당연하게 생각했던 호출 과정이지만 사실 내부에선 get속성이름() 으로 생성되어 동작한다.

추가적인 처리가 필요할 때는 게터를 변경해야 한다. 코틀린에서는 get() 을 사용하면 해당 속성을 참조할 때 실제 게터가 자동으로 호출된다.

fun main() {

val MyCar = Car()

println("MyCar.engine = ${MyCar.engine}") //getEngine()

println("MyCar.tire = ${MyCar.tire}") //getTire()

println("MyCar.door = ${MyCar.door}") //getDoor()

}

class Car

{

var engine: String = "현대" //클래스의 멤버 변수

get()

{

println("속성 engine의 게터 호출")

if (field == "현대") return "현대자동차 엔진"

else return "엔진 없음"

}

var tire: String = "한국타이어" //클래스의 멤버 변수

get()

{

println("속성 tire의 게터 호출")

if (field == "한국타이어") return "No.1 한국타이어"

else return "바퀴 없음"

}

var door: Int = 4 //클래스의 멤버 변수

get()

{

println("속성 door의 게터 호출")

if (field == 4) return 4+1 //적재함 문을 더해줌

else return 0

}

}

실행 결과는

속성 engine의 게터 호출

MyCar.engine = 현대자동차 엔진

속성 tire의 게터 호출

MyCar.tire = No.1 한국타이어

속성 door의 게터 호출

MyCar.door = 5

field 키워드는 get()와 set() 내부에서 속성값을 직접 가져오거나 변경할 수 있고, 또 내부에서 게터와 세터가 호출되지 않도록 해준다. 따라서 속성을 참조할 때 발생하는 재귀 호출을 막을 수 있다.

setter, set)

기본적으로 세터는 자동 호출되어 값을 수정할 수 있다.

fun main()

{

val MyCar = Car()

MyCar.engine = "기아" //setEngine("기아")

MyCar.tire = "미국타이어" //setTire("미국타이어")

MyCar.door = 2 //setDoor(2)

println("MyCar.engine = ${MyCar.engine}") //getEngine()

println("MyCar.tire = ${MyCar.tire}") //getTire()

println("MyCar.door = ${MyCar.door}") //getDoor()

}

class Car

{

var engine: String = "현대" //클래스의 멤버 변수

var tire: String = "한국타이어" //클래스의 멤버 변수

var door: Int = 4 //클래스의 멤버 변수

}

실행 결과는

MyCar.engine = 기아

MyCar.tire = 미국타이어

MyCar.door = 2

게터와 마찬가지로 내부에서 set속성이름() 으로 동작한다.

set()을 사용한 코드를 보자.

fun main() {

val MyCar = Car()

println("MyCar.engine = ${MyCar.engine}") //getEngine()

println("MyCar.tire = ${MyCar.tire}") //getTire()

println("MyCar.door = ${MyCar.door}") //getDoor()

println()

MyCar.engine = "기아" //setEngine("기아")

MyCar.tire = "미국타이어" //setTire("미국타이어")

MyCar.door = 2 //setDoor(2)

println()

println("MyCar.engine = ${MyCar.engine}")//getEngine()

println("MyCar.tire = ${MyCar.tire}") //getTire()

println("MyCar.door = ${MyCar.door}") //getDoor()

}

class Car

{

var engine: String = "현대" //클래스의 멤버 변수

get()

{

println("속성 engine의 게터 호출")

if (field == "현대") return "현대자동차 엔진"

else if (field == "기아") return "기아자동차 엔진"

else return "엔진 없음"

}

set(value)

{

println("속성 engine의 세터 호출")

field = value

}

var tire: String = "한국타이어" //클래스의 멤버 변수

get()

{

println("속성 tire의 게터 호출")

if (field == "한국타이어") return "No.1 한국타이어"

else if(field == "미국타이어") return field

else return "바퀴 없음"

}

set(value)

{

println("속성 tire의 세터 호출")

field = value

}

var door: Int = 4 //클래스의 멤버 변수

get()

{

println("속성 door의 게터 호출")

if (field == 4) return 4+1 //적재함 문을 더해줌

else if (field == 2) return 2+1

else return 0

}

set(value)

{

println("속성 door의 세터 호출")

field = value

}

}

실행 결과

속성 engine의 게터 호출

MyCar.engine = 현대자동차 엔진

속성 tire의 게터 호출

MyCar.tire = No.1 한국타이어

속성 door의 게터 호출

MyCar.door = 5

속성 engine의 세터 호출

속성 tire의 세터 호출

속성 door의 세터 호출

속성 engine의 게터 호출

MyCar.engine = 기아자동차 엔진

속성 tire의 게터 호출

MyCar.tire = 미국타이어

속성 door의 게터 호출

MyCar.door = 3

set(value) 에서 value 키워드로 속성을 수정한다.


반응형