상속, 추상클래스, 인터페이스, 조합의 차이점에 대해 알려줘

KIM YONG GU·2023년 9월 23일
1

JAVA Knowledge

목록 보기
30/40

서술

상속, 추상 클래스, 인터페이스는 객체 지향 프로그래밍(OOP)에서 다형성, 재사용성, 구조화된 코드를 구현하기 위한 중요한 개념이며, 각각의 특징과 용도가 다릅니다. 이들의 주요 차이점을 살펴보겠습니다:

  1. 상속 (Inheritance):
  • 상속은 클래스 간의 관계를 나타냅니다.
  • 하위 클래스(자식 클래스)가 상위 클래스(부모 클래스)의 속성과 메서드를 물려받아 재사용할 수 있게 해줍니다.
  • 자식 클래스는 부모 클래스의 모든 멤버(필드와 메서드)를 사용할 수 있으며, 이를 확장하거나 변경할 수 있습니다.
  • Java에서는 extends 키워드를 사용하여 상속을 정의합니다.
  • 단일 상속만 지원되므로 하나의 클래스는 하나의 부모 클래스만 가질 수 있습니다.
  1. 추상 클래스 (Abstract Class):
  • 추상 클래스는 일부 메서드가 구현되지 않고 추상 메서드로 선언된 클래스입니다.
  • 객체를 직접 생성할 수 없으며, 추상 클래스를 상속받은 하위 클래스에서 추상 메서드를 구현해야 합니다.
  • 공통된 동작을 가진 클래스의 추상적인 틀을 제공하며, 하위 클래스에서 이를 구체화합니다.
  • Java에서는 abstract 키워드로 추상 클래스를 선언합니다.
  1. 인터페이스 (Interface):
  • 인터페이스는 클래스가 특정 메서드를 구현하도록 강제하는 역할을 합니다.
  • 클래스와 관련 없이 다른 클래스들에게 공통된 동작을 제공하며, 다중 상속과 유사한 역할을 수행합니다.
  • 인터페이스는 추상 메서드의 집합으로 이루어져 있으며, 클래스에서 인터페이스를 구현(implement)하면 해당 메서드를 반드시 구현해야 합니다.
  • Java에서는 implements 키워드로 인터페이스를 구현합니다.
  1. 조합 (Composition):
  • 조합은 "has-a" 관계를 나타냅니다. 한 객체가 다른 객체를 포함하고 그 객체의 기능을 이용합니다.
  • 클래스 간에 강한 결합도를 피하고자 할 때, 객체의 재사용과 유연성을 높이고자 할 때 사용됩니다. 종종 더 작고 독립적인 객체들을 조합하여 복잡한 동작을 구성합니다.

주요 차이점

  • 상속은 클래스 간의 계층 구조를 형성하며, 단일 상속만 지원됩니다. 추상 클래스와 인터페이스는 다중 상속을 지원합니다.
  • 추상 클래스는 일부 메서드가 구현되지 않은 클래스로, 객체를 생성할 수 없습니다. 인터페이스는 객체 생성이 불가능하며, 구현 클래스에서 메서드를 구현해야 합니다.
  • 상속은 "is-a" 관계를 나타내며, 하위 클래스가 상위 클래스의 일종인 경우 사용됩니다. 추상 클래스와 인터페이스는 "has-a" 관계에서 사용되며, 클래스가 특정 동작을 갖고 있는 경우 사용됩니다.
  • 추상 클래스는 일반 필드와 메서드를 가질 수 있지만, 인터페이스는 상수 필드와 추상 메서드만 가질 수 있습니다.
  • 조합은 "has-a" 관계를 통해 객체 간의 강한 결합도를 피하고, 작고 독립적인 객체를 조합하여 복잡한 동작을 만들 때 사용됩니다.

어떤 개념을 선택할지는 프로그램의 요구사항과 설계에 따라 다르며 각 방법은 상황과 요구사항에 따라 선택됩니다. 더 유연하고 모듈화된 코드를 작성하려면 조합과 인터페이스를 적극 활용하는 것이 좋습니다.

각 방법들의 장단점, 주로 사용되는 분야 및 예시

물론, 상속, 추상 클래스, 인터페이스, 그리고 조합의 장단점과 주로 사용되는 분야, 각각의 예시를 포함한 설명을 드리겠습니다:

1. 상속 (Inheritance):

장점:

  • 코드 재사용: 부모 클래스의 속성과 메서드를 하위 클래스에서 재사용할 수 있습니다.
  • 코드 구조의 일관성: 상속을 통해 부모 클래스와 하위 클래스 간의 유사성을 유지할 수 있습니다.

단점:

  • 긴밀한 결합: 부모 클래스와 하위 클래스 간의 강력한 결합으로 인해 변경이 어려울 수 있습니다.
  • 다중 상속의 제한: 다중 상속을 지원하지 않는 언어에서는 다중 상속이 불가능합니다.

