β μΈν°νμ΄μ€(Interface) νΉμ§
μλΈ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μμλ°μλ€λ μλ―Έλ μ΄λ₯Ό 'ꡬν'νλ κ²μ λλ€.
μ΄λ€ ν΄λμ€μκ² νΉμ μ± μμ λΆμ¬νκ³ μΆμ λ μ¬μ©ν©λλ€.
- μΈν°νμ΄μ€λ ꡬνν λ©μλμ μ§ν©μ μ μΈν κ²μ΄λ€.
- μΈν°νμ΄μ€ λ΄λΆ ν¨μμ λͺ μμ μΌλ‘ abstractμ νμνμ§ μμλ νμ abstractμ΄λ€.
- μΈν°νμ΄μ€λ₯Ό μμλ°μ ν΄λμ€λ abstract λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ νλ€.
- μΈν°νμ΄μ€λΌλ¦¬ μμμ΄ κ°λ₯νλ€.
- μΈν°νμ΄μ€ μ κ·Όμλ Public λ§ κ°λ₯νλ€.
- μΈν°νμ΄μ€ λ΄λΆ ν¨μμ μ κ·Όμλ Publicλ§ κ°λ₯νλ€.
- μΈν°νμ΄μ€λ λ΄λΆ λ³μ μ μΈμ΄ λΆκ°λ₯νλ€. (static final μμλ§ κ°λ₯νλ€)
- μΈν°νμ΄μ€λ λ€μ€ ꡬνμ΄ κ°λ₯νλ€.
- μΈν°νμ΄μ€ λ΄λΆ ν¨μλ abstract ν¨μλ§ κ°λ₯νλ€.
(κ·Έλ°λ° Java 8λΆν°λ default ν€μλλ₯Ό ν΅ν΄ ν¨μ ꡬνμ΄ κ°λ₯νλ€κ³ νλ€) - μΈν°νμ΄μ€λ μμ±μ μ μκ° λΆκ°λ₯νλ€.
- μΈν°νμ΄μ€λ μΈμ€ν΄μ€νν μ μλ€.
β μΆμ ν΄λμ€(Abstract class) νΉμ§
μλΈ ν΄λμ€κ° μΆμ ν΄λμ€λ₯Ό μμλ°μλ€λ μλ―Έλ λΆλͺ¨ ν΄λμ€μ ꡬνμ μ¬μ¬μ©ν¨μΌλ‘μ¨ μ΄λ₯Ό 'νμ₯'νλ κ²μ λλ€.
λ°λΌμ κ³μΈ΅μ μΈ κ΄κ³μμ μ¬μ©λ©λλ€.
- μΆμ ν΄λμ€λ₯Ό μμλ°μΌλ©΄ μΆμ ν΄λμ€ λ΄λΆ λ³μμ λ©μλλ₯Ό λͺ¨λ μμλ°λ κ²μ΄λ€. λ§μ½ abstract λ©μλκ° μλ€λ©΄ μ΄λ₯Ό λ°λμ ꡬνν΄μΌ νλ€.
- μΆμ ν΄λμ€μ μ κ·Όμλ public, private, protected λͺ¨λ κ°λ₯νλ€.
- μΆμ ν΄λμ€ λ΄λΆ ν¨μμ μ κ·Όμλ public, private, protected λͺ¨λ κ°λ₯νλ€.
- μΆμ ν΄λμ€ λ΄λΆμ λ³μ μ μΈμ΄ κ°λ₯νλ€.
- μΆμ ν΄λμ€λ λ€μ€ μμμ΄ λΆκ°λ₯νλ€.
- μΆμ ν΄λμ€μ λ΄λΆ ν¨μλ abstractκ° μλμ΄λ λλ€. μ¦, ꡬν μ½λλ₯Ό ν¬ν¨ν ν¨μ μ μκ° κ°λ₯νλ€.
- μΆμ ν΄λμ€ λ΄λΆμ μμ±μ μ μκ° κ°λ₯νλ€.
- μΆμ ν΄λμ€λ μΈμ€ν΄μ€νν μ μλ€.
β μΈν°νμ΄μ€μ μΆμ ν΄λμ€ λΉκ΅
π· 곡ν΅μ
λμ 곡ν΅μ μ μ΄ν΄λ΄ μλ€.
μΈμ€ν΄μ€νν μ μκ³ , abstract λ©μλλ₯Ό κ°μ§κ³ , μμμ΄λΌλ ν€μλλ₯Ό μ¬μ©ν©λλ€.
κ²°κ΅ λ λ€ μΆμμ μΈ λ¬΄μΈκ°μΈ κ²μ λλ€.
π· μ°¨μ΄μ
νμ§λ§ κ°μ₯ ν° μ°¨μ΄μ μ μΈν°νμ΄μ€λ μμ ν€μλλ‘ 'implements'λ₯Ό μ¬μ©νκ³ , μΆμ ν΄λμ€λ μμ ν€μλλ‘ 'extends'λ₯Ό μ¬μ©ν©λλ€.
ν€μλ κ·Έλλ‘ μΆμ ν΄λμ€μ μμμ 'λ΄κ° λ§λ€μ΄ λμ κ²λ€μ κ·Έλλ‘ λ¬Όλ €λ°μΌλ©΄μ λλ¨Έμ§λ λμκ² λ§κ² ꡬνν΄μ νμ₯ν΄!'μ΄κ³
μΈν°νμ΄μ€μ μμμ 'λ΄κ° λμκ² νμν κΈ°λ₯μ΄ λ¬΄μμΈμ§ νλ§ λ§λ€μ΄λ¨μΌλκΉ λμκ² λ§κ² ꡬνν΄μ μ¨!"μΈ λλμ λλ€.
μ£Όμ νΉμ§μ λν΄ νλ‘ μ 리νλ©΄ μλμ κ°μ΅λλ€.
νΉμ§ | μΈν°νμ΄μ€ | μΆμ ν΄λμ€ |
μμ μλ―Έ | ꡬν | νμ₯ |
λ©μλ ꡬν μ¬λΆ | λͺ¨λ μΆμ λ©μλ ꡬν νμ | λͺ¨λ μΆμ λ©μλ ꡬν νμ |
λ©μλ abstract μ¬λΆ | νμ abstract | abstractκ° μλμ΄λ λ¨ |
μ κ·Όμ | Publicλ§ κ°λ₯ | Public, Private, Protected λͺ¨λ κ°λ₯ |
λ΄λΆ λ³μ μ μΈ | λΆκ°λ₯ (static final μμλ§ κ°λ₯) | κ°λ₯ |
λ€μ€ μμ μ¬λΆ | λ€μ€ ꡬν κ°λ₯ | λ€μ€ μμ λΆκ°λ₯ |
λ΄λΆ ν¨μ ꡬν | abstract ν¨μλ§ κ°λ₯ (default λ©μλ μ μΈ) | ꡬν ν¨μ μ μ κ°λ₯ |
μμ±μ μ μ μ¬λΆ | λΆκ°λ₯ | κ°λ₯ |
μΈμ€ν΄μ€ν μ¬λΆ | λΆκ°λ₯ | λΆκ°λ₯ |
β μ μΆμ ν΄λμ€λ λ€μ€ μμμ΄ λΆκ°λ₯νκ°?
μΆμ ν΄λμ€Aμ μΆμ ν΄λμ€ Bκ° μλ€κ³ ν©μλ€.
Aμμ play()λΌλ λ©μλλ₯Ό ꡬννμ΅λλ€. λν, Bμμλ play()λΌλ λ©μλλ₯Ό ꡬννμ΅λλ€.
ν΄λμ€ Cκ° μΆμ ν΄λμ€ Aμ Bλ₯Ό λ€μ€ μμλ°λλ€κ³ νμ λ, μ΄λ¦μ΄ κ²ΉμΉλ play() λ©μλλ μ΄λ ꡬνλΆλ₯Ό μμλ°μμΌ ν κΉμ?
μ΄λ¬ν λͺ¨νΈν¨ λλ¬Έμ λ©μλ ꡬνμ΄ κ°λ₯ν μΆμ ν΄λμ€λ λ€μ€ μμμ΄ λΆκ°λ₯ν©λλ€.
abstract class A{
public void play(){
System.out.println("Aμ λμ");
}
}
abstract class B{
public void play(){
System.out.println("Bμ λμ");
}
}
class C extends A, B{
}
static public void main() {
C c = new C();
c.play(); // μ΄λ€ μ€ν κ²°κ³Όκ° λμμΌ νλκ°?
}
β λμμΈ ν¨ν΄μμμ μΈν°νμ΄μ€μ μΆμ ν΄λμ€
λμμΈ ν¨ν΄μ 곡λΆνλ€ λ³΄λ©΄, μΆμμ μΈ λΆλΆμ λν΄ μΈν°νμ΄μ€λ₯Ό μ¨μΌ ν μ§ μΆμ ν΄λμ€λ₯Ό μ¨μΌ ν μ§ κ³ λ―Όμ΄ λλ κ²½μ°κ° λ§μ΅λλ€.
λ€μν μμ λ€μ λν΄ λμμΈ ν¨ν΄μ μ μ©νλ©΄μ κ°μΈμ μΌλ‘ λλ 건, μμ λ§λ€ λ€λ₯΄λ€λ κ²μ λλ€..
π· μμ : Composite ν¨ν΄
κ°λ Ή, Composite ν¨ν΄ ꡬ쑰λ₯Ό μκ°ν΄ λ΄ μλ€.
μ¬κΈ°μ Componentλ Compositeμ Leafλ₯Ό μΆμνν κ°λ μ λλ€.
κ·Έλ¦¬κ³ ννλ€ Componentλ₯Ό μΈν°νμ΄μ€λΌκ³ λ§νλ κ²μ μ°Ύμ μ μμ΅λλ€.
κ·ΈλΌ μ½λμ Composite ν¨ν΄μ μ μ©νκ³ μΆμ λ Component μν μ νλ ν΄λμ€λ λΉμ°νκ² μΈν°νμ΄μ€λ‘ μ μΈν΄μΌ νλ κ²μΌκΉμ?
Component μν μ Node ν΄λμ€, Leaf μν μ File ν΄λμ€, Composite μν μ Directory ν΄λμ€κ° μλ€κ³ ν΄λ΄ μλ€.
κ·Έλ¦¬κ³ Fileκ³Ό Directoryλ λͺ¨λ name μμ±μ κ°μ§λλ€.
π· [Component μΈν°νμ΄μ€ λ¨μ 1: 곡ν΅λ μμ± μ μΈ]
λ§μ½, Nodeλ₯Ό μΈν°νμ΄μ€λ‘ μ μνλ€λ©΄ Fileκ³Ό Directory κ°κ°μ name μμ±μ μ μΈν΄μΌ ν κ²μ λλ€. μ¬μ€ μ΄λ κ² νλλΌλ μ ν λ¬Έμ λ κ²μ μμ΅λλ€.
κ·Έλ μ§λ§ 곡ν΅λ μμ±μ κ΅³μ΄ λ°λ‘ μ μΈν μ΄μ λ μμ΅λλ€!
Nodeλ₯Ό μΆμ ν΄λμ€λ‘ μ μνμ¬ μ¬κΈ°μ ν λ²λ§ 곡ν΅λ name μμ±μ μ μΈνλ©΄ λ©λλ€.
π· [Component μΈν°νμ΄μ€ λ¨μ 2: κ³΅ν΅ λ©μλ μμ ]
μ¬κΈ°μ nameμ μμ νλ λ©μλκ° μΆκ°λμλ€κ³ ν©μλ€. κ·Έλ¦¬κ³ μ΄ λ©μλμ ꡬν λ΄μ©μ Leafμ΄λ Compositeμ΄λ μκ΄μμ΄ λμΌν©λλ€.
Nodeκ° μΈν°νμ΄μ€λΌλ©΄, Leafμ Composite κ°κ°μ λμΌν ꡬν μ½λμ name μμ λ©μλλ₯Ό μΆκ°ν΄μΌ ν©λλ€.
Nodeκ° μΆμ ν΄λμ€λΌλ©΄, Nodeμ μ μΈλ name μμ±μ λ°λΌ name μμ λ©μλλ Nodeμ ν λ²λ§ ꡬννλ©΄ λ©λλ€.
π· [κ²°λ‘ ]
κ²°λ‘ μ μΌλ‘, 곡ν΅λ μμ±μ΄λ λ©μλκ° μλ κ²½μ°μλ μΆμμ μΈ λΆλΆμ μΆμ ν΄λμ€λ‘ μ μΈνμ¬ μ€λ³΅μ μ΅μνν μ μμ΅λλ€.
μμ μ΄ νμ¬ λμμΈ ν¨ν΄μ μ μ©νλ €λ μν©μ λ§κ² μΆμμ μΈ λΆλΆμ μΈν°νμ΄μ€λ‘ ν μ§, μΆμ ν΄λμ€λ‘ ν μ§ κ²°μ νλ©΄ λ κ² κ°μ΅λλ€.
λ€λ§ μ£Όμν μ μ λ€μ€ μμμ΄ νμν κ²½μ°μλ μΆμ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ λλ€λ κ²μ΄λ€.
'π― Programming' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JAVA] μ€λ³΅ μ κ±° λ°©λ²(+μ λ ¬) (1) | 2025.01.31 |
---|---|
[Github Action] build μ€λ₯ μμΈ λ μμΈν 보λ λ² (0) | 2024.10.08 |
[ISSUE] booleanμμ isκ° μλ΅λλ λ¬Έμ (0) | 2024.09.06 |
SOLID μμΉ (1) | 2024.04.07 |