λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’Ž/Java

[Java] 좔상 클래슀 vs μΈν„°νŽ˜μ΄μŠ€

by dar0m! 2021. 8. 18.

μΈν„°νŽ˜μ΄μŠ€

  • μΈν„°νŽ˜μ΄μŠ€λŠ” 섀계도 λ˜λŠ” λͺ…세라고 생각할 수 μžˆλ‹€.
  • λͺ¨λ“  λ©”μ†Œλ“œκ°€ 좔상 λ©”μ†Œλ“œμ΄κ³ , 일반 λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
    • μžλ°” 8 λΆ€ν„° default method, static method도 μ •μ˜ κ°€λŠ₯
    • default ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ©”μ†Œλ“œ κ΅¬ν˜„μ΄ κ°€λŠ₯. λ˜ν•œ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” defaultλ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•  수 μžˆλ‹€.
      • μΈν„°νŽ˜μ΄μŠ€κ°€ 변경이 되면, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λͺ¨λ“  ν΄λž˜μŠ€λ“€μ΄ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€. 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄ 놓을 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.
    • static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ©”μ†Œλ“œ κ΅¬ν˜„μ΄ κ°€λŠ₯
      • μΈν„°νŽ˜μ΄μŠ€μ— static λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•¨μœΌλ‘œμ¨, μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ κ°„λ‹¨ν•œ κΈ°λŠ₯을 κ°€μ§€λŠ” μœ ν‹Έλ¦¬ν‹°μ„± μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ 수 있게 λ˜μ—ˆλ‹€.
      • λ°˜λ“œμ‹œ 'μΈν„°νŽ˜μ΄μŠ€λͺ….λ©”μ†Œλ“œλͺ…()'둜 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.
      • Calculator.exec2(5, 10)
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” λͺ¨λ“  λ©”μ†Œλ“œλ₯Ό κ°•μ œμ μœΌλ‘œ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.
  • μ„ μ–Έ μ‹œ interface ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • μƒμ†μ‹œ implements ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
interface Vehicle {
    abstract void run ();
    abstract void move ();
}
class Car implements Vehicle {
    Car() {}

    void run() {
    	....
    }

    void move() {
       	....
    }

}

μ‚¬μš©ν•˜λŠ” 이유

  • 섀계도라고 μƒκ°ν•˜λ©΄ λœλ‹€.
  • ν•˜λ‚˜μ˜ κ·œμ•½, 즉 κ΅¬μ²΄μ μΈ 약속 같은 κ²ƒμœΌλ‘œ 인해 ν˜‘μ—…μ— ν•„μˆ˜μ μ΄λΌκ³  λ³Ό 수 μžˆλ‹€.
  • 큰 ν”„λ‘œμ νŠΈμΌμˆ˜λ‘ λ˜λŠ” 개발 인원이 λ§Žμ„ 경우 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 λ§Žμ€ 이점을 μ–»κ²Œ λœλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μœΌλ‘œ μ „λž΅ νŒ¨ν„΄(Stratergy Pattern)이 μžˆλ‹€.
    • μΈν„°νŽ˜μ΄μŠ€μ—λŠ” μ„œλΈŒ 클래슀(μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀)듀이 κ΅¬ν˜„ν•  λ©”μ„œλ“œμ˜ μ„ μ–Έλ§Œ μ •μ˜ν•œλ‹€.
    • 즉, λͺ¨λ“  μ„œλΈŒ ν΄λž˜μŠ€λ“€μ€ 같은 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. λ¬Όλ‘  선언을 μ œμ™Έν•œ λ©”μ„œλ“œμ˜ κ΅¬ν˜„ λ‚΄μš©μ€ λ‹¬λΌμ§ˆ 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ „λž΅νŒ¨ν„΄μ—μ„œλŠ” μ„œλΈŒ ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•˜μ§€ μ•Šμ€ λ©”μ„œλ“œλ₯Ό λ”°λ‘œ μ •μ˜ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. κ²°κ΅­ λͺ¨λ“  μ„œλΈŒ ν΄λž˜μŠ€λŠ” μ„ΈλΆ€μ μœΌλ‘  λ‹€λ₯Ό 수 μžˆκ² μ§€λ§Œ κ°™μ€ λ™μž‘μ„ ν•œλ‹€.
 

[JAVA] Interface vs Abstract Class

λΆ€μ œ: μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€μ˜ 비ꡐ  μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€μ˜ 차이점. JAVA μ„œμ  μ•„λ¬΄κ±°λ‚˜ 펴보면 무쑰건 λ‚˜μ˜€λŠ” λ‚΄μš©μ΄λ‹€. ν˜Ήμ‹œ 당신은 κ·Έλƒ₯ 문법적인 차이만 λŒ€μΆ© μ•Œκ³  λ„˜μ–΄κ°€μ§€ μ•Šμ•˜λŠ”

preamtree.tistory.com

 

