μ§λ¬Έ
κ°μ²΄μ ꡬ쑰체μ μ°¨μ΄μ μ?
ν΄λμ€λ μμμ§μ&μ°Έμ‘° νμ, ꡬ쑰체λ κ° νμ, μμ λ° λ©μλ μ§μ νμ§ μμ.
ν¨μκ° μλ£κ΅¬μ‘° μμΌλ‘ λ€μ΄μ€λ©΄ μ΄λ€ μ₯μ μ΄ μκΈ°λκ°?
μ μ 보 μλμ κ°μ²΄ κΈ°λ°μμλ§ κ°λ₯νκ°?
λ°μμ μ¬μ© ν μ μκ² μ μΈ
var time:Double
private Set
4ν΄λμ€λ?
λ³μμ λ©μλλ₯Ό κ°μ§λ νμ μ μ μνλ λ¨μ
ν΄λμ€ μ μΈ
class Person{
//νλ‘νΌν°
var firstName: String = ""
var familyName: String = ""
var age: Int = 0
//λ©μλ
fun fullName() = "$firstName $familyName"
fun showMe() {
println("${fullName()}: $age")
}
}
κ°μ²΄μ μμ±
val person = Person()// personμ΄λΌλ κ°μ²΄μ μ°Έμ‘°μλ³μκ° μλ‘κ² μμ±ν Personκ°μ²΄λ₯Ό κ°λ¦¬ν΄
person.firstName = "John"
person.familyName = "Doe"
person.age = 25
person.showMe() // John Doe: 25
μμ±μ
class Person(firstName: String, familyName: String) {
val fullName = "$firstName $familyName"
}
fun main() {
val person = Person("John", "Doe")
println(person.fullName)
}
initλΈλ‘
νλμ μμΌλ‘ νννκΈ° νλ μ΄κΈ°ν λ‘μ§μ μ€νν΄μΌ ν λλ init λΈλ‘μ μ¬μ©νλ€.
class Person(fullName: String) {
val firstName: String
val familyName: String
init {
val names = fullName.split(" ")
if (names.size != 2) {
throw java.lang.IllegalArgumentException ("Invalid name: $fullName")
}
firstName = names[0]
familyName = names[1]
}
}
fun main() {
val person = Person("John Doe")
println(person.firstName)
}
νλ‘νΌν°
νλ‘νΌν°λ λ°λμ μ΄κΈ°νλμ΄μΌ νλ€.
class Person(fullName: String) {
val firstName: String
val familyName: String
init {
val names = fullName.split(" ")
if (names.size == 2) { // namesμ ν¬κΈ°κ° 2κ° μλκ²½μ°
firstName = names[0] // firstName, familyNameμ΄ μ΄κΈ°ν λμ§μμΌλ―λ‘ error λ°μ
familyName = names[1]
}
}
}
μ£Όμμ±μμ λΆμμ±μ
μ£Όμμ±μ
• μ£Όμμ±μ νλΌλ―Έν°λ νλ‘νΌν° μ΄κΈ°νλ init λΈλ‘ μμμλ§ μ¬μ©ν μ μμ.
class Person(firstName: String, familyName: String) {
val fullName = "$firstName $familyName"
fun printFirstName() {
println(firstName) // Error: firstName is not available here
}
}
• μμ±μ νλΌλ―Έν° μ μ μμ valμ΄λ varλ₯Ό λΆμ΄λ©΄ νλΌλ―Έν°λ₯Ό νλ‘νΌν°λ‘ λ§λ€ μ μλ€.
class Person(val firstName: String, val familyName: String) { ...
λΆμμ±μ
νλ μ΄μμ μμ±μλ₯Ό μ μνκ³ μΆμ λλ fun ν¨μ λμ constructorλΌλ μμ½μ΄λ‘ μΆκ° μμ±μλ₯Ό μ μνλ€.
class Person {
val fullName: String
constructor(firstName: String, familyName: String):
this("$firstName $familyName")
constructor(fullName: String) {
this.fullName = fullName
}
}
constructorμμ½μ΄λ‘ μμ±ν건 λΆμμ±μ!
this():κΈ°λ³Έμμ±μμκ² μμ. 첫λ²μ§Έ 보쑰 μμ±μμμ μ¬μ©
this.fullName: μ§μ ν λΉ. λλ²μ§Έ 보쑰 μμ±μμ μ¬μ©
λ©€λ² κ°μμ±
ν΄λμ€ λ΄λΆ νλ‘νΌν°, λ©μλλ§λ€ κ°μμ± μ€μ κ°λ₯νλ€.
• public: λ©€λ²λ₯Ό μ΄λμλ λ³Ό μ μλ€. (λν΄νΈ)
• internal: μ»΄νμΌ λͺ¨λ λ΄λΆμμλ§ λ©€λ²λ₯Ό λ³Ό μ μλ€.
• protected: λ©€λ²κ° μν ν΄λμ€μ κ·Έ νμ ν΄λμ€μμ λ³Ό μ μλ€.
• private: λ©€λ²κ° μν ν΄λμ λ΄λΆμμλ§ λ³Ό μ μλ€.
μμ
class Person(private val firstName: String, private val familyName: String) {
fun fullName() = "$firstName $familyName"
}
• firstNameκ³Ό familyNameμ ν΄λμ€ λ°μμλ λ³Ό μ μλ€.
• fullName()μ μ΄λμλ λ³Ό μ μλ€
μ£Όμμ±μ κ°μμ±
• μ£Όμμ±μμ publicμΈμ κ°μμ±μ μ£Όκ³ μΆμ κ²½μ°
class Empty private constructor() {
fun showMe() = println("Empty")
}
• Emptyμ μ μΌν μμ±μκ° privateμ΄λ―λ‘ class μΈλΆμμ μΈμ€ν΄μ€ν ν μ μμ
nedsted class: ν΄λμ€ μμ ν΄λμ€λ₯Ό μ μΈν μ μλ€.
class Person (val id: Id, val age: Int) {
class Id(val firstName: String, val familyName: String)
fun showMe() = println("${id.firstName} ${id.familyName}, $age")
}
fun main() {
val id = Person.Id("John", "Doe")
val person = Person(id, 25)
person.showMe()
}
inner class
λ΄ν¬λ ν΄λμ€μ innerλ₯Ό μ μΈνλ©΄ λ΄λΆ ν΄λμ€ (inner class)κ° λμ΄ λ΄λΆ μΈμ€ν΄μ€κ° μΈλΆ μΈμ€ν΄μ€ 1κ°μ μμλκ² λλ€.
• λ΄λΆ μΈμ€ν΄μ€λ μμ μ΄ μμλ μΈλΆ μΈμ€ν΄μ€μ λ©€λ²μ μ κ·Όν μ μλ€.
• λ΄λΆ μΈμ€ν΄μ€ μμ±μ μμ μ΄ μμλ μΈλΆ μΈμ€ν΄μ€λ₯Ό λͺ μν΄μΌ νλ€.
class Person(val firstName: String, val familyName: String) {
inner class Possession(val description: String) {
fun showOwner() = println(fullName())
}
private fun fullName() = "$firstName $familyName"
}
fun main() {
val person = Person("John", Doe")
val wallet = person.Possession("Wallet")
wallet.showOwner() // John Doe
}
class Person(val firstName: String, val familyName: String) {
inner class Possession(val description: String) {
fun showOwner() = println(fullName())
fun getOwner() = this@Person // μΈλΆ Person μΈμ€ν΄μ€λ₯Ό λ°ν
}
val myWallet = Possession("Wallet") // this.Possession("Wallet")κ³Ό κ°μ
fun fullName() = "$firstName $familyName"
}
local class
ν¨μ λ΄μ classλ₯Ό μ μν κ²½μ°
μ§μ ν΄λμ€λ μμ μ λλ¬μΌ μ½λμ λ©€λ²μ μ κ·Ό κ°λ₯νλ€.
fun main() {
var x = 1
class Counter {
fun increment() {
x++ //μμ μ λλ¬μΌ μ½λμ λ©€λ²
}
}
Counter().increment()
println(x) // 2
}
null
μ μ: μ무κ²λ μ°Έμ‘°νμ§ μλ μ°Έμ‘°κ°μ νΉλ³ν μν
• nullμ λν΄μ λ©€λ² μ κ·Όμ μλνλ©΄ NullPointerExceptionμ΄ λ°μ
• μ»΄νμΌμκ°μ νμ μ΄ λμ§ μμ μ΅μ μμλ¬ μ€ νλλ‘ κ°μ£Ό
• Kotlinμμλ μΌλ° μ°Έμ‘°νμλ nullμ λ΄μ μ μλ€.
fun isLetterString(s: String): Boolean {
if (s.isEmpty()) return false
for (ch in s) {
if (!ch.isLetter()) return false
}
return true
}
fun main() {
println(isLetterString("abc")) // Ok
println(isLetterString(null)) // μ»΄νμΌ μλ¬
}
λμ΄ λ μ μλ νμ (nullable)
μ°Έμ‘°μμ νμ λ€μ ?(λ¬Όμν)λ₯Ό λΆμΈλ€.
λμ΄ λ μ μλ νμ μ λ³μλ₯Ό μΌλ° νμ λ³μμ λμ νλ©΄ nullκ°λ₯μ± λλ¬Έμ μ»΄νμΌ μλ¬κ° λ°μνλ€.
fun isBooleanString(s: String?) = s == "false" || s == "true"
fun main() {
println(isBooleanString(null)) // Ok
val s: String? = "abc" // Ok
val ss: String = s //Error: type mismatch
}
λμ΄ λ μ μλ νμ μ λν λ©€λ²μ κ·Ό
• λμ΄ λ μ μλ νμ μ κΈ°λ³Ένμ μ λ©€λ²μ κ·Ό λ±μ μ°μ°μ λ°λ‘ μννλ € ν κ²½μ° μ»΄νμΌ μλ¬κ° λ°μνλ€.
fun isLetterString(s: String?): Boolean {
if (s.isEmpty()) return false // Error
for (ch in s) { // Error
if (!ch.isLetter()) return false
}
return true
}
λκ°λ₯μ± μ κ±°λ₯Ό ν΅ν μ€λ§νΈμΊμ€νΈ
• νλ‘κ·Έλ¨ νλ¦μμ nullμΈ κ²½μ°κ° λ Όλ¦¬μ μΌλ‘ λ°°μ λλ©΄ μ»΄νμΌλ¬λ μ΄λ₯Ό μΈμ§νκ³ λ κ°λ₯μ±μ μ κ±°νκ³ μ»΄νμΌνλ€.
fun isLetterString(s: String?): Boolean {
if (s == null) return false
//μ΄ μμ λΆν° sκ° nullμ΄ μλμ΄ λͺ
λ°±
if (s.isEmpty()) return false
for (ch in s) {
if (!ch.isLetter()) return false
}
return true
}
쑰건문 λ΄μμμ μ€λ§νΈ μΊμ€νΈ
when, 루νμμμ 쑰건 κ²μ¬
fun describeNumber(n: Int?) = when {
null -> "null"
n >= 0 && n <= 10 -> "small"
n >= 11 && n <= 100 -> "large"
else -> "out of range"
}
||λ &&μ°μ°μ μ€λ§νΈ μΊμ€νΈ
fun isSingleChar(s: String?) = s != null && s.length == 1
κ°μ²΄μ κ°λ³ νλ‘νΌν°μ μ€λ§νΈ μΊμ€νΈ
• κ°μ²΄μ κ°λ³ νλ‘νΌν°λ μ€λ§νΈμΊμ€νΈκ° λΆκ°λ₯ νλ€.
• νλ‘κ·Έλ¨ λ€λ₯Έ μ΄λ€κ³³μμ κ°μ λ°κΏ μ μκΈ° λλ¬Έ
class MyString {
var str: String?
fun isStrEmpty(): Boolean {
if (str == null) return true
if (str.isEmpty()) return true
else return false // Error
}
λ μλ λ¨μΈμ°μ°μ(!!)
• λμ΄ λ μ μλ νμ μ λνμ¬ νλ‘κ·Έλλ¨Έκ° λμ΄ μλλΌκ³ νμΈν΄ μ£Όλ μ°μ°μ
• κ·ΈλΌμλ λΆκ΅¬νκ³ λμ΄μμ κ²½μ° KotlinNullPointerExceptionμ΄ λ°μνλ€.
• λ μλ λ¨μΈμ°μ°μλ λ°λμ νμν κ²½μ°λ₯Ό μ μΈνκ³ λ μ¬μ©νμ§λ§ κ²
• μ) fun readInt() = readLine()!!.toInt()
• readLine()μnullμλ°νν μμλ€.
• μλ¬Έμ₯λνΌν μμμΌλ©΄νΌνλκ²μ΄μ’λ€.
• μμμμreadInt()μλ°ννμIntμ΄λ€.(λμ΄λ μμμ)
μμ ν νΈμΆ μ°μ°μ
• μ) fun readInt() = readLine()?.toInt()
• μμ κ°μ²΄κ° λμ΄ μλκ²½μ°μλ μλ―Έμλ μΌμ νκ³ , λμΈ κ²½μ°μλ λμ λ°ννλ€.
• μμ μμ μμ readLine()μ΄ λμ λ°ννλ©΄ toInt() μμ μ νμ§ μκ³ μ 체 λ¬Έμ₯μ΄ nullμ λ°νν¨
• κ²°κ³Όμ μΌλ‘ readInt()λ λμ λ°νν μλ μκ² λμ΄ λ°ν νμ μ΄ Int?κ° λ¨
μλΉμ€ μ°μ°μ
μ°μ°μ μΌμͺ½μ κ°μ΄ nullμΈ κ²½μ° μ°μ°μ μ€λ₯Έμͺ½ κ°μΌλ‘ μΉννλ€.
• fun readInt() = readLine()?.toInt() ?: 0
• μμμ readLine()μ΄ nullμΈ κ²½μ° readLine()?.toInt() κ°μ΄ nullμ΄λλ€. μ΄ λ μ΄ nullμ ?: 0μ΄ 0μΌλ‘ μΉννλ€.
• κ²°κ³Όμ μΌλ‘ readInt()λ nullμ λ°νν κ°λ₯μ±μ΄ μμ΄μ§λ―λ‘ λ°ννμ΄ Intκ° λλ€.
fun sayHello(name: String?) {
println("Hello, " + (name ?: "Unknown"))
}
fun main() {
sayHello("John") // Hello, John
sayHello(null) // Hello, Unknown
}
μ€μ΅μ½λ
class Car(
val name:String,
var speed: Double=0.0) {
var distance: Double? = 0.0
}
class Track{
private val cars = Array<Car?>(8){_->null}
private var numCars:Int = 0
private var time:Double =0.0
fun getTime():Double{
return time
}
fun addCar(c:Car){
cars[numCars]=c
numCars++
}
fun timePassed(t:Double){
for(i:Int in 0 until numCars) {
val c: Car? = cars[i]
c?.distance = c?.distance?.plus(t * c.speed)
}
time +=t
}
fun removeCar(num:Int){
cars[num] =null
}
}
fun main() {
val track = Track()
val a = Car("Alpha")
track.addCar(a)
val b = Car("Bravo",30.0)
track.addCar(b)
while (true){
track.timePassed(1.0)
a.speed=a.speed+1.0
if ((a.distance?:0.0)> (b.distance?:0.0)){
println("${a.name} passed ${b.name} at ${track.getTime()}")
break
}
}
}
2λ²μ€μ ?λ₯Ό μ¨μΌνλ μ΄μ
λμ€μ distanceμ null ν λΉν μ μμ
8,9,10λ²μ€μ privateμΈ μ΄μ
cars, numCars, time λ³μλ Track ν΄λμ€ λ΄λΆμμλ§ μ¬μ©λμ΄μΌ νκΈ° λλ¬Έμ privateλ‘ μ μΈ
42λ²μ€ if(a.distance > b.distance)μλ μ΄μ
μ΄ λΆλΆμμ a.distanceμ b.distanceλ λ λ€ nullableν Double? νμ
μΌλ‘ μ μΈλμμ΅λλ€.
nullable λ³μλ₯Ό μ§μ λΉκ΅ν λ ?: μ°μ°μλ₯Ό μ¬μ©νλ©΄ null κ°μ΄ μλ κ²½μ° κΈ°λ³Έκ°μ μ§μ ν μ μμ΅λλ€.
μ¦, a.distance ?: 0.0μ b.distance ?: 0.0λ κ°κ° a.distanceμ
b.distance κ°μ΄ nullμΈ κ²½μ° 0.0μ μ¬μ©ν©λλ€.
λ°λΌμ μ΄ λΆλΆμ a.distanceμ b.distance μ€ νλλΌλ nullμ΄λ©΄ 0.0μΌλ‘ κ°μ£Όνκ³ λΉκ΅ν©λλ€.
μ΄κ²μ΄ μνλ λμμ΄ μλλΌλ©΄, nullμΈ κ²½μ°λ₯Ό λ°λ‘ μ²λ¦¬ν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄,
a.distanceμ b.distanceκ° nullμ΄λ©΄ λΉκ΅λ₯Ό μ€ν΅νλλ‘ ν μ μμ΅λλ€.
'π»ββοΈμ κ³΅κ³΅λΆ > κ°μ²΄μ§ν₯νλ‘κ·Έλλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νλ‘νΌν° (0) | 2023.09.15 |
---|---|
ν¨μ (2) | 2023.09.02 |
μ½νλ¦° κΈ°μ΄ (0) | 2023.09.02 |
μ½νλ¦° λ¬Έλ² (0) | 2023.08.31 |