주로 사용되는 분야:

  • is-a 관계가 성립하는 객체 간의 코드 공유가 필요한 경우, 기존 클래스를 확장하여 새로운 클래스를 만들 때.

예시:

  • 동물을 모델링할 때 Animal 클래스에서 Dog와 Cat 클래스를 상속하여 각각의 특성을 확장합니다.

2. 추상 클래스 (Abstract Class):

장점:

  • 메서드 강제 구현: 일부 메서드를 추상 메서드로 선언하여 하위 클래스에서 강제로 구현하도록 할 수 있습니다.
  • 공통 로직 구현: 추상 클래스 내에서 공통된 로직을 구현할 수 있습니다.

단점:

  • 다중 상속 제한: 다중 상속을 지원하지 않는 언어에서는 단일 상속만 가능합니다.

주로 사용되는 분야:

  • 클래스 간의 공통된 특성 및 동작을 정의하고, 하위 클래스에서 구체적인 구현을 제공해야 할 때.

예시:

  • 게임 개발에서 다양한 캐릭터 클래스가 Character 추상 클래스를 상속하고 공통 메서드를 구현합니다.

3. 인터페이스 (Interface):

장점:

  • 다중 상속 가능: 여러 인터페이스를 구현하여 다중 상속 형태로 클래스를 설계할 수 있습니다.
  • 느슨한 결합도: 클래스 간의 결합도를 낮추어 유연한 설계를 가능하게 합니다.

단점:

  • 메서드 구현 강제 불가: 인터페이스는 메서드 선언만 가능하므로 구현 클래스에서 미구현 메서드를 잊을 수 있습니다.

주로 사용되는 분야 :

  • 객체 간의 행동을 정의하고, 다른 클래스에서 이러한 행동을 구현해야 할 때, 다중 상속이 필요한 경우.

예시:

  • 자동차와 비행기가 각각 Vehicle 인터페이스를 구현하여 이동 메서드를 제공합니다.

4. 조합 (Composition):

장점:

  • 유연한 구조: 객체 간의 결합도가 낮아져 코드 수정 및 확장이 쉽습니다.
  • 코드 재사용: 작은 객체를 조합하여 큰 객체를 만들 수 있어 재사용성이 높습니다.

단점:

  • 더 복잡한 설계: 객체 간의 조합을 관리하려면 더 많은 코드를 작성해야 할 수 있습니다.

주로 사용되는 분야:

  • 객체 간의 느슨한 관계가 필요하며, 유연한 설계와 확장이 필요한 경우, 객체를 조합하여 복잡한 시스템을 구축할 때.

예시:

  • 자동차 엔진, 바퀴, 브레이크 등의 부품 객체를 조합하여 자동차 객체를 생성합니다.

각 설계 방법은 특정 상황에 더 적합하며, 프로젝트의 요구 사항과 객체 간의 관계를 고려하여 선택해야 합니다.

문법

Java에서 클래스와 인터페이스를 정의할 때 implements와 extends 키워드를 사용하는 방식에 따라 차이가 있습니다.

public class C implements A

  • 클래스 C는 인터페이스 A를 구현합니다. 이 경우, 클래스 C는 클래스 A의 메서드를 구현하고 해당 인터페이스의 규칙을 따라야 합니다.
  • 클래스와 인터페이스 간의 구현을 나타내며, 클래스가 여러 인터페이스를 구현할 수 있습니다.

public class C extends A

  • 클래스 C는 클래스 A를 상속합니다. 이 경우, 클래스 C는 클래스 A의 멤버(필드, 메서드)를 상속받아 사용할 수 있습니다.
  • 클래스 간의 상속을 나타내며, Java에서 단일 상속만 허용되므로 클래스 C는 클래스 A 이외의 클래스를 상속받을 수 없습니다.

public interface B extends A

  • 인터페이스 B는 인터페이스 A를 확장(확장 인터페이스)합니다. 이 경우, 인터페이스 B는 인터페이스 A의 메서드 정의를 포함하고 새로운 메서드를 추가로 정의할 수 있습니다.
  • 인터페이스 간의 확장을 나타내며, 여러 인터페이스를 함께 확장할 수 있습니다.

public interface B implements A

  • 이 문법은 올바르지 않습니다. 인터페이스는 implements 키워드를 사용하여 다른 인터페이스를 구현할 수 있으며, 클래스가 인터페이스를 구현하는 것과 관련이 있습니다. 인터페이스 자체가 다른 인터페이스를 구현하지 않습니다.

요약

implements는 클래스가 인터페이스를 구현할 때 사용되며, 인터페이스의 메서드를 구체화합니다.
extends는 클래스가 다른 클래스를 상속받을 때 사용되며, 상속된 클래스의 멤버를 사용합니다.
인터페이스 간의 상속 및 확장은 extends 키워드를 사용하며, 인터페이스 간에 다중 상속 및 확장이 가능합니다. public interface B implements A는 문법 오류입니다.

profile
Engineer, Look Beyond the Code.

0개의 댓글