자바 인터페이스

이승준·2024년 10월 3일

JAVA

목록 보기
2/4
post-thumbnail

1. 인터페이스의 역할

인터페이스는 자바 프로그래밍에서 핵심적인 역할을 수행합니다.

  • 객체의 동작을 정의하는 계약 역할
  • 다형성 구현의 핵심 도구
  • 서로 관계없는 클래스들에게 공통적인 동작 부여
  • 확장성과 유연성 제공

중요 포인트: 인터페이스는 "어떻게 구현할지"가 아니라 "무엇을 할지"를 정의합니다. 이는 인터페이스의 핵심 개념입니다.

2. 인터페이스와 구현 클래스 선언

인터페이스는 다음과 같이 선언합니다:

public interface Playable {
    void play();
    void stop();
}

구현 클래스는 implements 키워드를 사용하여 선언합니다:

public class MusicPlayer implements Playable {
    @Override
    public void play() {
        System.out.println("음악을 재생합니다.");
    }

    @Override
    public void stop() {
        System.out.println("음악을 정지합니다.");
    }
}

참고: 인터페이스의 모든 메서드는 기본적으로 public abstract입니다.

3. 상수 필드

인터페이스의 필드는 자동으로 public static final이 됩니다:

public interface AudioSettings {
    int MAX_VOLUME = 100; // public static final 생략 가능
    String DEVICE_NAME = "High-Quality Audio Device";
}

팁: 이렇게 선언된 상수는 AudioSettings.MAX_VOLUME과 같이 직접 접근할 수 있습니다.

4. 추상 메서드

인터페이스의 기본 메서드 형태입니다. 구현 클래스에서 반드시 오버라이드해야 합니다.

public interface Drawable {
    void draw(); // public abstract 생략 가능
    void resize(int width, int height);
}

주의사항: 추상 메서드는 메서드 바디({})를 가질 수 없습니다.

5. 디폴트 메서드

Java 8부터 인터페이스에 구현된 메서드를 넣을 수 있게 되었습니다:

public interface Shareable {
    default void share() {
        System.out.println("공유 기능을 실행합니다.");
    }
}

이 방식의 장점은 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있다는 점입니다.

6. 정적 메서드

Java 8부터 인터페이스에 static 메서드도 포함할 수 있습니다:

public interface MathOperations {
    static int add(int a, int b) {
        return a + b;
    }
}

사용 예: int result = MathOperations.add(10, 20);

7. private 메서드

Java 9부터는 private 메서드도 인터페이스에 추가할 수 있습니다:

public interface AdvancedPlayer {
    private void initializePlayer() {
        System.out.println("플레이어를 초기화합니다.");
    }
    
    default void play() {
        initializePlayer();
        System.out.println("재생을 시작합니다.");
    }
}

이 기능은 인터페이스 내부에서 코드 재사용성을 높이는 데 유용합니다.
default메서드,정적메서드의 중복된 내용을 줄일때 사용합니다!

8. 다중 인터페이스 구현

자바에서는 여러 인터페이스를 동시에 구현할 수 있습니다:

public class SmartDevice implements Playable, Shareable, Drawable {
    // 모든 인터페이스의 메서드 구현
}

핵심: 이는 자바에서 다중 상속의 효과를 낼 수 있는 방법 중 하나입니다.

9. 인터페이스 상속

인터페이스도 다른 인터페이스를 상속할 수 있습니다:

public interface AdvancedPlayable extends Playable, Shareable {
    void shuffle();
}

이 방식으로 기존 인터페이스를 확장하여 새로운 기능을 추가할 수 있습니다.

10. 타입 변환

인터페이스 타입으로 변수를 선언하고 구현 객체를 대입할 수 있습니다:

Playable player = new MusicPlayer();

이렇게 하면 Playable 인터페이스에 정의된 메서드만 사용할 수 있게 됩니다.

자동 타입변환

  • 인터페이스 변수 = 구현객체;

인터페이스의 타입 변환은 구현 클래스 간에 발생함. 인터페이스에 구현객체를 대입할때 자동으로 인터페이스 타입으로 변환됨.

  • 구현 클래스 변수 = (구현 클래스) 인터페이스 변수;

반대로 인터페이스 객체를 구현 클래스 타입으로 변환시킬 수 있는데, 이때는 강제 타입 변환이 필요함.

강제 타입 변환을 하는 이유는 구현 클래스가 인터페이스로 자동 형변환 되면 인터페이스에 선언된 메서드만 사용가능하기 때문에 자동 타입 변환 후에 클래스에 선언한 함수를 사용하려면 강제 타입 변환이 필요함.

부모 클래스가 인터페이스로 자동 타입변환 될 수 있다면 자식 클래스도 인터페이스로 자동 타입변환가능.

11. 다형성

인터페이스를 이용한 다형성 구현:

public void playMedia(Playable media) {
    media.play();
}

// 사용 예
playMedia(new MusicPlayer());
playMedia(new VideoPlayer());

이 방식을 사용하면 새로운 미디어 타입이 추가되어도 Playable 인터페이스만 구현하면 바로 사용할 수 있습니다.

12. 객체 타입 확인

instanceof 연산자를 사용하여 객체가 특정 인터페이스를 구현했는지 확인할 수 있습니다:

if (media instanceof Shareable) {
    Shareable shareableMedia = (Shareable) media;
    shareableMedia.share();
}

주의: 타입 캐스팅 전에 항상 타입을 확인하는 것이 안전합니다.

13. 봉인된 인터페이스

Java 15부터는 sealed 키워드로 인터페이스를 봉인할 수 있습니다:

public sealed interface Shape permits Circle, Rectangle, Triangle {
    // 인터페이스 내용
}

이 기능을 사용하면 인터페이스를 구현할 수 있는 클래스를 제한할 수 있어, 타입 안정성을 높이고 코드 예측성을 향상시킬 수 있습니다.


이상으로 자바 인터페이스의 주요 특징과 사용법에 대해 살펴보았습니다. 인터페이스는 자바 프로그래밍에서 매우 중요한 개념이며, 올바르게 사용하면 코드의 유연성과 재사용성을 크게 향상시킬 수 있습니다.

profile
들은것은 잊어버린다 본것은 기억된다 해본것은 내것이 된다

1개의 댓글

comment-user-thumbnail
2024년 12월 31일

유용합니다!

답글 달기