...

λ€νμ± (Polymorphism)
λ€νμ±(ε€ε½’ζ§) μ΄λ, κ·Έ μ체μ μλ―Έλ₯Ό νμ€ κ΅μ΄μ¬μ μμ μ°Ύμ보면, 'κ°μ μ’ μ μλ¬Όμ΄λ©΄μλ μ΄λ€ ννλ νμ§μ΄ λ€μνκ² λνλλ νμ' μ΄λΌ μ μλμ΄ μλ€.

μ΄λ₯Ό νλ‘κ·Έλλ°μ λμ ν΄λ³΄λ©΄, λ€νμ±(polymorphism)μ΄λ κ°μ μλ£νμ μ¬λ¬κ°μ§ νμ μ λ°μ΄ν°λ₯Ό λμ νμ¬ λ€μν κ²°κ³Όλ₯Ό μ»μ΄λΌ μ μλ μ±μ§μ μλ―Ένλ€.
μ΄λ₯Ό ν΅ν΄ μ‘°μ ν΄λμ€μ μ°Έμ‘° λ³μλ‘ μμ ν΄λμ€μ μ°Έμ‘° λ³μλ₯Ό λ€λ£¨κ±°λ, λμΌν μ΄λ¦μ κ°μ μ¬λ¬ ννμ λ§€μλλ₯Ό λ§λ€ μ μλ€.
μλ°μμ λνμ μΌλ‘ μ€λ²λ‘λ©, μ€λ²λΌμ΄λ©, μ μΊμ€ν , λ€μ΄μΊμ€ν , μΈν°νμ΄μ€, μΆμλ©μλ, μΆμν΄λμ€ λ°©λ²μ΄ λͺ¨λ λ€νμ±μ μνλ€κ³ μκ°νλ©΄ λλ€.
μ¦, λ€νμ±μ ν΄λμ€κ° μμ κ΄κ³μ μμλ λνλλ λ€μ±λ‘μ΄ μ±μ§ μΈ κ²μ΄λ€.
μ€μν μ νμ λΉμ ν΄μ ν΄λμ€ λ€νμ±μ μΉμνκ² μ΄ν΄ν΄ 보μ.
LGνμ¬μ μ μμ ν μΌλ° TVμ μ€λ§νΈ TVλ₯Ό μμλ₯Ό λ€μ΄λ³΄κ² λ€.

λ€μ μ½λμ κ°μ΄ TV ν΄λμ€μ SmartTV ν΄λμ€κ° μμ κ΄κ³λ₯Ό λ§Ίμλ€κ³ κ°μ νμ.
TV ν΄λμ€μλ μ μ, λ³Όλ₯¨, μ±λ μΌκΈ°/λκΈ° κΈ°λ₯λ°μ μκ³ , μ€λ§νΈ TV ν΄λμ€μλ κΈ°λ³Έ TV λμ λ©μλλ₯Ό μμνκ³ μΆκ°μ μΌλ‘ AI κΈ°λ₯κ³Ό μΌν κΈ°λ₯μ΄ λ€μ΄ μλ€.
class TV {
void powerOn_Off() {} // μ μ μΌκΈ°/λκΈ°
void volumeOn_Off() {} // λ³Όλ₯¨ μΌκΈ°/λκΈ°
void channelOn_Off() {} // μ±λ λ리기
}
class SmartTV extends TV {
void AI_Assistance() {} // μΈκ³΅μ§λ₯ κΈ°λ₯
void shopping() {} // μΌννκΈ°
}
보ν΅μ μ°λ¦¬λ μΌλ°μ μΌλ‘ λμΌν ν΄λμ€ νμ μ μ°Έμ‘° λ³μλ₯Ό μμ±ν΄ μ΄κΈ°ν νμ¬ μ¬μ©ν΄μμλ€.
Tv tv_remotecontrol = new Tv();
SmartTv smart_remotecontrol = new SmartTv();
κ·Έλ μ§λ§ λ§μΌ λΆλͺ¨ μμ μμ κ΄κ³μ μμΌλ©΄ λ€μκ³Ό κ°μ΄ λΆλͺ¨ νμ μΌλ‘ μμ ν΄λμ€ νμ μ λ°μ μ΄κΈ°ν ν μ μλ€.
TV tv_remoteControl = new SmartTV();
// Tv ν΄λμ€ νμ
μ μ°Έμ‘°λ³μ remoteControlλ₯Ό μ μΈνλ€.
// SmartTvμ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , μ΄ μΈμ€ν΄μ€μ μ£Όμκ°μ μ°Έμ‘°λ³μ remoteControlμ λμ
νλ€.
μμ μν©μ κ·Έλ¦ΌμΌλ‘ 보면 μλμ κ°μ΄ νν ν μ μλ€.
λ§μΉ μΌλ° ν λ λΉμ μ 리λͺ¨μ½μΌλ‘ μ€λ§νΈ ν°λΉλ₯Ό μ‘°μ’ νλ κ²κ³Ό κ°λ€. (TV ν΄λμ€ νμ μ λ³μ μ΄λκΉ)

