πβ Study Goal
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP) μΆμν κ°λ μ μ΄ν΄ν©λλ€.
- μΆμνκ° μ¬μ©λλ μ¬λ‘λ₯Ό μ½λλ‘ μμ±ν΄λ΄ λλ€.
βοΈ μΆμν(Abstraction) λ?
μΆμν(Abstraction)λ μ¬λ¬Ό(Object)μ 곡ν΅μ μΈ νΉμ§μ νλμ κ°λ μΌλ‘ λ€λ£¨λ κ²μ μλ―Έν©λλ€.
ex) κ°(Dog)μ κ³ μμ΄(Cat)λ₯Ό λλ¬Ό(Animal)μ΄λΌλ νλμ μΆμμ μΈ κ°λ μΌλ‘ λ€λ£° μ μμ΅λλ€.
π‘ μΆμν(Abstraction)μ μμ(Example)λ 무μμ΄ μμκΉ?
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP) μΈμ΄λ₯Ό λ€λ£¨λ€ 보면 μΆμνκ° λ¬΄μμΈμ§ μ ννλ λͺ¨λ₯΄λλΌλ λͺ μΉμ λν΄μλ λ§μ΄ λ€μ΄λ³΄μμ κ²μ λλ€.
μ€μ λ‘ μΆμνλ₯Ό μ μ©νλλΌλ κ°λ μ λͺ¨λ₯΄κ³ μλ μνλΌλ©΄, μΆμνλ₯Ό μ μ©νμ§λ λͺ¨λ₯΄κ³ μ¬μ©ν λκ° λ§μ΅λλ€.
μμ μμ±λμ΄ μλ κ²μ²λΌ μΆμν(Abstraction)λ μ¬λ¬Ό(Object)μ 곡ν΅μ μΈ νΉμ§μ νλμ κ°λ μΌλ‘ λ€λ£¨λ κ²μ λλ€.
νμ§λ§ μ΄λ κ²λ§ μ΄μΌκΈ°νλ©΄ λ£λ μ¬λμ μ€νλ € μ΄ν΄κ° λμ§ μμ κ²μ λλ€.
νλμ μ¬λ‘λ₯Ό λ€μ΄λ³΄κ² μ΅λλ€.
μΉκ΅¬ Aλ λ§ν°μ¦λ₯Ό ν€μ°κ³ μκ³ , μΉκ΅¬ Bλ μ°μμ½κΈ°λ₯Ό ν€μ°κ³ μμ΅λλ€.
μ΄μ© μΌμΈμ§ λμ λμμ μ°μ± μ λκ°κΈ° μμν©λλ€.
μΉκ΅¬ Aκ° κ·μ¬μ΄ λ§ν°μ¦μ μ°μ± μ νλ€κ° λͺ λν μ°μμ½κΈ°μ μ°μ± νκ³ μλ μΉκ΅¬ Bλ₯Ό λ§λ¬μ΅λλ€.
μΉκ΅¬ Aλ μΉκ΅¬ Bμκ² μΈμ¬λ₯Ό 건λ€κ³ μλ‘μ 'κ°(Dog)' μκ²λ μΈμ¬λ₯Ό νμμ΅λλ€.
μΉκ΅¬ A "λν¬ κ°(Dog)λ 'ν°λ² ν°λ² ' μ κ±·λ νΈμ΄κ΅¬λ? μ°λ¦¬ μ§ κ°λ μμ§ μ΄λ €μ κ·Έλ°μ§ μ κ±·μ§ λͺ»ν΄."
μΉκ΅¬ B "κ·Έλ¬κ², λν¬ κ°(Dog)λ μμ§ μ΄λ €μ κ·Έλ°μ§ 'μ΄μ΄' κ±·λꡬλ
μ΄ μν©μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μΆμν(Abstraction)μ λΉλμ΄ μ΄ν΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
λ μΉκ΅¬λ μλ‘μ μ μ견 'λ§ν°μ¦' μ 'μ°μμ½κΈ°' λ₯Ό μ νν μ½ μ§μ΄μ μ΄μΌκΈ°νμ§ μκ³ 'κ°μμ§(Dog)' λΌλ μΆμμ μΈ λͺ μΉμΌλ‘ λΆλ₯΄κ³ μμ΅λλ€.
λν, μ΄ λμ ν¬κ² κ°(Dog), κ±·λλ€(move)λ 곡ν΅μ μΈ νΉμ§ μ§λκ³ μμ΅λλ€.
μ΄ μΈμλ μ§λλ€(Howl), μ΄λ¦μ΄ μλ€(name) λ± λ€μν 곡ν΅μ μΈ νΉμ§μ΄ μμ κ²μ λλ€.
μΆμν(Abstraction)λ μ¬λ¬Ό(Object)μ 곡ν΅μ μΈ νΉμ§μ νλμ κ°λ μΌλ‘ λ€λ£¨λ κ²μ μλ―Έν©λλ€.
π‘ μ(Why) μΆμν(Abstraction)λ₯Ό μ¬μ©νλμ?
κ·Έλ₯ λ§ν°μ¦λ λ§ν°μ¦, μ°μμ½κΈ°λ μ°μμ½κΈ° λΌκ³ λΆλ₯΄λ©΄ μ λλμ?
μ μ΄λ ΅κ³ ν·κ°λ¦¬κ² κ³΅ν΅ νΉμ§μ νλμ κ°λ μΌλ‘ λ€λ£¨μ΄μΌ νλμ?
μΆμνλ₯Ό λ£κ³ λμ μ²μ λ μ€λ₯Έ μκ°μ λλ€.
νλ‘κ·Έλλ¨Έλ νμ μ(Why)λΌλ μλ¬Έμ νμ΄μΌ νλ€κ³ μκ°ν©λλ€.
λ§ν°μ¦λ λ§ν°μ¦.java, μ°μμ½κΈ°λ μ°μμ½κΈ°.java λ‘ λ°λ‘ μκ°νλ©΄ μ λλ κ²μΌκΉ?
μ 곡ν΅μ μΈ νΉμ§μ νλμ κ°λ μΌλ‘ λ€λ£¨μ΄μΌ νλκ°?
μ κ° κ³΅λΆνκ³ μκ°νλ μΆμνμ μ₯μ μ μ΄λ μ΅λλ€.
1. 곡ν΅μ μΈ νΉμ§μ μΆμ ν΄λμ€λ‘ μ μν΄μ€μΌλ‘μ¨ μ€λ³΅ μ½λ, 보μΌλ¬ νλ μ΄νΈ μ½λλ₯Ό μ€μΌ μ μμ΅λλ€.
2. μ½λμ μ¬μ¬μ©μ±(Reusability) μ¦κ°
3. μ μ§λ³΄μ, κ°λ μ±μ λμΌ μ μμ΅λλ€. (Dogμ κ΄λ ¨λ λͺ¨λ λ‘μ§μ μμ ν΄μΌ ν λ, Dog μΆμ ν΄λμ€λ§ μμ νλ©΄ λ©λλ€.)
* μ°Έκ³
보μΌλ¬ νλ μ΄νΈ μ½λ : μ΅μνμ λ³κ²½μΌλ‘ μ¬λ¬ κ³³μμ μ¬μ¬μ©λλ©°, λ°λ³΅μ μΌλ‘ λΉμ·ν ννλ₯Ό λνλ΄λ μ½λ
π‘ μΆμν(Abstraction)λ₯Ό μ μ©ν μ½λ
public abstract class Dog {
private String name;
private String type;
public Dog(String name, String type) {
this.name = name;
this.type = type;
}
abstract void howl();
abstract void walk();
public void smell() {
System.out.println(name + "μ΄ λμλ₯Ό 맑μ΅λλ€.");
}
public String getName() {
return name;
}
public String getType() {
return type;
}
}
μ°μ λ κ°(Object)μ 곡ν΅μ μΈ νΉμ§μ νλμ κ°λ (Dog)μΌλ‘ λ€λ£¬ μΆμ ν΄λμ€λ₯Ό λ§λ€μ΄ μ£Όκ² μ΅λλ€.
Dog ν΄λμ€λ μΆμ ν΄λμ€λ‘ μ§μ κ°μ²΄λ₯Ό μ μΈν μλ μμ§λ§ νμ ν΄λμ€κ° μμμ λ°μ μ½λλ₯Ό μ¬μ¬μ©ν μ μλλ‘ μ 곡ν©λλ€.
κ°λ κ°μ μ΄λ¦(name)κ³Ό μ΄λ€ μ’ (type)μΈμ§μ λν νλ(field)λ₯Ό κ°μ§κ³ μμ΅λλ€.
νλ(method) μΌλ‘λ μΈκΈ°(howl), κ±·κΈ°(walk)λ₯Ό ν μ μκ³ κΈ°λ³Έμ μΌλ‘ λμ(smell)λ₯Ό 맑μ μ μμ΅λλ€.
public class WelshCorgi extends Dog {
public WelshCorgi(String name) {
super(name, "μ°μμ½κΈ°");
}
@Override
void howl() {
System.out.println("μμ! λλμΌ " + getName() + ", " + getType());
}
@Override
void walk() {
System.out.println("ν°λ²
ν°λ²
");
}
@Override
public void smell() {
super.smell();
System.out.println("νν");
}
}
public class Maltese extends Dog {
public Maltese(String name) {
super(name, "λ§ν°μ¦");
}
@Override
void howl() {
System.out.println("λ©λ©! λλμΌ " + getName() + ", " + getType());
}
@Override
void walk() {
System.out.println("μ΄μ΄");
}
@Override
public void smell() {
super.smell();
System.out.println("μ€μμ€μ");
}
}
μΆμ ν΄λμ€ Dogλ₯Ό μμλ°μ μ°μμ½κΈ°μ λ§ν°μ¦μ λν Classμ λλ€.
getName(), getType(), super.smell()μ λν΄ μ€λ³΅ μ½λκ° λ°μνμ§ μκ³ κ°μμ νΉμ±μ λ§κ² μ¬μ μ λκΈ°λ νμμ΅λλ€.
λ§μ½ λμλ₯Ό 맑μ λ, κ°μμ§μ μ΄λ¦(name)μ΄ μλ μ’ (type)μ 보μ¬μ£Όκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
// before
public void smell() {
System.out.println(name + "μ΄ λμλ₯Ό 맑μ΅λλ€.");
}
// after
public void smell() {
System.out.println(type + "μ΄ λμλ₯Ό 맑μ΅λλ€.");
}
λ¨μν Dog classμ smell()μ λ΄μ©λ§ λ³κ²½ν΄μ€λ€λ©΄ Dogλ₯Ό μμλ°μ ν΄λμ€κ° 10κ°λ , 100κ°λ λμΌνκ² μ μ©λ κ²μ λλ€.
μ¦, μ μ§λ³΄μμ μ¬μ¬μ©μ±μ λμΌ μ μλ€λ μ₯μ μ νμΈν μ μμ΅λλ€.
public class Main {
public static void main(String[] args) {
Dog welshCorgi = new WelshCorgi("λͺ
λ");
Dog maltese = new Maltese("κ·μ€");
System.out.println("λ κ°μμ§κ° μ°μ±
μ λμ κ±·κ³ μμ΅λλ€.");
welshCorgi.walk();
maltese.walk();
welshCorgi.howl();
maltese.howl();
System.out.println("\nλ κ°μμ§κ° μλ‘μ λμλ₯Ό λ§‘κ³ μμ΅λλ€.");
welshCorgi.smell();
maltese.smell();
}
}
μ€ν κ²°κ³Ό
λ κ°μμ§κ° μ°μ± μ λμ κ±·κ³ μμ΅λλ€.
ν°λ² ν°λ²
μ΄μ΄
μμ! λλμΌ λͺ λ, μ°μμ½κΈ°
λ©λ©! λλμΌ κ·μ€, λ§ν°μ¦
λ κ°μμ§κ° μλ‘μ λμλ₯Ό λ§‘κ³ μμ΅λλ€.
λͺ λμ΄ λμλ₯Ό 맑μ΅λλ€. νν
κ·μ€μ΄ λμλ₯Ό 맑μ΅λλ€. μ€μμ€μ
β κ²°λ‘
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP)μ μΆμν(Abstraction)μ κ°λ μ 곡λΆν¨μΌλ‘μ¨, μΆμν μ μ© μ½λμ λ―Έμ μ© μ½λλ₯Ό ꡬλΆν μ μμ΅λλ€.
- μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μ λ° μ¬μ¬μ©μ±μ μν΄ κ³΅ν΅μ μΈ νΉμ§μ μΆμν(Abstraction)ν΄μΌκ² λ€λ μκ°μΌλ‘ μ νν μ μμ΅λλ€.
github : https://github.com/tmdgh1592