์ต์์ ํ๋กํผํฐ
ํด๋์ค์ ์์๋์ง ์์ ํ๋กํผํฐ๋ ์ ์ญ ๋ณ์/์์์ ์ญํ
public/internal/private ๋ฑ์ ๊ฐ์์ฑ ์ง์ ์ด ๊ฐ๋ฅ
private val prefix = "Hello, "
fun main() {
val name = readLine() ?: return
println("$prefix$name")
}
๋ฆ์ ์ด๊ธฐํ
์์ฑ์์์ ์ด๊ธฐํ ๋์ง๋ ์์ง๋ง, ํ๋ก๊ทธ๋จ ํ๋ฆ ์ ์ค์ฌ์ฉ ์๋ ์ด๊ธฐํ ๋๋ ๊ฒ์ด ๋ช ๋ฐฑํ ๋ณ์์๋ lateinit์ด๋ผ๋ ์์ฝ์ด๋ก ํ๊ธฐํ์ฌ null ๊ฐ์ด ๋ถ๊ฐํจ์ ํ๊ธฐํ ์ ์๋ค.
์ค์ ์ด๊ธฐํ๊ฐ ์๋ ๊ฒฝ์ฐ UninitializedPropertyAccessException์ด ๋ฐ์ํ๋ฏ๋ก !!๋ฅผ ์ฌ์ฉํ ๊ฒ๊ณผ ๋น์ทํ ํน์ฑ์ ๊ฐ์ง๋ค. (๊ฐ๋ฅํ๋ฉด by lazy ์ฌ์ฉ์ ๊ถ์ฅ)
class Content {
lateinit var text: String // ์ค์ฌ์ฉ๋๊ธฐ ์ loadFile์ด ๋ฐ๋์ ์ฌ์
// ํธ์ถ๋์ด ์ด๊ธฐํ ๋จ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํ์ธ
fun loadFile(file: File) {
text = file.readText()
}
}
์ปค์คํ ์ ๊ทผ์
ํ๋กํผํฐ์ ๋ํ ์ ๊ทผ์ ํจ์๋ก ์ํ
class Person(val firstName: String, val familyName: String) {
val fullName: String
get() {
return "$firstName $familyName"
}
}
๋ท๋ฐ์นจ ํ๋ ํ๋
• ์ปค์คํ ์ ๊ทผ์ ๊ฒํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ท๋ฐ์นจํ๋ ํ๋๋ฅผ๋์ด๊ฐ์์ ์ฅํ ์์๋ค.
• ์ด ๊ฒฝ์ฐ field๋ผ๋ ์์ฝ์ด๋ก ํด๋น ํ๋์ ์ ๊ทผํ๋ค.
class Person(val firstname: String: val familyName: String, age: Int) {
val age: Int = age
get(): Int {
println("Accessing age")
return field
}
}
๊ฐ๋ณ ํ๋กํผํฐ๋ฅผ ์ํ ์ธํฐ (setter)
• var ํ๋กํผํฐ๋ฅผ ์ํด์๋ set(value)๋ฅผ ํตํ์ฌ setter๋ฅผ ๋ ์ ์๋ค
class Person(val firstName: String, val familyName: String) {
var age: Int? = null
set(value) {
if (value != null && value <= 0) {
throw IllegalArgumentException("Invalid age: $value")
}
field = value
}
}
fun main() {
person.age = 20 // ์ปค์คํ
์ธํฐ๋ฅผ ํธ์ถ
๋ท๋ฐ์นจํ๋ ํ๋๊ฐ ์๋ ๊ฐ๋ณ ํ๋กํผํฐ
class Person(var firstName: String, var familyName: String) {
var fullName
get() = "$firstName $familyName"
set(value) {
val names = value.split(" ")
if (names.size != 2) throw IllegalArgumentException("Invalid full name: $value")
firstName = names[0]
familyName = names[1]
}
}
ํ๋กํผํฐ ์ ๊ทผ์๋ฅผ ํตํ ์ ๊ทผ ํต์
• ํ๋กํผํฐ์ get / set ๊ฐ๊ฐ์ ๋ํ์ฌ ๋ค๋ฅธ ์ ๊ทผ์๋ฅผ ๋์ด ์ ๊ทผ์ ํต์ ํ ์ ์๋ค.
• ๋ณดํตํด๋์ค ์ธ๋ถ์์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ์ฝ์ ์๋ ์๋๋ก ํ ๋ ์ฌ์ฉํ๋ค.
class Person(name: String) {
var lastChanged: Date? = null
private set //Person ํด๋์ค ๋ฐ์์๋ ๋ณ๊ฒฝ ๋ถ๊ฐ
var name: String = name
set(value) {
lastChanged = Date()
field = value
}
}
์ง์ฐ ๊ณ์ฐ ํ๋กํผํฐ
• ํ๋กํผํฐ ์ ๊ทผ๋๊น์ง ํ๋กํผํฐ์ ๊ฐ์ ๋ํ ์ฐ์ฐ์ ์ง์ฐ
• lateinit๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ ์์ ํ๋ฏ๋ก ๊ถ์ฅ๋๋ค.
import java.io.File
val text by lazy {
File("data.txt").readText()
}
fun main() {
while (true) {
when (val command = readLine() ?: return) {
"print data" -> println(text) // ์ฒ์ text ๊ฐ ์ ๊ทผ๋ ๋ ์ด๊ธฐํ
"exit" -> return
}
}
}
๊ฐ์ฒด (object)
• ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ์กด์ฌํ๋ ํด๋์ค๋ object๋ผ๋ ํค์๋๋ก ์ ์ํ๋ฉฐ ๊ฐ์ฒด๋ผ ๋ถ๋ฅธ๋ค.
object Application {
val name = "My Application"
override fun toString() = name
fun exit() { }
}
• ์ด๋ฌํ ๊ฐ์ฒด๋ ์ ์ธ๊ณผ ๋์์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
fun main() {
println(Application) // ํด๋น ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐ
}
๋ดํฌ ๊ฐ์ฒด
• ํน์ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉ
• ํฉํ ๋ฆฌ ๋์์ธ ํจํด ์์
class Application private constructor(val name: String) {
object Factory {
fun create(args: Array<String>): Application? {
val name = args.firstOrNull() ?: return null
return Application(name)
}
}
}
fun main(args: Array<String>) {
val app = Application.Factory.create(args) ?: return
println("Application started: ${app.name}")
}
๋๋ฐ ๊ฐ์ฒด
• ์์ ์์ ์์ Factory๋ผ๋ ๋ด๋ถ๊ฐ์ฒด๋ช ์ ๋งค๋ฒ ๋ช ์ํด์ผ ํ๋ค.
• companion object๋ก ์ ์ธํ๋ฉด ๋ด๋ถ๊ฐ์ฒด๋ช ์ ์๋ตํ ์ ์๋ค.
class Application private constructor(val name: String) {
companion object {
fun create(args: Array<String>): Application? {
val name = args.firstOrNull() ?: return null
return Application(name)
}
}
}
fun main(args: Array<String>) {
val app = Application.create(args) ?: return
println("Application started: ${app.name}")
}
๊ฐ์ฒด์์ ํตํ ์ต๋ช ๊ฐ์ฒด ์ ์
• ์ต๋ช
์ ๊ฐ์ฒด๋ฅผ ํ๋ก๊ทธ๋จ ํ๋ฆ์ ์์ฑํ๊ณ ์ ํ ๋๋ object ์ฌ์ฉ
• ์ต๋ช ๊ฐ์ฒด๋ ์ง์ญ ์ ์ธ์ด๋ ๋น๊ณต๊ฐ ์ ์ธ์ผ๋ก๋ง ๊ฐ๋ฅ
fun main() {
fun midPoint(xRange: IntRange, yRange: IntRange) = object {
val x = (xRange.first + xRange.last) / 2
val y = (yRange.first + yRange.last) / 2
}
val midPoint = midPoint(1 .. 5, 2 .. 6) //val midPoint๊ฐ ์ต๋ช
๊ฐ์ฒด
println("${midPoint.x}, ${midPoint.y}") // 3, 4
}
'๐ปโโ๏ธ์ ๊ณต๊ณต๋ถ > ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด๋์ค (0) | 2023.09.09 |
---|---|
ํจ์ (2) | 2023.09.02 |
์ฝํ๋ฆฐ ๊ธฐ์ด (0) | 2023.09.02 |
์ฝํ๋ฆฐ ๋ฌธ๋ฒ (0) | 2023.08.31 |