λ¬Όλ‘ ν΄λΉ 리λͺ¨μ½μ μΌλ° TVμλ μ°λ 리λͺ¨μ½μ΄λΌ μ€λ§νΈν κΈ°λ₯μ μ‘°μνμ§ λͺ»νλ€.
κ·Έλ¬λ κ°μ LG νμ¬μ μ νμ΄λΌμ κΈ°λ³Έμ μΈ TV κΈ°λ₯(λ³Όλ₯¨, μ±λ, μ μ)μ νΈνμ΄ λλ€κ³ νλ€.
λ°λΌμ μ¬μ©ν μ μλ κΈ°λ₯μ΄ μ€μ΄λ κ² λΏμ΄μ§ μ€λ§νΈ TV μμ²΄κ° λμνλ κ²μ λ¬Έμ κ° μλ€. (μ»΄νμΌ μλ¬κ° μμ)
κ·ΈλΌ λ°λ μν©μ μ½λλ₯Ό 보μ.
μμ ν΄λμ€ νμ΄μ μ°Έμ‘° λ³μλ‘ λΆλͺ¨ ν΄λμ€λ₯Ό μμ±νμ¬ μ΄κΈ°ννλ€.
SmartTv smart_remotecontrol = new Tv();
μμ λ°λ μν©μ κ·Έλ¦ΌμΌλ‘ 보면 μλμ κ°μ΄ νν ν μ μλ€.
μ€λ§νΈ ν°λΉ 리λͺ¨μ½μΌλ‘ μΌλ° ν°λΉλ₯Ό λ€λ£¨κ² λλ κ²μ΄λ€.
μ€λ§νΈ ν°λΉ 리λͺ¨μ½μ μΌλ° 리λͺ¨μ½κ³Όλ λ¬λ¦¬ AI κΈ°λ₯μ μ΄μ©ν μ μλ λ²νΌκ³Ό, μΌνμ μ¦κΈΈ μ μλ λ²νΌμ΄ μλ€.

κ·Έλ°λ° λ§μΌ μ€λ§νΈ TVμμλ§ μλ κ°λ₯ν μ΄ κΈ°λ₯ λ²νΌμ λλ₯΄λ©΄ μ΄λ»κ² λ κΉ?
μΌλ° ν°λΉλ μ μ νμ§ μμ λ²νΌ λμ 컀맨λλ₯Ό μμ νκ² λλ©΄ μ€λ₯λ₯Ό μΌμΌν¬ κ²μ΄λ€.
μλνλ©΄ TVμλ ν΄λΉ κΈ°λ₯ λ©μλκ° μκΈ° λλ¬Έμ΄λ€.
μΌλ° TVμ΄λ μ€λ§νΈ TVμ΄λ 리λͺ¨μ½μ΄λκΉ κΈ°λ³Έ λμ μ체λ λμ§ μμκΉ μΆμλ°, λ§μΌ μλΉμκ° λΆμ£Όμλ‘ μΌλ° TVμλ μλ κΈ°λ₯ λ²νΌμ λλ¬ TVκ° λ§κ°μ§κ² λλ€λ©΄, μλΉμ€ μΌν°λ μλ§ ν°μ§ κ²μ΄λ€.
λ¬Όλ‘ μλΉμ λΆμ£ΌμλΌ μλΉμ μ± μμ μμμ μμ§λ§, μ°¨λΌλ¦¬ μ΄λ΄λ°μ κ·Έλ₯ μ€λ§νΈ TV 리λͺ¨μ½μΌλ‘λ μΌλ° TVλ₯Ό λ€λ£¨μ§ λͺ»ν΄κ² μμ² μ°¨λ¨ νλ κ²μ΄ κ°λ§ μκ°ν΄λ³΄λ©΄ μ΄κ²μ΄ λΉμ©μ μΌλ‘ ν¨μ¬ ν¨μ¨μ μ΄κ³ μ΄λμ΄λ€.
λ°λΌμ κ°λ°μμ λΆμ£Όμλ‘ μΈν νλ‘κ·Έλ¨ μλ¬λ₯Ό μμ² μ°¨λ¨νκΈ° μν΄ μΌλ°μ μΌλ‘ μλ°μμλ μμ μ½λλ λ¬Έλ²μ μΌλ‘ μ³μ§μλ€κ³ νμ¬ μ»΄νμΌ μλ¬λ₯Ό λ΄λΏκ² λλ€.

