프로그래밍 공부

객체지향 프로그래밍(추상 메서드, 인터페이스 정리) 본문

Programming/JAVA

객체지향 프로그래밍(추상 메서드, 인터페이스 정리)

khj1999 2024. 10. 8. 08:15

추상 클래스와 인터페이스는 둘 다 자바에서 객체지향 프로그래밍의 중요한 개념으로
클래스 간의 공통된 행동을 정의하고 재사용할 수 있게 해준다.

하지만 두 개념은 설계 목적과 사용 방식에서 차이가 있다. 언제 추상 클래스를 사용하고, 언제 인터페이스를
사용하는지에 대한 가이드는 다음과 같다.

1. 상속 관계와 목적

  • 추상 클래스:
    • is-a 관계를 나타낼 때 사용. 상속받는 클래스들이 공통된 속성과 행동을 가질 때 적합.
    • 클래스를 만들 때 일부는 구현하고 일부는 추상 메소드로 남겨서, 상속받는 클래스에서 구체적으로 구현하도록 하고 싶을 때 사용.
    • 일반적으로 기본적인 동작이나 상태(필드)를 여러 클래스에 걸쳐 공유하고자 할 때 사용.
    • 예를 들어, 모든 동물들이 기본적으로 가지고 있는 특성(예: eat() 메소드, age 필드)을 정의할 때
      추상 클래스를 사용.
  • 인터페이스:
    • 클래스가 어떤 기능을 수행할 수 있는지를 나타내는 can-do 관계를 정의할 때 사용.
      특정 클래스가 여러 기능을 구현할 수 있을 때 적합.
    • 특정 클래스가 여러 개의 동작을 가져야 하며, 다중 상속이 필요한 경우 인터페이스를 사용.
    • 예를 들어, Flyable 인터페이스는 어떤 객체가 날 수 있는지 나타내며, Swimmable 인터페이스는
      수영할 수 있는지를 나타냄.

2. 구현 여부

  • 추상 클래스:
    • 일부 구현된 메소드를 포함할 수 있으며
      하위 클래스에서 공통적으로 사용될 기본적인 동작을 정의할 수 있다.
    • 추상 클래스는 일부 필드와 메소드를 상속할 수 있다.
  • 인터페이스:
    • 자바 8 이전에는 메소드의 선언만 포함할 수 있었다(즉, 구현을 가질 수 없었음).
      자바 8 이후로는 디폴트 메소드(기본 구현을 가진 메소드)와 정적 메소드도 포함할 수 있음.
    • 일반적으로 상태(필드)를 가지지 않으며, 다중 상속의 목적으로 사용.

3. 다중 상속 가능성

  • 추상 클래스:
    • 단일 상속만 가능. 즉, 하나의 클래스는 하나의 추상 클래스만 상속받을 수 있음.
    • 복잡한 계층 구조에서 공통된 기능을 제공하고, 서브클래스에서 이를 확장하거나 변경할 수 있다.
  • 인터페이스:
    • 다중 상속이 가능. 하나의 클래스가 여러 인터페이스를 구현할 수 있음.
    • 클래스가 여러 다른 종류의 행동을 필요로 할 때
      인터페이스를 사용하여 각각의 행동을 개별적으로 정의할 수 있다.

4. 예시 비교

추상 클래스

abstract class Animal {
    int age;

    void eat() {
        System.out.println("This animal eats food.");
    }

    abstract void sound();
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Bark");
    }
}
  • Animal 클래스는 모든 동물이 공유하는 공통적인 상태(age)와 동작(eat())을 가지고 있으며, sound() 메소드는 각각의 동물에 따라 다르게 구현됨.

인터페이스

interface Flyable {
    void fly();
}

interface Swimmable {
    void swim();
}

class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("The duck is flying.");
    }

    @Override
    public void swim() {
        System.out.println("The duck is swimming.");
    }
}
  • FlyableSwimmable 인터페이스는 클래스가 특정 행동(날기, 수영하기)을 할 수 있음을 나타냅니다. Duck 클래스는 두 인터페이스를 모두 구현하여 다중 상속과 같은 효과를 얻습니다.

5. 요약

  • 추상 클래스:
    • 클래스의 기본적인 속성과 공통적인 기능을 정의하면서, 일부 메소드만을 하위 클래스에서 구현하도록
      강제하고자 할 때 사용.
    • 상속 계층 구조에서 기본적인 구현을 제공하고, 클래스 간의 강한 결합을 원할 때 적합.
    • 높은 단계의 구조를 제공하고 싶을때, 구현의 세세한 부분은 하위 클래스에게 맡기고 싶을 때
  • 인터페이스:
    • 클래스가 구현해야 할 메소드 집합을 정의하고, 다중 상속을 통해 다양한 기능을 클래스에 부여하고자
      할 때 사용.
    • 여러 가지 독립적인 기능을 구현하도록 설계할 때 적합.
    • 두 시스템(클래스, 함수)사이에 소통하기 위해 소통 방식을 정할 때
    • 폐쇄형(prevate) 형으로 선언 할 수 없음
    • 변수를 넣을 수 없음 → 상수만 가능
    • 클래스는 여러가지 인터페이스를 상속 받아 구현가능

즉, 인터페이스와 추상 클래스의 선택은 설계의 목적에 따라 달라지며, 다형성, 코드 재사용성, 유연성 등의
다양한 요소를 고려하여 결정됨.

Comments