#1 ํ๋์ ํ๋กํผํฐ
#1-1 ํ๋กํผํฐ์ ๊ฐ๋
// Java
String name = "steve"; // Field
System.out.println("my name is" + name);
name = "kevin";
---
// Kotlin
var name : String = "steve" // Property
println("my name is" + name)
name = "kevin"
์ฝํ๋ฆฐ์๋ ํ๋์ ์ญํ ์ ํ๋กํผํฐ(์์ฑ)๊ฐ ์ํํ๋ค. ํ๋๋ ๊ฐ ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ ์ ๊ทผํ๋ ๋ ํผ๋ฐ์ค์ ๋จ์ํ ๊ตฌ์ฑ์ด๋ค. ํ๋กํผํฐ๋ ์ฌ๊ธฐ์ ๊ทธ ๊ฐ์ ๋ค๋ฃจ๋ ๋ฉ์๋ ์ฆ, Getter์ Setter๋ฅผ ๊ฒฐํฉํ ๊ฐ๋
์ด๋ค. ํ์ง๋ง, ์ ์ฝ๋์์ ์๋ฐ์ ํ๋ name๊ณผ ์ฝํ๋ฆฐ์ ํ๋กํผํฐ name์ ์๋ก ๋ค๋ฅธ ๊ฒ ์์ด๋ณด์ธ๋ค. ์ด๋ ํ๋กํผํฐ๊ฐ ๋ณด์ ํ Getter์ Setter๊ฐ ์๋ต๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ต๋ ๋ถ๋ถ์ ๋ช
์์ ์ผ๋ก ๋ฐํ์ฐ๋ฉด ์๋๊ณผ ๊ฐ๋ค.
#1-2 ๋ช ์์ get() ๋ฐ set()
// Java
String name = "steve"; // Field
System.out.println("my name is" + name);
name = "kevin";
---
// Kotlin
var name : String = "steve" // Property
get() = field
set(value) {
field = value
}
println("my name is" + name) // println("my name is" + name.get())
name = "kevin" // name.set("kevin")
๋จผ์ , field๋ผ๋ ์ด๋ฆ์ ํค์๋๋ถํฐ ์ค๋ช
ํ๋ค. ์ด field๋ ์ฐ๋ฆฌ๊ฐ ์๋ ์ ํต์ ์ธ ์๋ฏธ์ ํ๋๊ฐ ์๋๋ฉฐ, Backing Field๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ถ๋ฆฐ๋ค. ๋ฐฑํน ํ๋๋ ์์ฒด์ ์ผ๋ก ์กด์ฌํ ์ ์๊ณ , ์ค์ง ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์กด์ฌํ๋, ํ๋กํผํฐ์ ์ข
์๋ ์ ์ฅ์๋ค. value๋ field์ฒ๋ผ ์ฝํ๋ฆฐ์ ํค์๋๋ ์๋๊ณ ๊ทธ๋ฅ ๋งค๊ฐ๋ณ์๋ค. v ๋ผ๋ ์ง argument ๋ผ๋ ์ง๋ก ๊ณ ์ณ์จ๋ ๋๋ค.
์ฝํ๋ฆฐ์์ ๋ณ์ name์ ๊ฐ์ ์ฐธ์กฐํ๊ฑฐ๋ ์ฌํ ๋นํ ๋ ๊ฐ๊ฐ Getter์ Setter์ ์ญํ ์ ์ํํ๋ name.get()๊ณผ name.set()๋ผ๋ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค. ๊ทธ๋ฌ๋, name.get()์ด๋ name.set() ๋ฉ์๋๋ฅผ ์๋ ์ชฝ ์ฝ๋์ ๋ถ์ด ์๋ ์ฃผ์๋ค์ฒ๋ผ ๋ช
์์ ์ผ๋ก ์ธ ์ ์๋ ๊ฑด ์๋๋ค. Getter์ Setter์ ๋์์ ๊ทธ์ ํ๋กํผํฐ๋ช
(๋ ํผ๋ฐ์ค)๋ฅผ ํธ์ถํ๊ฑฐ๋ ํ๋กํผํฐ๋ช
์ ๋์
ํ ๋ ์์์ ์ํ๋ ๋ฟ์ด๋ค.
get() ๋๋ set()์ ํ๋ก๊ทธ๋๋จธ์ ์
๋ง๋๋ก ์ปค์คํ
ํ์ง ์๋ ์ด์ get()๊ณผ set()์ ๋ช
์์ ์ผ๋ก ๋ณผ ์ผ์ ์๋ค. ๋ค์ ์ฝ๋์์ ํ๋ฒ get()๊ณผ set()์ ์
๋ง๋๋ก ์ปค์คํ
ํด๋ณด๊ฒ ๋ค.
#1-3 Getter์ Setter ์ปค์คํ ํ๊ธฐ, var ํ๋กํผํฐ์ val ํ๋กํผํฐ์ ์ฐจ์ด
class PropertyPractice1 {
var name : String = "steve"
get() {
return field[0].uppercase() + field.substring(1) // ์ด๋ฆ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก
}
set(value) {
field = value.replace(" ", "") // ๋ชจ๋ ๊ณต๋ฐฑ ์ ๊ฑฐ
}
}
fun main() {
val instance = PropertyPractice1()
println("my name is " + instance.name)
instance.name = "k e v i n"
println("my name is " + instance.name)
}
/* ์คํ ๊ฒฐ๊ณผ:
* my name is Steve
* my name is Kevin
*/
PropertyPractice1.name๊ณผ ๊ฐ์ var ํ๋กํผํฐ๋ get()๊ณผ set() ๋ ๋ค ๋ณด์ ํ๊ณ ์๋ค. ๋ฐ๋ฉด, val ํ๋กํผํฐ๋ get()๋ง์ ๋ณด์ ํ๋ค. ๋ฐ๋ผ์, ๋ง์ฝ ์์ ์ฝ๋์์ name ํ๋กํผํฐ๊ฐ val์ด์๋ค๋ฉด set() ๋ถ๋ถ์ ์กด์ฌํ ์ ์๋ค.
#2 private ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ
class PropertyPractice2 {
private var name : String = "steve"
get() {
return field[0].uppercase() + field.substring(1) // ์ด๋ฆ ์ฒซ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก
}
set(value) {
field = value.replace(" ", "") // ๋ชจ๋ ๊ณต๋ฐฑ ์ ๊ฑฐ
}
val nameData : String
get() = name
}
fun main() {
val instance = PropertyPractice2()
// ↓ Error
// println("my name is " + instance.name)
// ↓ ์ ์ ์๋
println("my name is " + instance.nameData)
}
/* ์คํ ๊ฒฐ๊ณผ:
* my name is Steve
*/
์๋ฐ์์ Getter์ Setter์ public ์ ๊ทผ์ ์ด์๋ฅผ ๋ถ์ฌ์, privateํ ํ๋๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ฌ์ค์ ํ ๋ ์ฐ๊ณค ํ๋ค. ์ฝํ๋ฆฐ์์๋ ํ๋กํผํฐ ์ธ๋ถ์ ๋ฉ์๋, ์๋ฅผ๋ค์ด getName()์ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค. ์ด ๋, ์ฝํ๋ฆฐ์์๋ ๋ฉ์๋๊ฐ ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ๋ฐ๋ก, ๋ค๋ฅธ public ํ๋กํผํฐ์ get()์ด privateํ ์์ ์ get()์ ๋ฐํํ๊ฒ ๋ง๋ค๋ฉด ๋๋ค.
#3 ๋ฐฑํน ํ๋(Backing Field)์ ๋ถ์ฌ(Absence) ์ดํดํ๊ธฐ
var name : String = "steve" // error
get() {
return ""
}
set(value) {
return
}
#1-2์ ์๋ PropertyPractice1 ํด๋์ค์ name ํ๋กํผํฐ๋ฅผ ์์ ๊ฐ์ด ๊ณ ์น๋ฉด, ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น? ๋ฐ๋ก, "Initializer is not allowed here because this property has no backing field"๋ผ๋ ์๋ฌ๋ฅผ ๋ฑ๋๋ค. ํด์ํ๋ฉด, "์ด ํ๋กํผํฐ์๋ ๋ฐฑํน ํ๋๊ฐ ์์ผ๋ฏ๋ก ์ด๊ธฐํ๊ฐ ํ์ฉ๋์ง ์์ต๋๋ค"๋ค. get()๊ณผ set() ์ด๋ ์ชฝ์๋ field ํค์๋๊ฐ ์ฐ์ด์ง ์์ ๋, ์ด๊ธฐํ ์ฝ๋๋ฅผ ์จ๋ฃ์ผ๋ฉด ์ด ์๋ฌ๊ฐ ๋๋ค. ์ ์ฝ๋๋๋ก๋ผ๋ฉด name์ ๋ฌด์จ ๊ฐ์ ํ ๋น(Setter)ํ๋ , ์ธ์ ์ฐธ์กฐ(Getter)ํ๋ "steve"๋ผ๋ ์ด๊ธฐํ ๊ฐ์๋ ์ ๋ ๋๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๊ธฐํ๋ฅผ ํ๋ ์๋ฏธ๊ฐ ์๋ค. ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ์ํด ๋ฐฑํน ํ๋๋ ์์ฑ๋์ง ์๋ ๊ฒ์ด๋ค. #1-2์์ ๋ฐฑํน ํ๋๋ ์์ฒด์ ์ผ๋ก ์กด์ฌํ ์ ์๊ณ , ์ค์ง ํ๋กํผํฐ์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์กด์ฌํ๋, ํ๋กํผํฐ์ ์ข ์๋ ์ ์ฅ์๋ผ๊ณ ํ๋ค. ์ ์ฅ์๊ฐ ์์ผ๋ ํ๋กํผํฐ์ ๊ฐ์ ๋ฃ์ ์ ์๋ค. ๊ทธ๋์ ์๋ฌ๊ฐ ๋๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] ๋๋ค(Lambda) ํํ์ (0) | 2024.02.01 |
---|---|
[Kotlin] ํจ์ ํ์ (Fuction types) ํํ์ (0) | 2024.01.31 |
[Kotlin] ํจ์ํ ์ธํฐํ์ด์ค (Single Abstract Method Interface) (0) | 2024.01.30 |
[Kotlin] ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ (Operator overloading) (0) | 2024.01.29 |
[Kotlin] ํ์ฅ ํจ์(Extension functions) (0) | 2023.12.16 |