νμ§λ§ μ무리 μκ°ν΄λ μ€λ§νΈ TV 리λͺ¨μ½μΌλ‘ μΌλ° TVλ₯Ό μμ λͺ» λ€λ£¬λ€λ κ²μ λκ° λΆλ§μ΄λ€.
μκ·Έλ¬λ©΄ μ κΈ° λ©λ¦¬ λ§€μ₯μ κ°μ λ μΌλ° 리λͺ¨μ½μ μ¬μΌλκΈ° λλ¬Έμ΄λ€.
λ¬Όλ‘ μΆκ° λ²νΌμ λλ¬ TVκ° λ§κ°μ§ μ μλ μνμ±μ΄ μ‘΄μ¬νμ§λ§, λ§μΌ μλΉμ λΆμ£Όμλ‘ TVκ° λ§κ°μ§κ² λλ©΄ μ μ μΌλ‘ μλΉμ μ± μμΌλ‘ νκΈ°λ‘ νκ³ μ€μ€λ‘ μ‘°μ¬νμ¬ μ΄μ©νλ©΄ λμ§ μμκΉ μΆλ€.
μ΄λ¬ν κΈ°λ₯μ΄ λ°λ‘ μλ° κ°μ²΄ μ§ν₯ ν΄λμ€λ₯Ό λ€λ£¨λ€ 보면 νλ²μ―€ λ€μ΄λ³΄κ² λλ UpCasting / DownCastingμ λ€μ΄μΊμ€ν (DownCasting) λΆλΆμ΄λ€.
Tv tv = new Tv();
SmartTv smart_remotecontrol = (SmartTv) tv;
κ·Έλ¬λ μ¬μ€ μμ μ½λλ λΉ¨κ°μ€μ μμ³μ§μ§λ§ μ€μ λ‘ λμνμ§ μλλ€. (λ°νμ μλ¬)
μ΄μ λν΄μλ μλ°μ UpCasting / DownCasting μ μμΈν μκ°νλ ν¬μ€ν μ μ°Έκ³ νκΈΈ λ°λλ€.
μλ£ν λ€νμ±
μ΄μ°λ¬λ κ°μ λΆλͺ¨ ν΄λμ€ νμ μΌλ‘ μμ ν΄λμ€λ₯Ό μμ±ν΄ ν λΉλ°μ μ μλ€λ μ¬μ€μ λ°°μ λ€.
κ·ΈλΌ μ΄λ κ² TV tv = new SmartTV() μ μΈν΄μ μ¬μ©νλ κ²μ΄ λ체 μ΄λ ν μ΄λμ΄ μκΈΈλ κ·Έλ κ² λ€νμ± λ€νμ± κ±°λ¦¬λ κ²μΌκΉ?
ν΅μ¬μ λ°λ‘ 'νμ λ¬Άμ' μ΄λ€.
λ€μκ³Ό κ°μ΄ Listλ₯Ό λ§λ€μ΄μ κ°κ° Rectangle, Triangle, Circle ν΄λμ€ μλ£νμ μ μ₯ν μ μλλ‘ νκ³ , κ°μ²΄ λ°μ΄ν°λ₯Ό λ§λ€μ΄ λ£μ ν μ΄λ₯Ό for λ¬Έμ μ΄μ©ν΄μ λ΄μ©μ μΆλ ₯μ ν΄λ³΄λλ‘ νμ.
νμ
μ λ§λ 리μ€νΈλ₯Ό κ°λ³λ‘ μμ±νκ³ add μ forEach λ₯Ό ν΅ν΄ ꡬννμλ€.
class Rectangle {
}
class Triangle {
}
class Circle {
}
ArrayList<Rectangle> rectangles = new ArrayList<>();
rectangles.add(new Rectangle(1,2,3,4));
rectangles.add(new Rectangle(10,20,30,40));
rectangles.forEach(each -> System.out.println(each));
ArrayList<Triangle> triangles = new ArrayList<>();
triangles.add(new Triangle(1,2,3));
triangles.add(new Triangle(10,20,30));
triangles.forEach(each -> System.out.println(each));
ArrayList<Circle> circles = new ArrayList<>();
circles.add(new Circle());
circles.add(new Circle());
circles.forEach(each -> System.out.println(each));
νλμ λ΄λ λ°λ³΅λλ λλμ μμ§λ§ μ΄μ°νκ² λκ°? Rectangleκ³Ό Colorλ μμ°ν νμ μ΄ λ€λ₯΄κΈ° λλ¬Έμ μ΄λ°μμΌλ‘ ꡬννμ¬μΌ νλ€.
νμ§λ§ λ€μκ³Ό κ°μ΄ Shape λΌλ λΆλͺ¨ ν΄λμ€μ μμ κ΄κ³λ₯Ό λ§Ίκ² λλ©΄, λ§μ½ μ΄λ€ κ°μ²΄κ° μ€μ λ‘λ Rectangleμ΄λΌκ³ ν΄λ μΈλΆμμ μΈμνκΈ°λ₯Ό Shapeμ΄λΌλ©΄ κ·Έκ²μ Shapeκ° λκ² λλ€.
κ·Έ μ€μ²΄κ° Rectangleμ΄λΌλ μ¬μ€μ κ·Έ κ°μ²΄ λ΄λΆμμλ μ€μν κ²μ΄μ§ λ°μμ κ·Έ κ°μ²΄λ₯Ό μ¬μ©νλ μ μ₯μμλ λμ΄κ°λ λλ€.
μ¦, κ·Έ κ°μ²΄λ κ·Έλ₯ ShapeμΌ λΏμ΄κ² λλ€.

