μΈν„°νŽ˜μ΄μŠ€(Interface) vs 좔상 클래슀(Abstract class)

2024. 5. 25. 01:05·🎯 Programming
λ°˜μ‘ν˜•

βœ… μΈν„°νŽ˜μ΄μŠ€(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 νŒ¨ν„΄ ꡬ쑰λ₯Ό 생각해 λ΄…μ‹œλ‹€.

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
'🎯 Programming' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [JAVA] 쀑볡 제거 방법(+μ •λ ¬)
  • [Github Action] build 였λ₯˜ 원인 더 μžμ„Ένžˆ λ³΄λŠ” 법
  • [ISSUE] booleanμ—μ„œ isκ°€ μƒλž΅λ˜λŠ” 문제
  • SOLID 원칙
dev-heyjin
dev-heyjin
  • dev-heyjin
    개발 기둝
    dev-heyjin
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (56)
      • 🎯 Programming (8)
      • πŸ’ͺ Algorithm (16)
      • βš™οΈ CS (31)
        • λ„€νŠΈμ›Œν¬ (15)
        • 운영체제 (15)
        • λ°μ΄ν„°λ² μ΄μŠ€ (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    ν•΄ν‚Ή
    λ°μ΄ν„°λ² μ΄μŠ€
    DB
    RDS
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
dev-heyjin
μΈν„°νŽ˜μ΄μŠ€(Interface) vs 좔상 클래슀(Abstract class)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”