본문 바로가기
TIL(Today I Learned)

2025.01.01 Today I Learned

by 승환파크 2025. 1. 1.

Java의 인터페이스와 추상 클래스

Java는 객체 지향 프로그래밍 언어로, 코드의 재사용성과 확장성을 높이기 위해 인터페이스와 추상 클래스라는 두 가지 추상화 매커니즘을 제공한다.

인터페이스

인터페이스는 클래스가 구현해야 하는 메서드의 계약(Contract)을 정의한다. Java8 이후로는 기본 메서드와 정적 메서드를 포함할 수 있으며, Java9 부터는 private 메서드도 사용할 수 있다. 그러나 인터페이스는 필드를 가질 수 없으며, 오직 상수만 정의가 가능하다.

특징

  • 모든 메서드는 기본적으로 public이며, abstract로 간주된다.
  • 다중 상속을 지원한다.
  • 필드(인스턴스 변수)를 가지지 않는다. 오직 public static fianl 상수만 선언할 수 있다.

사용 목적

  • 여러 클래스가 동일한 행동을 공유하지만, 공통적인 구현은 필요하지 않을 때 사용한다.
  • 클래스가 특정 행동을 반드시 구현하도록 강제할 때 유용하다.

예제

public interface Animal {
    void eat();
    void move();
}

public class Dog implements Animal {
    @Override
    public void eat() {
    	System.out.println("Dog is eating.");
    }
    
    @Override
    public void move() {
    	System.out.println("Dog is moving.");
    }
}

 

추상 클래스

추상 클래스는 공통된 속성과 행동을 여러 하위 클래스에 제공하기 위해 사용된다. 일부 메서드는 구현되어 있을 수 있고, 일부는 추상 메서드로 정의하여 하위 클래스에서 구현을 강제할 수 있다.

특징

  • 필드와 메서드를 가질 수 있다.
  • 단일 상속만 지원한다.
  • 추상 메서드와 일반 메서드 모두 정의할 수 있다.
  • 생성자를 가질 수 있다.

사용 목적

  • 여러 클래스 간의 공통된 동작과 속성을 공유하고 싶을 때 사용한다.
  • 클래스 계층 구조에서 기본 구현을 제공하면서 세부 사항은 하위 클래스에서 정의하도록 강제할 때 유용하다.

예제

public abstract class Vehicle {
    private int speed;
    
    public Vehicle(int speed) {
    	this.speed = speed;
    }
    
    public int getSpeed() {
    	return speed';
    }
    
    public abstract void move();
}

public class Car extends Vehicle {
    public Car(int speed) {
    	super(speed);
    }
    
    @Override
    public void move() {
    	System.out.println("Car is moving at speed: " + getSpeed());
    }
}

 

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

특징 인터페이스 추상 클래스
목적 행동(행위)에 대한 계약 정의 공통 속성과 행동 정의 및 기본 구현 제공
상속 개수 다중 상속 가능 단일 상속만 가능
구현 여부 모든 메서드는 구현 없이 선언만 가능(Java 8 이전) 일부 구현된 메서드와 추상 메서드 혼용 가능
필드 필드를 가질 수 없음(오직 static final 상수) 인스턴스 변수와 정적 필드 모두 가질 수 있음
접근 제어자 메서드는 기본적으로 public sbstract 다양한 접근 제어자를 사용할 수 있음
생성자 생성자를 가질 수 없음 생성자를 가질 수 있음

 

인터페이스와 추상 클래스를 사용해야하는 경우

인터페이스를 사용하는 경우

  • 여러 클래스가 동일한 동작을 구현해야 하지만, 공통 구현이 필요하지 않은 경우
  • 다중 상속이 필요한 경우
  • 예: 다양한 결제 수단을 제공하는 어플리케이션에서 Payment 인터페이스 정의 등

추상 클래스를 사용하는 경우

  • 여러 클래스가 공통된 속성과 기본 동작을 공유하며, 추가로 각  클래스에 맞는 세부 동작을 정의해야 할 경우
  • 클래스 계층 구조에서 공통된 코드 재사용성을 극대화하고 싶을 때
  • 예: 차량(차량 속도, 연료 타입 등)의 공통 속성을 가진 Vehicle 추상 클래스 정의 등

결론

인터페이스는 "행동에 대한 규약"을 정의하며, 다중상속과 같은 유연성이 있을 때 적합하다. 그에 반에 추상 클래스는 "공통 속성과 행동"을 공유하는데 중점을 두며, 기본 구현과 상태 관리를 제공할 때 유용하다.

'TIL(Today I Learned)' 카테고리의 다른 글

2025.01.06 Today I Learned  (1) 2025.01.06
2025.01.02 Today I Learned  (0) 2025.01.02
2024.12.24 Today I Learned  (0) 2024.12.23
2024.12.23 Today I Learned  (0) 2024.12.23
2024.12.19 Today I Learned  (2) 2024.12.19