μ΄λ₯Ό μ΄μ©ν΄ Shape λΌλ μλ£νμΌλ‘ λ¬Άμ΄ μ½λλ₯Ό νμ€ν μμΆ ν μ μλ€.
곡ν΅μ μΈ μμ ν΄λμ€μ νΉμ§μ μ΄μ©ν΄ κ° μλ£νμ νμ μ λ¬Άμ κ²μ΄λ€.
class Shape {
}
class Rectangle extends Shape {
}
class Triangle extends Shape {
}
class Circle extends Shape {
}
ArrayList<Shape> shapes = new ArrayList<>();
shapes.add(new Rectangle(1,2,3,4));
shapes.add(new Rectangle(10,20,30,40));
shapes.add(new Triangle(1,2,3));
shapes.add(new Triangle(10,20,30));
shapes.add(new Circle());
shapes.add(new Circle());
shapes.forEach(each -> System.out.println(each));
λ§μ½ μλ‘ λ€λ₯Έ μ’ λ₯μ κ°μ²΄κ° ν¨μ¬ λ λ§μλλΌλ©΄ λμ± λ§μ μ½λλ€μ΄ λ§λ²μ²λΌ μ¬λΌμ‘μ κ²μ΄λ€.
λ§μΌ κ° μμ ν΄λμ€μμ νΉμν μ μ© λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ€κ³ νλ©΄, λ©μλ μ€λ²λΌμ΄λ©μ ν΅ν΄ λΆλͺ¨μ μμ ν΄λμ€μ λ©μλλ₯Ό ꡬνν΄μ£Όκ±°λ λ°λ‘ κ·Έ μμλ§ λΉΌμ λ€μ΄μΊμ€ν μ μμΌ λ©μλλ₯Ό μ€νν΄μ£Όλ©΄ λλ€.
λ§€κ°λ³μ λ€νμ±
λ€νμ±μ νΉμ±μ κΌ λ³μμ νμ λΏλ§ μλλΌ μΈν°νμ΄μ€λ νλΌλ―Έν°μμλ λκ°μ΄ μ μ©λλ€.
λ€μ Tiger, Lion, Dog ν΄λμ€κ° μκ³ μ΄ ν΄λμ€μ κ°μ²΄λ₯Ό μ
λ ₯κ°μΌλ‘ λ°λ€ bark() λ©μλλ₯Ό μ€ννλ©΄ κ° κ°μ²΄μ μΈμ€ν΄μ€ λ³μ lang μ μ°Έμ‘°ν΄μ μΈμμ리λ₯Ό λ΄λ νλ‘κ·Έλ¨μ λ€μκ³Ό κ°μ΄ κ΅¬μ± νμλ€.
μ΄λ bark() λ©μλμ ꡬμ±μ 보면 λ§€κ°λ³μλ§λ€ λ€λ₯Έ κ°μ²΄ νμ
μ λ°μ μ€ννλλ‘ λμ΄ μμ΄ λ©μλ μ€λ²λ‘λ©μ ν΅ν΄ ꡬνλ¨μ λ³Ό μ μλ€.
class Tiger {
String lang = "μ΄ν₯";
}
class Lion {
String lang = "μΌλ₯΄λ ";
}
class Dog {
String lang = "λ©λ©";
}
class Bark {
// λ©μλ μ€λ²λ‘λ©
void bark(Tiger tiger) {
System.out.println(tiger.lang);
}
void bark(Lion lion) {
System.out.println(lion.lang);
}
void bark(Dog dog) {
System.out.println(dog.lang);
}
}
public class Main2 {
public static void main(String[] args) {
Tiger tiger = new Tiger();
Lion lion = new Lion();
Dog dog = new Dog();
Bark command = new Bark();
command.bark(tiger); // μ΄ν₯
command.bark(lion); // μΌλ₯΄λ
command.bark(dog); // λ©λ©
}
}
λ©μλ μ€λ²λ‘λ©μ΄ λμ κΈ°λ²μ μλμ§λ§ κ·Έλ λ€κ³ μ’μ λ°©λ²λ μλκ²μ΄, λ§μΌ Catμ΄λΌλ ν΄λμ€λ₯Ό μΆκ°νλ€κ³ κ°μ νλ©΄ λ€μκ³Ό κ°μ΄ bark() λ©μλλ₯Ό λ μμ±ν΄μ£Όκ³ λ§€κ°λ³μλ‘ μλ‘μ΄ κ°μ²΄ νμ
μ λ°μμΌ νλ€.
κ·Έλ¬λ€κ° Lion ν΄λμ€λ₯Ό μμ ν΄μΌ νλ€λ©΄ λ€μ Bark ν΄λμ€μ λ©μλ ꡬμ±μ μμ ν΄μΌ νλ λ²κ±°λ‘μμ΄ μκΈ΄λ€.
// ...
// λ§μΌ Cat ν΄λμ€κ° μλ‘ μΆκ°λλ©΄,
class Cat {
String lang = "λμΉ";
}
// Bark ν΄λμ€μ λ©μλλ μλ‘μ΄ ν΄λμ€ νμ
μΌλ‘ μλ‘ μΆκ°ν΄ μ£Όμ΄μΌ νλ€.
class Bark {
// ...
void bark(Cat cat) {
System.out.println(cat.lang);
}
// ...
}
λ°λΌμ λ€μκ³ κ°μ΄ Animal μΈν°νμ΄μ€λ₯Ό μμ±νκ³ κ° ν΄λμ€λ§λ€ μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ μ§μ ν¨μΌλ‘μ¨ λ³΄λ€ κ°μ²΄ μ§ν₯ μ μΌλ‘ μ½λλ₯Ό κ΅¬μ± ν μ μλ€.
μΈν°νμ΄μ€ ꡬνμ ν΅ν΄ λλ¬Ό ν΄λμ€λ€μ ꡬμ±νλλ, Bark ν΄λμ€μ λ©μλκ° Animal νμ μ λ°λ λ§€κ°λ³μλ₯Ό μ§λ λ©μλ νλλ‘ ν μ€μ΄λ¬μ λ³Ό μ μλ€.
interface Animal {
void start();
}
class Tiger implements Animal {
String lang = "μ΄ν₯";
public void start() {
System.out.println(this.lang);
}
}
class Lion implements Animal {
String lang = "μΌλ₯΄λ ";
public void start() {
System.out.println(this.lang);
}
}
class Dog implements Animal {
String lang = "λ©λ©";
public void start() {
System.out.println(this.lang);
}
}
class Bark {
void bark(Animal animal) {
animal.start();
}
}
public class Main2 {
public static void main(String[] args) {
Tiger tiger = new Tiger();
Lion lion = new Lion();
Dog dog = new Dog();
Bark command = new Bark();
command.bark(tiger); // μ΄ν₯
command.bark(lion); // μΌλ₯΄λ
command.bark(dog); // λ©λ©
}
}
μ΄μ μλ κ° κ°μ²΄ νμ μ μΌμΌν λ°μλ΄κΈ° μν΄ λ©μλ μ€λ²λ‘λ©μ ν΅ν΄ λ©μλλ₯Ό μΌμΌν μμ±ν΄ μ€μΌ κ² μ§λ§, μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ€νμ±μ ꡬμΆν΄ λμΌλ©΄ λμ€μ Cat ν΄λμ€κ° μΆκ°λλλΌλ μΈν°νμ΄μ€λ₯Ό ꡬν λ°κ³ ꡬμ±ν΄μ£Όλ©΄ λμ΄μ Bark ν΄λμ€μ λ©μλλ₯Ό μ λ°μ΄νΈ ν νμκ° μμ΄μ§λ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ 무μΈκ°λ₯Ό ꡬννλ νλ‘κ·Έλλ° κΈ°λ²μ΄ μλλΌ, κ°λ°μ μ©μ΄νκ² ν΄μ£Όλ μ€κ³ κΈ°λ² μμ κΈ°μ΅νμ.
// ...
// μΆκ°ν ν΄λμ€κ° μλ€λ©΄ Animal μΈν°νμ΄μ€λ₯Ό ꡬνλ§ ν΄μ£Όλ©΄,
class Cat implements Animal {
String lang = "λμΉ";
public void start() {
System.out.println(this.lang);
}
}
// Bark ν΄λμ€λ λ°λ‘ κ±΄λ€ νμκ° μλ€.
class Bark {
void bark(Animal animal) {
animal.start();
}
}
λ©μλ λ€νμ±
κΌ κ°μ²΄ νμ κ΄μ μμ λΏλ§ μ리λ λ©μλλ₯Ό νμ₯νκ±°λ μ¬μ μνλ overloading / overriding λ λ©μλκ° λ€ν(ε€ε½’) ν΄ μ§κΈ° λλ¬Έμ μλ°μ λ€νμ± νΉμ§ μ€ νλμ μνλ€κ³ λ³Ό μ μλ€.
class Parent {
// μ€λ²λ‘λ©
public void print(int value) {
System.out.println("μ«μ μΆλ ₯ = " + value);
}
// μ€λ²λ‘λ©
public void print(String value) {
System.out.println("λ¬Έμ μΆλ ₯ = " + value);
}
public void add(int x, int y) {
System.out.println(x + y);
}
}
class Child extends Parent {
// μ€λ²λΌμ΄λ©
public void add(int x, int y) {
System.out.println((x + y) * 2);
}
}
class Main{
public void main(String[]args) {
Parent p = new Parent();
p.print(100); // κ²°κ³Ό : μ«μ μΆλ ₯ = 100 (μ€λ²λ‘λ©)
p.print("test"); // κ²°κ³Ό : λ¬Έμ μΆλ ₯ = "test" (μ€λ²λ‘λ©)
p.add(1,2); // κ²°κ³Ό : 3
Parent p2 = new Child();
p2.add(1,2); // κ²°κ³Ό : 6 (μ€λ²λΌμ΄λ©)
}
}
# μ°Έκ³ μλ£
https://effectiveprogramming.tistory.com/entry/%EC%83%81%EC%86%8DInheritance%EC%97%90-%EB%8C%80%ED%95%9C-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%9D%B4%ED%95%B4?category=660012
https://peterdrinker.tistory.com/353
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.