Java를 배워보자/3. 객체 지향 프로그래밍 (OOP)

자바 OOP 추상 클래스와 인터페이스

_Blue_Sky_ 2024. 9. 26. 17:15
728x90
728x90

자바 OOP 추상 클래스와 인터페이스: 상세 설명 및 비교

소개

객체 지향 프로그래밍(OOP)에서 추상 클래스와 인터페이스는 코드의 재사용성과 유연성을 높이기 위해 사용되는 중요한 개념입니다. 이 두 가지는 비슷해 보이지만, 각각 다른 특징과 사용 목적을 가지고 있습니다. 이 글에서는 자바에서 추상 클래스와 인터페이스의 개념, 차이점, 그리고 어떤 상황에서 각각을 사용해야 하는지에 대해 자세히 알아보겠습니다.

추상 클래스 (Abstract Class)

추상 클래스는 일부 메소드를 추상 메소드로 선언하여 구체적인 구현을 하위 클래스에서 하도록 강제하는 클래스입니다. 추상 메소드는 메소드 선언만 있고, 실제 구현은 {} 안에 작성하지 않습니다. 추상 클래스는 다음과 같은 특징을 가지고 있습니다.

  • 추상 메소드: 추상 메소드는 반드시 하위 클래스에서 오버라이딩되어야 합니다.
  • 일반 메소드: 추상 클래스는 추상 메소드뿐만 아니라 일반 메소드도 가질 수 있습니다.
  • 객체 생성 불가: 추상 클래스는 추상적인 개념을 표현하기 때문에 직접 객체를 생성할 수 없습니다.
  • 상속: 하위 클래스는 추상 클래스를 상속받아 추상 메소드를 구현하고, 일반 메소드를 사용할 수 있습니다.

예시:

public abstract class Animal {
    public abstract void sound(); // 추상 메소드

    public void eat() {
        System.out.println("먹는다."); // 일반 메소드
    }
}

인터페이스 (Interface)

인터페이스는 클래스가 갖춰야 할 메소드의 집합을 정의한 것입니다. 인터페이스에 선언된 모든 메소드는 자동으로 public abstract가 됩니다. 인터페이스는 다음과 같은 특징을 가지고 있습니다.

  • 모든 메소드가 추상 메소드: 인터페이스에 선언된 모든 메소드는 반드시 하위 클래스에서 구현해야 합니다.
  • 상수: 인터페이스는 static final 상수를 선언할 수 있습니다.
  • 다중 상속: 클래스는 하나의 추상 클래스만 상속받을 수 있지만, 여러 개의 인터페이스를 구현할 수 있습니다.
  • 객체 생성 불가: 인터페이스는 추상적인 개념을 표현하기 때문에 직접 객체를 생성할 수 없습니다.

예시:

public interface Flyable {
    public void fly();
}
 
 

추상 클래스와 인터페이스의 차이점

특징추상 클래스인터페이스
메소드 추상 메소드와 일반 메소드 모두 가질 수 있음 모든 메소드가 추상 메소드
상속 단일 상속만 가능 다중 구현 가능
변수 인스턴스 변수 선언 가능 static final 상수만 선언 가능
목적 공통 기능 제공, 코드 재사용 계약 정의, 다형성 구현
 

언제 어떤 것을 사용해야 할까?

  • 추상 클래스:
    • 하위 클래스에 공통적인 기능을 제공하고 싶을 때
    • 부분적인 구현을 제공하고 싶을 때
    • is-a 관계를 표현하고 싶을 때
  • 인터페이스:
    • 다양한 클래스에서 동일한 행위를 보장하고 싶을 때
    • 클래스 간의 느슨한 결합을 원할 때
    • 다중 상속을 활용하고 싶을 때
    • 타입을 정의하고 싶을 때

결론

추상 클래스와 인터페이스는 각각의 장단점을 가지고 있으며, 어떤 것을 사용할지는 개발 상황에 따라 달라집니다. 일반적으로 추상 클래스는 코드 재사용을 위한 기반을 제공하고, 인터페이스는 다양한 클래스 간의 관계를 정의하는 데 사용됩니다. 개발자는 문제 해결에 가장 적합한 방법을 선택하여 효율적인 코드를 작성해야 합니다.

 

728x90
728x90

'Java를 배워보자 > 3. 객체 지향 프로그래밍 (OOP)' 카테고리의 다른 글

자바 OOP 패키지  (0) 2024.09.26
자바 OOP 다형성  (0) 2024.09.26
자바 OOP 상속  (0) 2024.09.26
자바 OOP 접근 제한자  (0) 2024.09.26
자바 OOP 생성자와 메소드  (0) 2024.09.26