1. ์ธํฐํ์ด์ค
: ๋ถ๋ชจ ํด๋์ค์ ๋ณ๊ฐ๋ก ๋ค๋ฅธ ๊ทธ๋ฃน๊ณผ ๊ฒน์น๋ ๊ธฐ๋ฅ ๊ตฌํ ์ ์ฌ์ฉ...
- ๊ทผ๋ณธ์ ์ธ ๊ณตํต์ ์ ์์๋ฐ๊ณ , ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ์ธํฐํ์ด์ค๋ก ์ถ๊ฐ
- ์ถ์๋ฉ์๋ ์ฌ์ฉ ๊ถ์ฅ (๊ตฌํ ์ ์ ์, ๊ตฌํ ํ์)
//์ธํฐํ์ด์ค๋ ๋ค์ค๊ตฌํ ๊ฐ๋ฅ, ํด๋์ค๋ ๋ค์ค์์ ๋ถ๊ฐ๋ฅ
//์ธํฐํ์ด์ค๋ ๊ทธ ์์ฒด์ ์ธ์คํด์ค ํ๋๋ฅผ ๊ฐ์ง ๋ชปํจ
//์ธํฐํ์ด์ค : ์ธํฐํ์ด์ค ๊ฐ๋ฅ
interface WaterBirdBehavior {
//๋ณ์ ๊ฐ์ ๊ฐ์ง ์๋ ์์. ์์๋ ๊ฐ์ง ์ ์์ด๋
fun swim()
//์ถ์๋ฉ์๋ ์ฐ๋ ๊ฒ ์ข์...
// fun swim() {
// println("์์ ํฉ๋๋ค")
// }
}
fun main() {
var bird = Bird("์")
var chicken = Chicken("๋ญ")
var duck = Duck("์ค๋ฆฌ")
bird.fly()
chicken.fly()
duck.swim()
}
open class Bird(name:String) {
var name: String = ""
init {
this.name = name
}
fun fly() {
println("${name} ๋ ์์~")
}
}
class Chicken(name: String) : Bird(name) {}
class Duck(name: String) : Bird(name), WaterBirdBehavior {
//java์ ๋ค๋ฅด๊ฒ ํด๋์ค ์์ implements ~~ ์ํด๋ ๋๋๋ด
//๊ตฌํํ ๋ ์ ์ ํ์, ๊ตฌํ ํ์
override fun swim() {
println("${name}๊ฐ ์์ํด์~")
}
}
//ํ๋กํผํฐ๋ ์ค์ง ์ถ์ ๋ฉ์๋๋ก ์ ์ธ(abstract ํค์๋ ์์ด๋ ์ถ์)
๋จ, val๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ get() ํตํด ํ์ํ ๋ด์ฉ ๊ตฌํ ๊ฐ๋ฅ, override ์ฌ์ฉํ๊ธฐ
interface Pet{
var category: String
fun feeding()
fun patting(){
println("Keep Patting")
}
}
class Cat(override var category: String) : Pet{
override fun feeding(){
println("Feed the cat a tuna can")
}
}
fun main(){
val obj = Cat("small")
println("Pet Category : ${obj.category}")
obj.feeding() //๊ตฌํ๋ ๋ฉ์๋
obj.patting() //๊ธฐ๋ณธ ๋ฉ์๋
}
//Pet Category : small
//Feed the cat a tuna can
//Keep Patting
...
interface Pet{
var category: String
val msgTags: String
get()= "I'm your pet"
fun feeding()
fun patting(){
println("Keep patting")
}
}
...
println("${obj.msgTags}")
...
- msgTags ์ด๊ธฐํ๋ ๋ถ๊ฐ๋ฅํ์ง๋ง get() ํตํด ๋ฐํ๊ฐ์ ์ง์ ํ ์ ์์(value๋ฅผ ์ ์ฅํ์ง๋ ๋ชปํจ)
//๋ฉ์๋๋ ์ถ์, ์ผ๋ฐ(๊ตฌํ๋ถ ํฌํจ) ๋ฉ์๋ ๋ชจ๋ ๊ฐ๋ฅ
//์ธํฐํ์ด์ค์ ์ค๋ฒ๋ก๋ฉ
interface Pet{
var category: String
val msgTags: String
get()= "I'm your pet"
var species: String //์ข
์ ์ํ ํ๋กํผํฐ
fun feeding()
fun patting(){
println("Keep patting")
}
}
open class Animal(val name: String)
class Dog(name: String, override var category: String) : Animal(name), Pet {
override var species: String = "dog"
override fun feeding() {
println("Feed the dog a bone")
}
}
class Cat(name: String, override var category: String) : Animal(name), Pet {
override var species: String = "cat" //ํ๋กํผํฐ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด ์ข
์ ํน์
override fun feeding() {
println("Feed the cat a snack")
}
}
class Master{
//species ํ ๋ค์๋
fun playWithPet(pet: Pet){ //์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ฒด๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ง์
println("Enjoy with my ${pet.species}")
}
fun playWithPet(dog: Dog){ // ์ข
๋ฅ์ ๋ฐ๋ผ ์ค๋ฒ๋ก๋ฉ
println("play with Dog")
}
fun playWithPet(cat: Cat){
println("play with Cat")
}
}
fun main(){
val master = Master()
val dog = Dog("ํ์ด", "small")
val cat = Cat("๋ฌด", "big")
master.playWithPet(dog)
master.playWithPet(cat)
}
- fun playWithPet(pet: Pet) ๋ถ๋ถ์ ํด๋น ๊ฐ์ฒด์ ์ค์ ์ ํ์ ๋ฐ๋ผ ์คํ๋๋ ์ฝ๋๊ฐ ๊ฒฐ์ ๋จ
//์ฌ๋ฌ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์๋๋ฐ ์ด๋ฏธ ๊ตฌํ๋์ด์๋ ๋์์ overrideํ๋ ค๊ณ ํจ,
๊ทผ๋ฐ ์ด๋ฆ์ด ์ธํฐํ์ด์ค๋ผ๋ฆฌ ๊ฒน์น๋ค๋ฉด
class ํด๋์ค๋ช
: ์ธํ1, ์ธํ2{
override fun jump(){
super<๊ตฌํ๋๋์์ ์์๋ฐ์์ฌ ์ธํฐํ์ด์ค๋ช
>.๋์์ด๋ฆ()
println("do it")
}
}
fun main(){
val ex1 = ํด๋์ค๋ช
()
ex1.jump()
}
//by ๋ฅผ ํตํ ์ธํฐํ์ด์ค์ ์์
interface A {
fun functionA()
}
interface B {
fun functionB()
}
class C(val a: A, val b: B) {
fun functionC() {
a.functionA()
b.functionB()
}
}
^ ์๋ functionA(), functionB() ์ ์ ๊ทผํ๊ธฐ ์ํด a, b ๋ณ์(๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด)๋ฅผ ์ฌ์ฉํด์ผ ํจ
class DelegatedC(a: A, b: B): A by a, B by b{
fun functionC(){
functionA()
functionB()
}
}
^ a, b๋ฅผ ๊ฐ๊ฐ ์ธํฐํ์ด์ค A, B์ ์์ํด์ ๋ฉ์๋ ์ฌ์ฉ ์ . ์์ด๋ ์ฌ์ฉํ ์ ์๊ฒ ๋จ
//์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๊ฐ ์กด์ฌํ ๋, ๋ค๋ฅธ ํด๋์ค์์ ๋งค๊ฐ๋ณ์์ ์ธํฐํ์ด์ค๋ฅผ ์์ํด ์ ์ฌ์ฉ ๊ฐ๋ฅ
interface Nameable{
var name: String
fun fly()
}
class StaffName : Nameable {
override var name: String = "Sean"
override fun fly(){
println("flying")
}
}
class Work: Runnable{ //์ค๋ ๋ ์คํ์ ์ํ ์ธํฐํ์ด์ค
override fun run(){
println("work...")
}
}
//๊ฐ ๋งค๊ฐ๋ณ์์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์์
class Person(name: Nameable, work: Runnable): Nameable by name, Runnable by work
fun main(){
val person = Person(StaffName(), Work()) //์์ฑ์๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด ๋ฐ๋ก ์ ๋ฌ
println(person.name) //์ฌ๊ธฐ์ StaffName ํด๋์ค์ name์ ์ ๊ทผ
person.run() //์ฌ๊ธฐ์ Work ํด๋์ค์ run ์ ๊ทผ
person.fly()
}
//Sean
//work...
//flying
//์ปคํผ๋ฉ์ด์ปค ์์
interface Heater{
fun on()
fun off()
fun isHot() : Boolean
}
class ElectricHeater(var heating: Boolean = false) : Heater {
override fun on() {
println("[ElectricHeater] heating...") //5
heating = true
}
override fun off() {
heating = false
println("ElectricHeater ํด๋์ค์ off ํจ์") //9
}
override fun isHot() : Boolean {
println("ElectricHeater ํด๋์ค์ isHot ํจ์") //6
return heating
}
}
interface Pump {
fun pump()
}
class Thermosiphon(heater: Heater) : Pump, Heater by heater { // ์์์ ์ฌ์ฉ
override fun pump() {
if (isHot()) {
println("[Thermosiphon] pumping..."); //7
}
}
}
interface CoffeeModule {
fun getThermosiphon() : Thermosiphon
}
class MyDripCoffeeModule : CoffeeModule {
companion object {
val electricHeater: ElectricHeater by lazy { // lazy๋ฅผ ์ด์ฉํ ์ง์ฐ ์ด๊ธฐํ ๊ธฐ๋ฒ ์ฌ์ฉ
println("MyDripCoffeeModule ํด๋์ค์ electricHeater ์์") //4
ElectricHeater()
}
}
private val _thermosiphon : Thermosiphon by lazy {
println("MyDripCoffeeModule ํด๋์ค์ private _thermosiphon ์์") //3
Thermosiphon(electricHeater)
}
override fun getThermosiphon() : Thermosiphon {
println("MyDripCoffeeModule ํด๋์ค์ getThermosiphon ํจ์") //2
return _thermosiphon
}
}
class CoffeeMaker(val coffeeModule: CoffeeModule) {
fun brew() {
val theSiphon: Thermosiphon = coffeeModule.getThermosiphon()
theSiphon.on()
theSiphon.pump()
println("Coffee, here! Enjoy!~") //8
theSiphon.off()
}
}
fun main() {
val coffeeMaker = CoffeeMaker(MyDripCoffeeModule()) //์ฌ๊ธฐ์ ๊ณต๊ฐ๋ง๋ค๊ธฐ์ธ๋ฏ
println("์์ํ์ธ") //1
coffeeMaker.brew()
}
์์ํ์ธ
MyDripCoffeeModule ํด๋์ค์ getThermosiphon ํจ์
MyDripCoffeeModule ํด๋์ค์ private _thermosiphon ์์
MyDripCoffeeModule ํด๋์ค์ electricHeater ์์
[ElectricHeater] heating...
ElectricHeater ํด๋์ค์ isHot ํจ์
[Thermosiphon] pumping...
Coffee, here! Enjoy!~
ElectricHeater ํด๋์ค์ off ํจ์
2. ์ถ์ ํด๋์ค
: ์ ์ธ ๋ฑ์ ๋๋ต์ ์ธ ์ค๊ณ ๋ช ์ธ, ๊ณตํต์ ๊ธฐ๋ฅ์ ๊ตฌํํ ํด๋์ค
- ํ์ ํด๋์ค์์ ์ถ์ ํด๋์ค์ ๋ด์ฉ์ ๋ ๊ตฌ์ฒดํํด์ผ ํจ
- abstract ํค์๋ ์ฌ์ฉ
- ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ธ์คํด์คํํ ์ ์์
- ํด๋น ์ถ์ ํด๋์ค๋ฅผ ์์ํ๋ ํ์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๋ง๋ค์ด์ ธ์ผ ํ๋์ง๋ฅผ ๋ํ๋ด๋ ์ฉ๋๋ก ์ฌ์ฉํจ
- ํด๋์ค, ํ๋กํผํฐ, ๋ฉ์๋ ๋ชจ๋ abstract๋ก ์ ์ธํ ์ ์์ (์ด๊ธฐํ or ๊ตฌํ์ด ํ์)
abstract class Printer{
abstract fun print() //์ถ์ ๋ฉ์๋
}
val myPrinter = object: Printer(){ //๊ฐ์ฒด ์ธ์คํด์ค
override fun print(){ //์ถ์ ๋ฉ์๋ ๊ตฌํ
println("printing!")
}
}
fun main(){
myPrinter.print()
}
'์ธ์ด > Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Kotlin ๋ฌธ๋ฒ ์ข ํฉ] - ์์ธ์ฒ๋ฆฌ # ์์ ํ๊ธฐ (0) | 2024.03.06 |
|---|---|
| [Kotlin ๋ฌธ๋ฒ ์ข ํฉ] - ์ ๊ทผ์ ํ์์ ๊ด๋ จ ์ฉ์ด ์ ๋ฆฌ (0) | 2024.03.06 |
| [Kotlin ๋ฌธ๋ฒ ์ข ํฉ] - ์ค๋ฒ๋ผ์ด๋ฉ, ์ค๋ฒ๋ก๋ฉ # ์์ ํ๊ธฐ (0) | 2024.03.05 |
| [Kotlin ๋ฌธ๋ฒ ์ข ํฉ] - ์์ (0) | 2024.03.05 |
| [Kotlin ๋ฌธ๋ฒ ์ข ํฉ] - ์์ฑ์, ๊ฐ์ฒด (#๋น๊ต ์ถ๊ฐํ๊ธฐ) @@ ์ง๋ฌธํ๊ธฐ! (0) | 2024.03.05 |