Kotlin Playground: Edit, Run, Share Kotlin Code Online
์ค์๊ฐ์ผ๋ก ์น์์ ์ฝํ๋ฆฐ์ ๋ฌธ๋ฒ์ ํ์ตํ ์ ์๋ ์ฌ์ดํธ
1. ๋ณ์
val a: Int = 1
//ํ์
์ ์๋ตํด๋ ์ปดํ์ผ ์๋ฌ X, ํ์
์ถ๋ก ์ด ๊ฐ๋ฅํ๋ค.
val b = 1
//์ง์ฐํ ๋น: ๋ค๋ฆ๊ฒ ๊ฐ์ ํ ๋นํ ์ ์๋ค**(์ง์ฐํ ๋น์์๋ ํ์
์ ๋ฐ๋์ ์ ์ด์ค์ผํจ)**
val c: Int
c= 3
- ์ฝํ๋ฆฐ์์ ๋ณ์ ์ ์ธ ์์ ์ฌ์ฉํ๋ ํค์๋
val
: value์ ์ฝ์, java์ final์ฒ๋ผ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅvar
: variable์ ์ฝ์, ๋ณ์์ ๊ฐ๋ ์ผ๋ก ์ฌํ ๋น์ด ๊ฐ๋ฅํ๋ค
val e : String = "Hello"
e = "World" //์ปดํ์ผ ์๋ฌ, val์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
var f = 123
f = "hi" //์ปดํ์ผ ์๋ฌ, ํ๋ฒ ํ์
์ด ๊ณ ์ ๋๋ฉด ๊ทธ ํ์
์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ณ์๋ฅผ top-level๋ก
ํด๋์ค ๋ฐ์์ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค.
var x = 5 fun main() { }
์ฝํ๋ฆฐ์ ํด๋์ค๋ฅผ ์ ์ธํ์ง ์๊ณ ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ณ์(x)๋ฅผ top-level ๋ณ์๋ผ๊ณ ํ๋ค.
2. ํจ์ ์ ์ธ ๋ฐฉ๋ฒ
- ๊ธฐ๋ณธ์ ์ธ ํจ์ ์ ์ธ ์คํ์ผ
- funํค์๋ + ํจ์๋ช + ์ธ์, ํ์ + ๋ฐํํ์ + ๊ฒฐ๊ณผ๋ก ๊ตฌ์ฑ
fun funName(param:String, param2:String): String {
return result
}
- ํํ์ ์คํ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋ชธํต ์์ด ๋ก์ง๋ง ์ฌ์ฉํ ์ ์๋ค.
fun sum2(a: Int, b: Int) = a + b
ํจ์ ๋ํ ๋ณ์์ฒ๋ผ ํ์
์ถ๋ก ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฐํํ์
์ ์๋ตํ ์ ์๋ค.
- ๋ชธํต์ด ์๋ ํจ์๋ **๋ฐํ ํ์
์ ๋ฐ๋์** ํ์ํ๋ค.
fun sum4(a: Int, b: Int): Int { //Int ์๋ต์ ์ปดํ์ผ ์ค๋ฅ
return a + b
}
- ๋ฐํํ์
์ด ์๋ ํจ์๋ **Unit**์ ๋ฐํํ๋ค(**์๋ต ๊ฐ๋ฅ**ํ๋ค), ์๋ฐ์ void์ ์ ์ฌ
fun printSum(a: Int, b: Int) : Unit {
println(1)
}
- ๋ํดํธ ํ๋ผ๋ฏธํฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
fun greeting(message: String = "hi") {
println(message)
}
fun main() {
greeting() //hi
greeting("HI!!") //HI!!
}
์๋ฐ๋ ๋ํดํธ ํ๋ผ๋ฏธํฐ๊ฐ ๋ฑํ ์๋ค.
- **named argument**
fun log(level: Stirng = "INFO", message: String) {
println("{$level]$message")
}
fun main() {
log("info log")
log(level="DEBUG", "debug log")
log("WARN", "warning log")
log(level="ERROR", message = "error log")
}
ํจ์์ ๋ณ์ ๊ฐ์ ๋ฃ์ ๋, ์ด๋ฆ๊ณผ ๊ฐ์ ๋งคํํ๋ ๊ธฐ๋ฒ์ named argument๋ผ๊ณ ํ๋ค.
- ์์ฝ : ์ฝํ๋ฆฐ์ ํจ์๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑ์ด ๊ฐ๋ฅํ๊ณ , named argument๋ default parameter๊ฐ์ ๊ฒฝ์ฐ์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
3. ํ๋ฆ ์ ์ด ๋ฌธ๋ฒ
ifโฆelse ์
val job = "software"
if(job == "software") {
println("๊ฐ๋ฐ์")
} else {
println("๊ฐ๋ฐ์์๋")
}
- ์ฝํ๋ฆฐ์์ ๋งํ๋ if-else๋ ํํ์์ผ๋ก, ํํ์์ ํํ๋ก ๊ฐ์ ๋ฆฌํดํ ์ ์๋ค.
val str = if(job == "software") {
"๊ฐ๋ฐ์"
} else {
"๊ฐ๋ฐ์์๋"
}
์ฝํ๋ฆฐ์ if-else ์์ฒด๊ฐ ํํ์์ด๊ธฐ ๋๋ฌธ์ ์ผํญ ์ฐ์ฐ์๊ฐ ๋ถํ์ํ๋ค.
val a = 1
val b = 2
val c = if(b > a) b else a
when ์
kotlin์ when์ java์ switch๋ ์ ์ฌํ๋ค.
java์์๋ ํน์ ์ผ์ด์ค์์ break๋ฌธ์ ์๋ตํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ผ์ด์ค๊ฐ ์คํ๋ ์ ์์ด ์๋์ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
val day = 2
val result = when(day) {
1 -> "์"
2 -> "ํ"
3 -> "์"
4 -> "๋ชฉ"
else -> "๊ธฐํ"
}
when์์ ์ฌ์ฉํ๋ฉด result๊ฐ์ ๊ฐ์ ๋ฐ๋ก ํ ๋นํ ์ ์๋ค.
์ถ๊ฐ์ ์ผ๋ก kotlin์์๋ else๋ฅผ ์๋ตํ ์ ์๋ค.
enum class Color {
RED, GREEN, BLUE
}
fun getColor() = Color.RED
fun main() {
when (getColor()) {
Color.RED -> println("red")
Color.GREEN -> println("green")
Color.BLUE -> println("blue")
}
when (getColor()) {
Color.RED -> println("red")
else -> println("not red")
//GREEN, BLUE else
}
}
Kotlin์ enum type์ธ red, green, blue๋ฅผ ๋ชจ๋ when์ ์์ ๋ช ์ํด์คฌ๊ธฐ ๋๋ฌธ์ else๋ฅผ ๋ณ๋๋ก ์์ฑํ์ง ์์๋ ๋๋ค.
์ฝํ๋ฆฐ์ ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ์ถ๋ก ํ ์ ์๋ค.
for loop
- java์ for each์ ๋งค์ฐ ์ ์ฌํ๋ค
for(i in 0..3) { //(0~3)
println(i) // 3์ ํฌํจํ๋ค.
}
for(i in 0 until 3) { //3์ ํฌํจํ์ง ์๋๋ค.(0~2)
println(i)
}
๋ฒ์ ์ฐ์ฐ์ ..์ ์ฌ์ฉํด for loop๋ฅผ ๋๋ฆด ์ ์๋ค. (๋ง์ง๋ง ์ซ์๊น์ง ํฌํจ)
until์ ์ด์ฉํ๋ฉด ๋ง์ง๋ง ์ซ์๋ ๋ฏธํฌํจ์ด๋ค.
- ํน์ ๊ฐ๋งํผ ์ฆ๊ฐํ๋ฉด์ ๋ฐ๋ณตํ๊ณ ์ถ์ ๊ฒฝ์ฐ
for(i in 0..6 step 2) {
println(i)
}
๊ฐ์ด 2์ฉ ์ฆ๊ฐํ๋ฉด์ 0~6๊น์ง ๋ฐ๋ณตํ๋ค.
- ๊ฐ์ ๋ฐ๋ณต๊ฐ์์ํค๊ณ ์ถ์ ๊ฒฝ์ฐ
for(i in 3 downTo 1) {
println(i)
}
- ๋ฐฐ์ด์ ์ด์ฉํด for-loop๋๊ธฐ
val numbers = arrayOf(1,2,3) //๋ฐฐ์ด ์ ์ธ
for(i in numbers) {
println(i)
}
While
- ์๋ฐ์ while๋ฌธ๊ณผ ๋์ผํ๋ค.
var x = 5
while(x>0) {
println(x)
x--
}
4. ๋(Null) ์์ ์ฑ
๋ ์ฐธ์กฐ์ ์ํ์ฑ
์๋ฐ์์ ๊ฐ์ฅ ๋ง์ด ๋ฐ์ํ๋ ์์ธ ์ ํ, NPE(NullPointerException)
โ ์๋ฐ์์๋ NPE๋ฅผ ์ค์ด๊ธฐ ์ํด JDK8๋ถํฐ Optional์ ์ง์
Optional์ ๊ฐ์ ๋งคํํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ์์ฑ์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๊ฐ ๋ฐ์, ์ปดํ์ผ ๋จ๊ณ์์ Null๊ฐ๋ฅ์ฑ์ ๊ฒ์ฌํ์ง ์๋๋ค.
โ ์ฝํ๋ฆฐ์์๋ null๊ฐ๋ฅ์ฑ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฏธ๋ฆฌ ๊ฐ์งํด์ NPE๋ฅผ ์ค์ผ ์ ์๋ค.
kotlin์์์ NPE
fun main() {
val a : String = null //์ปดํ์ผ ์๋ฌ ๋ฐ์
var b : String = "aabbcc"
b = null //์ปดํ์ผ ์๋ฌ ๋ฐ์
}
์ฝํ๋ฆฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก null์ ์ง์ํ์ง ์๊ณ , nullableํ ํ์ ์ ๋ฐ๋ก ์ ๊ณตํ๋ค.
var a : String? = null
a.length //์ปดํ์ผ ์๋ฌ ๋ฐ์(a๋ null์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค)
a?.length //์ปดํ์ผ ์๋ฌ X
print(a?.length) //null ์ฐธ์กฐ์ ๋ํด์๋ ์์ ์ฐ์ฐ์๋ฅผ ํตํด ์ ๊ทผ ์ npe์์ด ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
ํ์ ๋ค์ ?์ ๋ถ์ฌ null์ด ๋ ์ ์๋ ํ์ ์์ ์ ์ธํ๋ค. a๊ฐ nullableํ๋ค๋ ๊ฒ์ ์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๋ค.
?.
๋ ์์ ์ฐ์ฐ์๋ก null ์ฐธ์กฐ์ ๋ํด์ ์์ ์ฐ์ฐ์๋ฅผ ํตํด ์ ๊ทผ ์ NPE ์์ด ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
val b: Int = if(a != null) a.length else 0
println(b) //a๋ณ์๊ฐ null์ด๊ธฐ ๋๋ฌธ์ 0์ด ์ถ๋ ฅ๋๋ค.
val c = a?.length ?: 0 //elvis์ฐ์ฐ์๋ฅผ ์ฌ์ฉ
println(c)
?:
๋ ์๋น์ค์ฐ์ฐ์์ด๋ค. ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์ข๋ณ์ด null์ธ ๊ฒฝ์ฐ ์ฐ๋ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ค. ์์ b์ฝ๋๋ฅผ ์๋น์ค ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ์ค์ผ ์ ์๋ค.
๊ธฐ์กด์ ์๋ฐ์ฝ๋์ด๋ค.
```java
import java.util.Optional;
public class Java_NullSafety {
public static String getNullStr() {
return null;
}
public static int getLengthIfNotNull(String str) {
if (str == null || str.length() == 0) {
return 0;
}
return str.length();
}
public static void main(String[] args) {
String nullableStr = getNullStr();
// Optional
nullableStr = Optional.ofNullable(nullableStr)
.orElse("null");
int nullableStrLength = nullableStr.length();
System.out.println(nullableStrLength);
int length = getLengthIfNotNull(null);
System.out.println(length);
}
}
```
NPE๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Optional๋ก ๋ฐ๋ ์์ , str์ด null์ธ์ง ํ์ธํ๋ ์์ , str์ ๊ธธ์ด๊ฐ 0์ด ์๋์ง๋ฅผ ํ์ธํ๋ ์์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
์ด๋ฅผ ์ฝํ๋ฆฐ์ ์๋น์ค์ฐ์ฐ์์ ์์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๊ณ ์ณ๋ณด๋ฉด ์ด๋ ๊ฒ ์ค์ผ ์ ์๋ค.
fun getNullStr(): String? = null
fun getLengthIfNotNull(str: String?) = str?.length ?: 0
fun main() {
val nullableStr = getNullStr()
val nullableStrLength = nullableStr?.length ?: "null".length
println(nullableStrLength)
println(getLengthIfNotNull(null))
}
val c: String? = null
val d = c!!.length
!!.
๋ ๋จ์ธ ์ฐ์ฐ์์ด๋ค. null์ด ๋ฐ์ํ์ง ์๋๋ค๊ณ ๊ฐ๋ฐ์๊ฐ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ฃผ๋ ์ญํ ์ด๋ค. ๊ทธ๋ฌ๋ null์ด ๋ฐ์ํ๋ ์ํ๋ ๊ฐ๋ฐ์์๊ฒ ์ฑ
์์ ๋งก๊ธฐ๋ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์ NPE๊ฐ ๋ฐ์ํ ์ ์๋ค.(์ ์ฌ์ฉํ์ง ์๋๋ค)
์ฝํ๋ฆฐ์์ ์๋ฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ nullableํจ์ ๊ณ ๋ คํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์์ ์ฐ์ฐ์์ ์๋น์ค ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
5. ์์ธ์ฒ๋ฆฌ
์ฝํ๋ฆฐ์ ์์ธ ํด๋์ค
- ๋ชจ๋ ์์ธ ํด๋์ค๋ ์ต์์ ์์ธํด๋์ค์ธ
Throwable
์ ์์ํ๋ค.
- `Error` : ์์คํ
์์ ์๋ฌ๊ฐ ๋ฐ์ํด์ ๋ณต๊ตฌ๊ฐ ์ด๋ ค์ด ์ํฉ(OOM, StackOverFlow Error)
- `Exception`
- `CheckedException` : ์์คํ
์์ ํฌ์ฐฉ ๊ฐ๋ฅํ์ฌ ๋ณต๊ตฌ ๊ฐ๋ฅ, ์์ธ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ค. (IOException, FileNotFoundException)
- `RuntimeException` : ๋ฐํ์์์ ๋ฐ์, ์์ธ์ฒ๋ฆฌ ๊ฐ์ ํ์ง ์์(NullPointerException, ArrayIndexOutOf`BoundsException, **Unchecked Exception)**
- ์๋ฐ์์๋ checked exception์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ค. ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด try-catch๋ก ๊ฐ์ธ๊ฑฐ๋ throws๋ก ์์ธ๋ฅผ ์ ํํด์ผ ํ๋ค.
//try-catch๋ฌธ ์์ฑํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์
try {
Thread.sleep(1);
} catch(InterruptedException e) {
//์์ธ ์ฒ๋ฆฌ
}
์ฝํ๋ฆฐ์ checked exception ์ฒ๋ฆฌ๊ฐ ํ์๊ฐ ์๋๋ค.
Thread.sleep(1) //์ปดํ์ผ์๋ฌX
๋ฌผ๋ก , try-catch๋ฌธ์ ์ฌ์ฉํด๋ ๋๋ค. ๊ฐ์ ๊ฐ ์๋ ๋ฟ์ด๋ค!
์ฝํ๋ฆฐ์ ํํ์์ ํํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ try-catch๋ฌธ์ ์ด์ฉํด ๊ฐ์ ์ ๋ฌํ ์ ์๋ค. try-catch๋ ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฆฌํดํ ์ ์๋ค.
val a = try {
"1234".toInt()
} catch (e: Exception) {
println("์์ธ ๋ฐ์!")
}
- ์ฝํ๋ฆฐ์์ exception ๋ฐ์์ํค๊ธฐ
throw Exception("์์ธ ๋ฐ์")
fun failFast(message: String) { //๋ฆฌํดํ์
Nothing์ด ์๋ต
throw IllegalArgumentException(message)
}
throw ๋ํ ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฆฌํดํ ์ ์๋ค.
Exception๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ Nothing์ด๋ผ๋ ํ์ ์ ๋ฐํํ๊ฒ ๋๋ค. ์ด๋ฅผ ์ด์ฉํด ์ด ์ดํ์ ์ฝ๋๊ฐ ์คํ๋์ง ์์์ ๋ณด์ฅํ๋ค.
๋ํ elvis์ฐ์ฐ์์ Nothing ํ์ ์ ์ด์ฉํด null ์์ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ค.
fun failFast(message: String): Nothing {
throw IllegalArgumentException(message)
}
fun main() {
val a: String? = null
**val b: String = a ?: failFast("a is null ")**
println(b.length)
}
์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ a๊ฐ null์ผ ๊ฒฝ์ฐ, IllegalArgumentException์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ NPE๊ฐ ๋ฐ์ํ ์ผ์ด ์๋ค.
6. ํด๋์ค์ ํ๋กํผํฐ
class
- classํค์๋๋ฅผ ์ฌ์ฉํด ํด๋์ค๋ฅผ ์ ์ธํ๋ค.
class Coffee constructor(val name: String) {
}
//๊ฐ์ ์๋ฏธ, ์๋ตํ๋ ๊ฒ์ด ๋ ๊ฐ๋
์ฑ์ด ์ข์
class Coffee(val name: String) {
}
๊ธฐ๋ณธ์ ์ผ๋ก ์ฝํ๋ฆฐ ํด๋์ค๋ constructor ํค์๋๋ฅผ ์๋ตํ ์ ์๋ค.(์ฃผ๋ก ์๋ตํ๋ค)
- ๋ณธ๋ฌธ ๋ด์ฉ์ด ์๋ ํด๋์ค๋ ๋ง๋ค ์ ์๋ค.
class EmptyClass
- ํํ์ผํ๋ฅผ ํ์ฉํ๋ค.
class Coffee (
val name: String,
val price: Int,
) {
}
name์ด๋ผ๋ property๊ฐ ์๊ณ , price๋ผ๋ properties๋ฅผ ํ๋ ๋ง๋ค ๋, ํ๋๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ผํ๋ฅผ ๋ฃ์ ์ ์๋ค.
์ถํ์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ๋ ํธํ๋ค.(์ฝ๋๋ฆฌ๋ทฐ, ๊ฐ๋ ์ฑ ๋ฑ๋ฑโฆ)
Properties
- var
class Coffee(
var name: String = "",
var price: Int = 0,
)
fun main() {
val coffee = Coffee()
coffee.name = "์์ด์ค ์๋ฉ๋ฆฌ์นด๋
ธ"
coffee.price = 2000
println("${coffee.name} ๊ฐ๊ฒฉ์ ${coffee.price}")
}
- var ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์ฌํ ๋นํ ์ ์๋ค.
- ์ฝํ๋ฆฐ์์๋ ์ปดํ์ผ ์ getter, setter๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
- coffee name, price์ ํ ๋น๋ ๊ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก setter๋ฅผ ์ด์ฉํด ํ ๋น์ด ๋๋ค.
- ๊ฐ์ ์ฌ์ฉํ ๋๋ getter๋ฅผ ์ฌ์ฉํ๋ค.
- custom setter ๋ง๋ค๊ธฐ
class Coffee (
var name: String = "",
var price: Int = 0,
) {
//custom setter
var quantity: Int = 0
set(value) {
if(valule > 0) { //์๋์ด 0์ด์์ธ ๊ฒฝ์ฐ์๋ง ํ ๋น
field = value
}
}
fun main() {
val coffee = Coffee()
coffee.name = "์์ด์ค ์๋ฉ๋ฆฌ์นด๋
ธ"
coffee.price = 2000
coffee.quantity = 1
println("${coffee.quantity}")
}
- var quantity๋ฅผ ์ ์ธํ๋ค. custom setter๋ฅผ ์ด์ฉํด ์๋์ด 0 ์ด์์ผ ๊ฒฝ์ฐ์ ํด๋น ๊ฐ์ value๋ก ํ ๋นํ๋ค.
- `backing field` : field๋ ์๋ณ์๋ก getter, setter์ ๋ํด์ field๋ผ๋ ์๋ณ์๋ฅผ ์ด์ฉํด ํ๋์ ์ฐธ์กฐ์ ์ ๊ทผํ๋ค.
์ด๋ ๋ฌดํ ์ฌ๊ท์ํ(StackOverFlowError)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋๋ผ๋ ์๋ณ์๋ฅผ ์ด์ฉํด ๊ฐ์ ํ ๋นํด์ผ ํ๋ค.
- val
class Coffee(
var name: String = "",
var price: Int = 0,
) {
val brand: String
get() = "์คํ๋ฒ
์ค" //custom getter
}
fun main() {
val coffee = Coffee()
coffee.name = "์์ด์ค ์๋ฉ๋ฆฌ์นด๋
ธ"
coffee.price = 2000
coffee.quantity = 1
println("${coffee.brand}")
}
- ์์ ์ฝ๋์์ coffee.brand ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ ํ๋ฉด ์๋์ผ๋ก custom getter๊ฐ ๋ถ๋ฌ์์ง๊ณ , โ์คํ๋ฒ ์คโ๊ฐ ์ถ๋ ฅ๋๋ค.
- ์ปดํ์ผ ์ val ๊ฐ์ฒด์ ๋ํด์๋ getter๋ง ์์ฑ์ด ๋๋ค.(set์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ง๋ค์ง ์๋๋ค)
- ์ฝํ๋ฆฐ์ ํ๋กํผํฐ๋ ์๋ฐ๋ณด๋ค ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ์๋ฐ๋ ์ํ๋ฅผ ๋ฉ์๋๋ก ๋ํ๋ธ๋ค.
if(coffee.isIced()) {
System.out.println("์์ด์ค ์ปคํผ");
}
- ์ฝํ๋ฆฐ์ ํ๋กํผํฐ๋ก ์ํ๋ฅผ ๋ํ๋ผ ์ ์๋ค.
if(coffee.iced) {
println("์์ด์ค์ปคํผ")
}
์์ฝ
- ์ฝํ๋ฆฐ์ ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ๋ง์ ์์ Boilerplate Code๋ฅผ ์์จ ์ ์๋ค.
//java
public class Person {
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// Kotlin
// [var:getter, setter / val : getter]
class Person(var name:String = "์ฝํ๋ฆฐ", var age:Int = 10)
์ด๋ ๋ฏ ์๋ฐ์์ 20์ค์ด ๋๋ ์ฝ๋๋ฅผ ์ฝํ๋ฆฐ์ผ๋ก๋ ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ํ์ค๋ง์ ํํํ ์ ์๋ค.
ํด๋์ค ์ ์ธ๋ฐฉ์ | Getter ์์ฑ | Setter ์์ฑ | ์ ํ |
---|---|---|---|
class Person(name: String) | X | X | ์์ฑ์ ๋งค๊ฐ๋ณ์ |
class Person(var name: String) | O | O | property |
class Person(val name: String) | O | X | property |
7. ์์
์๋ฐ์ ์์
์์์ ํตํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ํ์ฅํ ์ ์๋ค.
์๋ฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํด๋์ค๊ฐ ์์๊ฐ๋ฅํ๋ ๋ถ์์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด final ํค์๋๋ฅผ ๋ถ์ฌ์ ์์์ ๋ง์ ์ ์๋ค.
๋ํ์ ์ธ ํด๋์ค : System class(final๋ก ์์ฑ)
์ดํํฐ๋ธ ์๋ฐ์์๋ ์์์ ์ํ ์ค๊ณ์ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์์์ ๊ธ์งํ๋ผ๋ ์ฃผ์ ๊ฐ ์๋ค.
โ ์์์ ๋ชฉ์ ์ผ๋ก ๋ง๋ ํด๋์ค๊ฐ ์๋๋ผ๋ฉด ๋ชจ๋ final๋ก ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
์๋ฐ์ ๋ชจ๋ ํด๋์ค์ ์กฐ์์ Object๋ค.
์ฝํ๋ฆฐ์ ์์
์ฝํ๋ฆฐ์ ๋ชจ๋ ํด๋์ค์ ์กฐ์์ Any๋ค. (equals, hashCode, toString ํจ์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต)
์ฝํ๋ฆฐ์ ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก final์ด๋ค(์์์ ๋ง๋๋ค)
์์์ด ๊ผญ ํ์ํ ๊ฒฝ์ฐ์ openํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
//final class
class FinalDog
//์์๊ฐ๋ฅํ ํด๋์ค
open class Dog
class Bulldog : Dog() //์์์ฝ๋
ํด๋์ค๋ช
์ฝ๋ก :์์ํด๋์ค()
์ ๊ผด๋ก ์์์ ์ ์ธํ๋ค.
- ํจ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํ ๋๋ open ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
open class Dog {
open var age: Int = 0
open fun bark() {
println("๋ฉ๋ฉ")
}
}
class Bulldog: Dog() {
override var age: Int = 0
override fun bark() {
println("์ปน์ปน")
}
}
Bulldog ํด๋์ค๋ ์ค๋ฒ๋ผ์ด๋ ํค์๋๋ฅผ ์ด์ฉํด ์์ํด๋์ค์์ ์คํํ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ํ๋ค.
- ์ฝํ๋ฆฐ์์๋ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ์ฌ์ฉํด ํ๋กํผํฐ๋ฅผ ์ฌ์ ์ ํ ์ ์๋ค.
class Bulldog(**override var age: Int = 0**): Dog() {
override fun bark() {
println("์ปน์ปน")
}
}
fun main() {
val dog = Bulldog(age = 2)
println(dog.name)
dog.bark()
}
- ์ฝํ๋ฆฐ์์๋ ์ค๋ฒ๋ผ์ด๋๊ฐ ๋๋ฉด ์๋์ผ๋ก ํจ์๋ ํ๋กํผํฐ๊ฐ open ์ํ๊ฐ ๋๋ค.
open class Bulldog(override var age: Int = 0): Dog() {
override fun bark() {
println("์ปน์ปน")
}
}
class ChildBulldog : Bulldog() {
override var age: Int = 0
override fun bark() {
super.bark()
}
}
๋ถ๋ ์ ํ์ํด๋์ค์ธ ChildBulldog์ ๋ง๋ค์๋ค.
ํ๋กํผํฐ๋ ํจ์์์ ๋ณ๋์ open ํค์๋๊ฐ ์์์๋ childBulldog์์ ์ฌ์ ์๋ฅผ ํ ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ์ ์๋ฅผ ํ์ง ๋ชปํ๋๋ก ๋ง์์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด final ํค์๋๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
open class Bulldog(final override var age: Int = 0): Dog() {
final override fun bark() {
println("์ปน์ปน")
}
}
class ChildBulldog : Bulldog() {
override var age: Int = 0 //์ปดํ์ผ์๋ฌ
override fun bark() {} //์ปดํ์ผ์๋ฌ
}
- super ํค์๋
- ํ์ํด๋์ค์์ ์์ํด๋์ค์ ํจ์๋ ํ๋กํผํฐ์ ์ ๊ทผํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
open class Bulldog(**final** **override var age: Int = 0**): Dog() {
final override fun bark() {
super.bark()
}
}
์์ํด๋์ค์ธ Dog์์์ bark ํจ์๊ฐ ์ํ์ด ๋๋ค.
์ฝํ๋ฆฐ์ ์ถ์ํด๋์ค
- abstract ํค์๋๋ฅผ ์ฌ์ฉํ๋ค
abstract class Developer {
abstract var age: Int
abstract fun code(language: String)
}
class BackendDeveloper : Developer() {
override var age: Int = 0
override fun code(language: String) {
println("$language")
}
}
fun main() {
val backendDeveloper = BackendDeveloper(age = 20)
println(backendDeveloper.age)
backendDeveloper.code("Kotlin")
}
์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ํด๋์ค์ ๋ฉ์๋์ ํ๋กํผํฐ์ abstract keyword๊ฐ ๋ถ์ผ๋ฉด ํ์ํด๋์ค๊ฐ ๋ฐ๋์ ๊ตฌํ์ ํด์ค์ผ ํ๋ค.
์ถ์ํด๋์ค๋ฅผ ๊ตฌํํ ๋๋ abstract class, abstract property, abstract method๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
8. ์ธํฐํ์ด์ค
์ฝํ๋ฆฐ์์ ์ธํฐํ์ด์ค ์ ์ํ๊ธฐ
- interface ํค์๋ ์ฌ์ฉ
class Product(val name: String, val price: Int)
interface Cart {
fun add(product: Product)
fun rent() {
}
}
Cart๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ค. ์์ interface๋ผ๋ ํค์๋๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
์ธํฐํ์ด์ค ๋ด๋ถ์๋ ์ํ์ ์ธ์๋ก ๋ฐ์์ ์ถ๊ฐํ๋ addํจ์, ์์ง์ ๊ตฌํ์ด ์๋ rentํจ์๋ฅผ ์์ฑํ ์ ์๋ค.
ํด๋์ค์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋๋ ์ฝ๋ก (:)์ ๋ถ์ด๊ณ ์ธํฐํ์ด์ค ๋ช ๋ง ์ ์ผ๋ฉด ๋๋ค.
class MyCart: Cart {
override fun add(product: Product) {
}
}
์ธํฐํ์ด์ค๋ ์์ฑ์ ํธ์ถ ์์ด ์ธํฐํ์ด์ค์ ๋ช ๋ง ์ ์ผ๋ฉด ๋๋ค.(์ถ์ํด๋์ค์์ ๋ค๋ฅธ์ )
์ด MyCart์์๋ Cart์ธํฐํ์ด์ค์์ ๊ตฌํํด์ผํ๋ ์ถ์ํจ์์ด๊ธฐ ๋๋ฌธ์ override ํค์๋๋ฅผ ์ด์ฉํด ํจ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
rent()๋ Cart ์ธํฐํ์ด์ค ์์ฒด์์ ๋ด๋ถ ๋ก์ง์ ๊ตฌํํ ํจ์์ด๊ธฐ ๋๋ฌธ์ MyCart์์๋ ๋ณ๋ rentํจ์์ ๋ํด์๋ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํด์ฃผ์ง ์์๋ ๋๋ค.
- ์ฝํ๋ฆฐ์์๋ interface์ ํ๋กํผํฐ๋ ์กด์ฌํ๋ค.
interface Cart {
var coin: Int
val weight: String
get() = "20KG"
}
class MyCart(override var coin: Int): Cart {
}
coin์ด๋ผ๋ ํ๋กํผํฐ๋ MyCart ํด๋์ค์์ ๋ฌด์กฐ๊ฑด ๊ตฌํํด์ผ ํ๋ ์ถ์ ํ๋กํผํฐ๊ฐ ๋๋ค.
๋ํ, weight์ฒ๋ผ getter ์ ๊ทผ์๋ฅผ ์ด์ฉํ ํ๋กํผํฐ๋ ๊ตฌํํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์ ํ๋กํผํฐ์ ๋ํ ์ด๊ธฐ๊ฐ์ด ๋ฐ๋ก ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค ์์ฒด์์ backing field์ ์ ๊ทผํ ์ ์๋ค. ์ฆ, ํน์ ๊ฐ์ ์ฌ์ฉํด์๋ง ํ๋กํผํฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
interface Cart { var coin: Int fun add(product: Product) val weight: String get() = "20KG" fun rent() { if(coin > 0) { println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค") } } } class MyCart(override var coin: Int): Cart { override fun add(product: Product) { if(coin <= 0) println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์") else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค") } } fun main() { val cart = MyCart(coin = 100) cart.rent() cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000)) }
rentํจ์๊ฐ ๋จผ์ ํธ์ถ๋์๊ณ , ์ฝ์ธ์ด 100์ด๊ธฐ ๋๋ฌธ์ ์นดํธ๋ฅผ ๋์ฌํ๋ค๋ ๋ฌธ์ฅ์ด ์ถ๋ ฅ๋๊ณ , 1000์์ง๋ฆฌ ์ฅ๋๊ฐ์ ์นดํธ์ ๋ฃ์๋๋ฐ ์ฝ์ธ์ด 0์ ์ด์์ด๊ธฐ ๋๋ฌธ์ ์นดํธ์ ์ถ๊ฐ๋๋ค๋ ๋ฉ์ธ์ง๊ฐ ๋ฐ ๊ฒ์ด๋ค.
- ์ฝํ๋ฆฐ์ ์ธํฐํ์ด์ค๋ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ์ ์๋ค.
interface Wheel {
fun roll()
}
interface Cart: Wheel{
var coin: Int
fun add(product: Product)
val weight: String
get() = "20KG"
fun rent() {
if(coin > 0) {
println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค")
}
}
override fun roll() {
println("์นดํธ๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.")
}
}
class MyCart(override var coin: Int): Cart {
override fun add(product: Product) {
if(coin <= 0)
println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์")
else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค")
}
}
fun main() {
val cart = MyCart(coin = 100)
cart.rent()
**cart.roll()**
cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000))
}
Cart ์ธํฐํ์ด์ค์์ Wheel์์์ roll()ํจ์๋ฅผ ๊ตฌํํ๋ค.
์ฝํ๋ฆฐ์์๋ ์ธํฐํ์ด์ค๋ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ ๊ทธ ์ธํฐํ์ด์ค์์ ๊ตฌํํ ์ ์๋ ํจ์๋ฅผ ํ์ ์ธํฐํ์ด์ค์์๋ ์ฌ์ ์ํ ์ ์๋ค.
- ์ฝํ๋ฆฐ์์๋ ํ๋ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
interface Wheel {
fun roll()
}
interface Cart: Wheel{
var coin: Int
fun add(product: Product)
val weight: String
get() = "20KG"
fun rent() {
if(coin > 0) {
println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค")
}
}
override fun roll() {
println("์นดํธ๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.")
}
}
**interface Order {
fun add(product: Product) {
println("์ํ ์ฃผ๋ฌธ์ด ์๋ฃ๋์ต๋๋ค.")
}
}**
class MyCart(override var coin: Int): **Cart, Order** {
override fun add(product: Product) {
if(coin <= 0)
println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์")
else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค")
}
}
fun main() {
val cart = MyCart(coin = 100)
cart.rent()
**cart.roll()**
cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000))
}
MyCart๋ ํ์ฌ Cart๋ Order ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์ด๋ค. ๋ณต์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋๋ ์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ๋ค.
๋ณต์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋์ ๋ฌธ์ ์ ์ ๋์ผํ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ๊ตฌํํ ๋์ด๋ค. ์๋ฅผ๋ค์ด Cart์ Order ๋ชจ๋ ๊ฐ์ addํจ์๋ฅผ ๊ฐ์ง๋ค๊ณ ํ์ ๋ Order ์ธํฐํ์ด์ค์ add๋ ํธ์ถ๋์ง ์๋๋ค.
๋ณต์๊ฐ์ ์ธํฐํ์ด์ค์์ ํจ์๋ฅผ ํธ์ถํ๋ผ๊ณ ํ๋ฉด ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก superํค์๋๋ฅผ ์ด์ฉํด ํจ์์ ์ ๊ทผํ ์ ์๋ค.
- ์ฝํ๋ฆฐ์์๋ ํ๋ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
interface Wheel {
fun roll()
}
interface Cart: Wheel{
var coin: Int
fun add(product: Product)
val weight: String
get() = "20KG"
fun rent() {
if(coin > 0) {
println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค")
}
}
override fun roll() {
println("์นดํธ๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.")
}
}
**interface Order {
fun add(product: Product) {
println("์ํ ์ฃผ๋ฌธ์ด ์๋ฃ๋์ต๋๋ค.")
}
}**
class MyCart(override var coin: Int): **Cart, Order** {
override fun add(product: Product) {
if(coin <= 0)
println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์")
else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค")
}
}
fun main() {
val cart = MyCart(coin = 100)
cart.rent()
**cart.roll()**
cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000))
}
MyCart๋ ํ์ฌ Cart๋ Order ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค์ด๋ค. ๋ณต์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋๋ ์ฝค๋ง(,)๋ก ๊ตฌ๋ถํ๋ค.
๋ณต์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋์ ๋ฌธ์ ์ ์ ๋์ผํ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ๊ตฌํํ ๋์ด๋ค. ์๋ฅผ๋ค์ด Cart์ Order ๋ชจ๋ ๊ฐ์ addํจ์๋ฅผ ๊ฐ์ง๋ค๊ณ ํ์ ๋ Order ์ธํฐํ์ด์ค์ add๋ ํธ์ถ๋์ง ์๋๋ค.
๋ณต์๊ฐ์ ์ธํฐํ์ด์ค์์ ํจ์๋ฅผ ํธ์ถํ๋ผ๊ณ ํ๋ฉด ์์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก superํค์๋๋ฅผ ์ด์ฉํด ํจ์์ ์ ๊ทผํ ์ ์๋ค.
interface Wheel {
fun roll()
}
interface Cart: Wheel{
var coin: Int
fun add(product: Product)
val weight: String
get() = "20KG"
fun rent() {
if(coin > 0) {
println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค")
}
}
override fun roll() {
println("์นดํธ๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.")
}
}
**interface Order {
fun add(product: Product) {
println("์ํ ์ฃผ๋ฌธ์ด ์๋ฃ๋์ต๋๋ค.")
}
}**
class MyCart(override var coin: Int): **Cart, Order** {
override fun add(product: Product) {
if(coin <= 0)
println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์")
else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค")
**super<Order>.add(product)**
}
}
fun main() {
val cart = MyCart(coin = 100)
cart.rent()
**cart.roll()**
cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000))
}
Order์ add๋ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด super<Order>.add(product)
super์ ๊บฝ์๋ฅผ ์ด์ฉํด ์์ ์ธํฐํ์ด์ค์ ๋ํด ์ ๊ทผํ ์ ์๋ค.
์์ ์ฝ๋์์ Cart ์ add๋ ์ถ์ํจ์์ด๋ค. Order์ add๋ ๊ตฌํ์ด ๋ ๋ํดํธํจ์์ด๊ธฐ ๋๋ฌธ์ ๋์ผํ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง ๋ํดํธํจ์๋ฅผ ๋ง๋ค์ด์ ๋ฌด์์ด ์คํ๋๋์ง ํ ์คํธํด๋ณด์.
interface Wheel {
fun roll()
}
interface Cart: Wheel{
var coin: Int
fun add(product: Product)
val weight: String
get() = "20KG"
fun rent() {
if(coin > 0) {
println("์นดํธ๋ฅผ ๋์ฌํฉ๋๋ค")
}
}
override fun roll() {
println("์นดํธ๊ฐ ๊ตด๋ฌ๊ฐ๋๋ค.")
}
**fun printId() = println("1234")**
}
**interface Order {
fun add(product: Product) {
println("์ํ ์ฃผ๋ฌธ์ด ์๋ฃ๋์ต๋๋ค.")
}**
fun printId() = println("1234")
**}**
class MyCart(override var coin: Int): **Cart, Order** {
override fun add(product: Product) {
if(coin <= 0)
println("์ฝ์ธ์ ๋ฃ์ด์ฃผ์ธ์")
else println("${product.name}์ด(๊ฐ) ์นดํธ์ ์ถ๊ฐ๋์ต๋๋ค")
**super<Order>.add(product)**
}
override fun printId() {
**super<Cart>.printId()
super<Order>.printId()**
}
}
fun main() {
val cart = MyCart(coin = 100)
cart.rent()
cart.roll()
cart.add(Product(name = "์ฅ๋๊ฐ", price = 1000))
**cart.printId()**
}
Cart์ Order ์ธํฐํ์ด์ค ๋ชจ๋ ๋์ผํ ์ด๋ฆ์ ๋ํดํธ ํจ์, printId๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ์ด๋ด ๊ฒฝ์ฐ์๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ด ๊ฒฝ์ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ํ๊ธฐ ์ํด ํ์ ํด๋์ค์์๋ ๋ํดํธํจ์์ ๋ํด์ override๋ฅผ ํด์ค์ผ ํ๋ค.
์ด๋ ๊ฒ ํ์ํด๋์ค์์ ์ฌ์ ์๋ฅผ ํด์ฃผ์ด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์์ ์ธํฐํ์ด์ค์ ์๋ ๋ํดํธํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์ ๊ฐ์ด super์ ๊บฝ์๋ฅผ ์ด์ฉํด ํธ์ถํ๋ค.
10. ์ด๊ฑฐํ ํด๋์ค(Enum)
Enum ํด๋์ค์ ์ ์ธ
enum class PaymentStatus {
UNPAID, PAID, FAILED, REFUNDED
}
fun main() {
}
4๊ฐ์ง ์ํ๋ฅผ paymentstatus enum class์ ์ ์ธํ๋ค.
์ ์ธํ ๋๋ enum class ํด๋์ค๋ช ์ ์ฌ์ฉํ๋ค. (์๋ฐ๋ class๊ฐ ๋ค์ด๊ฐ์ง ์๋๋ค.)
enum class๋ํ ์์ฑ์์ด๊ธฐ ๋๋ฌธ์ property๋ฅผ ๊ฐ์ง ์ ์๋ค.
property๋ฅผ ๊ฐ์ง๋ enum class
enum class PaymentStatus(val label: String) { UNPAID("๋ฏธ์ง๊ธ"), PAID("์ง๊ธ์๋ฃ"), FAILED("์คํจ"), REFUNDED("ํ๋ถ"), } fun main() { print(PaymentStatus.UNPAID.label) }
๊ธฐ๋ณธ ์์ฑ์์ธ label์ ์ ์ธํ๋ค. PaymentStatusํด๋์ค์ ๊ธฐ๋ณธ ์์ฑ์๋ก label์ด ์์ฑ๋์๊ธฐ ๋๋ฌธ์, enum ์์์๋ ์ ์ธ์ ํด์ค์ผ ํ๋ค.
์ ์๋ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
PaymentStatus.UNPAID.label
์ด๋ค.enum class์ ํจ์ ์ ์ํ๊ธฐ
์์ ๋ค์ ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ด ๋๋ ์ธ๋ฏธ์ฝ๋ก ์ ๋ถ์ฌ์ผ ํ๋ค.
๊ฒฐ์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์กฐํํ๋ isPayable()ํจ์๋ฅผ ๋ง๋ค์.
enum class PaymentStatus(val label: String) {
UNPAID("๋ฏธ์ง๊ธ"){
override fun isPayable(): Boolean = true
},
PAID("์ง๊ธ์๋ฃ")
override fun isPayable(): Boolean = false
},
FAILED("์คํจ")
override fun isPayable(): Boolean = false
},
REFUNDED("ํ๋ถ")
override fun isPayable(): Boolean = false
};
abstract fun isPayable(): Boolean
}
fun main() {
if(PaymentStatus.UNPAID.isPayable()) {
println("๊ฒฐ์ ๊ฐ๋ฅ ์ํ")
}
}
๊ฒฐ์ ๊ฐ๋ฅํ ์ํ์ธ์ง๋ฅผ ํ์ธํ๊ณ , ๊ฐ๋ฅํ๋ค๋ฉด ์ถ๋ ฅํ๋ ์ฝ๋์ด๋ค. UNPAID๋ผ๋ ์์ ๋ค์ isPayable ํจ์๋ฅผ ๊ตฌํํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ง์ฌ์ง ์ฝ๋๋ ์ถ์ํ๋ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, enum class์ ๋ ์์ ์ผ๋ก ๊ตฌํ๋๋ ๋ฐฉ์์ ์ข์ง ์๋ค.
์ฌ์ฌ์ฉ์ฑ์ ์ํด ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํด๋ณด์.
- ์ธํฐํ์ด์ค๋ก ์ด๊ฑฐํ ํด๋์ค ํ์ฅํ๊ธฐ
enum class PaymentStatus(val label: String): Payable {
UNPAID("๋ฏธ์ง๊ธ"){
override fun isPayable(): Boolean = true
},
PAID("์ง๊ธ์๋ฃ")
override fun isPayable(): Boolean = false
},
FAILED("์คํจ")
override fun isPayable(): Boolean = false
},
REFUNDED("ํ๋ถ")
override fun isPayable(): Boolean = false
};
}
****
interface Payable {
fun isPayable(): Boolean
}
fun main() {
**val paymentStatus = PaymentStatus.valueOf("PAID")
println(paymentStatus.label)
if(paymentStatus == PaymentStatus.PAID) {
println("๊ฒฐ์ ์๋ฃ์ํ")
}
for(status in PaymentStatus.values()) {
println("$status : ${status.label}")
}**
}
enum class๋ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ interface๋ฅผ ๊ตฌํํ ์ ์๋ค.
Payable์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ isPayable()์ด๋ผ๋ ์ถ์ํจ์๋ฅผ ์ ์ํ๋ค.
๋๋ฑ์ฑ ๋น๊ต ๋ํ ์ ๋๋ก ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ถ๊ฐ๋ก ์ฝํ๋ฆฐ์์๋ values ํจ์๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด ํจ์๋ฅผ ์ด์ฉํด ์์๊ฐ๊ณผ property๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- name : ์์์ ์ด๋ฆ string ํํ๋ก ๋ณํ
- label: property๊ฐ
- ordinal: int ํ์ ์ผ๋ก, ์์์ ์ ์ธ ์์๋ฅผ ์ถ๋ ฅํ๋ค(0๋ถํฐ ์์)
์ฐธ๊ณ
์ ํํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ์ ์ต์ ์ ๋คํ์ง๋ง, ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค!
ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ ๋ฐ์ํ๊ฒ ์ต๋๋ค๐