좔상 클래슀

  • μΈν„°νŽ˜μ΄μŠ€ 역할도 ν•˜λ©΄μ„œ, κ΅¬ν˜„μ²΄λ„ 가지고 μžˆλŠ” ν΄λž˜μŠ€μ΄λ‹€.
  • 0개 μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œ(아직 κ΅¬ν˜„λ˜μ§€ μ•Šμ€ λ©”μ†Œλ“œ)λ₯Ό 가지고 일반 λ©”μ„œλ“œ, 일반 λ³€μˆ˜ λ˜ν•œ κ°€μ§ˆ 수 μžˆλ‹€.
  • μ„ μ–Έ μ‹œ ν‚€μ›Œλ“œλŠ” abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • 좔상 클래슀λ₯Ό μƒμ†ν•˜κΈ° μœ„ν•΄μ„œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
abstract class Animal {

    abstract void bark();
    void feed() {
       .....
    }
    
}
class Dog extends Animal {
    Dog() {}

    void bark() {
      ....
    }
}

μ‚¬μš©ν•˜λŠ” 이유

  • 상속을 κ°•μ œν•˜κΈ° μœ„ν•¨μ΄λ‹€.
  • λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λ§Œ 해놓고, μ‹€μ œ λ™μž‘μ€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ ν•˜κ²Œ λœλ‹€.
  • μ΄λŸ¬ν•œ 좔상 클래슀의 성격이 잘 λ°˜μ˜λ˜μ–΄μ§„ 것이 ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄(Template Method Pattern), νŒ©ν† λ¦¬ λ©”μ†Œλ“œ νŒ¨ν„΄(Factory Method Pattern)이닀.
    • λ³€ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯은 좔상 ν΄λž˜μŠ€μ— κ΅¬ν˜„ν•˜κ³ , 자주 λ³€κ²½λ˜κ±°λ‚˜ ν™•μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯은 μ„œλΈŒ ν΄λž˜μŠ€μ— μœ„μž„ν•˜μ—¬ κΈ°λŠ₯의 ν™•μž₯을 μΆ”κ΅¬ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€.
 

νŒ©ν† λ¦¬ λ©”μ†Œλ“œ νŒ¨ν„΄(Factory Method Pattern) :: 마이ꡬ미

이 글은 νŒ©ν† λ¦¬ λ©”μ†Œλ“œ νŒ¨ν„΄(Factory Method Pattern) 을 닀룬닀. λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œμ¨, 특히 Java μ—μ„œ 많이 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄ 쀑 ν•˜λ‚˜μ΄λ‹€. Java μ—μ„œλŠ” abstract λ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— abstract λ₯Ό ν™œμš©ν•œλ‹€.

mygumi.tistory.com

 

 

곡톡점

ν˜Όλž€μ„ μ΄ˆλž˜ν•˜λŠ” 점

좔상 클래슀, μΈν„°νŽ˜μ΄μŠ€ λͺ¨λ‘ μΈμŠ€ν„΄μŠ€ν™”κ°€ 될 수 μ—†λ‹€. κ·Έλž˜μ„œ κ²‰λ§Œ λ³΄κΈ°μ—λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λ™μΌν•˜κ²Œ 보일 수 μžˆλ‹€.

 

차이점

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받은 경우 λͺ¨λ“  λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν–ˆλ‹€.
  • 반면, 좔상 클래슀λ₯Ό 상속받은 경우 일반 λ©”μ†Œλ“œκ°€ μ•„λ‹Œ 좔상 λ©”μ†Œλ“œλ§Œ κ΅¬ν˜„ν–ˆλ‹€.

 

  • λ”°λΌμ„œ, 좔상 ν΄λž˜μŠ€λŠ” ν‚€μ›Œλ“œ κ·ΈλŒ€λ‘œ ν™•μž₯, 상속을 μ˜λ―Έν•¨μœΌλ‘œμ¨, λ¬Όλ €μ£ΌλŠ” κ°œλ…μ΄ 되고 (feed λ©”μ†Œλ“œλŠ” λ¬Όλ €λ°›μ•˜κΈ°μ— κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ‹€),
    • λΆ€λͺ¨-μžμ‹ 관계인 계측 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λŠ” 상속 κ°œλ…μ΄ μ•„λ‹Œ, λ™μΌν•œ λ™μž‘μ„ μœ„ν•œ κ΅¬ν˜„μ„ κ°•μ œν™”ν•˜μ—¬ λ™μΌν•œ λ™μž‘μ„ 보μž₯ν•œλ‹€.

결둠적으둜, 좔상 ν΄λž˜μŠ€λŠ” 상속 κ°œλ…, μΈν„°νŽ˜μ΄μŠ€λŠ” 그렇지 μ•Šλ‹€λŠ” 것을 μ΄ν•΄ν•˜λ©΄ μ„œλ‘œ κ°€μ§€λŠ” λͺ©μ μ„ ꡬ뢄짓을 수 μžˆλ‹€.

 

μ°Έκ³ 

'πŸ’Ž > Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] GC 방식  (0) 2021.08.25
[Java] Java SE, Java EE, Java ME  (0) 2021.08.18
[Java] λ³€μˆ˜μ˜ scope와 static  (0) 2021.08.11
[Java] 가비지 μ»¬λ ‰μ…˜(Garbage Collection)  (0) 2021.08.11
[Java] λžŒλ‹€μ‹  (0) 2021.08.10

λŒ“κΈ€