지식보부상님의 공부 일지

Java [08] 인터페이스 본문

KB IT's Your Life/Java

Java [08] 인터페이스

지식보부상님 2025. 4. 23. 13:37

[1] 인터페이스의 역할 

◈ 인터페이스 (Interface)

- 두 객체를 연결하는 역할로 다형성 구현을 위한 주요 기술


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

◈ 인터페이스 선언

interface 인터페이스명 { ... } // default 인터페이스 선언
public interface 인터페이스명 { ... } // public 인터페이스 선언

- 접근 제한자로 (default) public 사용 가능

 

◈ 구현 클래스 선언

public class 클래스명 implements 인터페이스명 { ... }

- implements 로 인터페이스 사용

 

◈ 변수 선언과 구현 객체 대입

- 인터페이스도 변수의 타입으로 사용 가능

- 구현 객체를 사용하려면 인터페이스 변수에 구현 객체 대입해야 

 

더보기

RemoteControl.java (인터페이스)

public interface RemoteControl {
    // public 추상 메서드
    public void turnOn();
}

 

Television.java (클래스)

public class Television implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("Tv를 켭니다.");
    }
}

 

 Radio.java (클래스)

public class Radio implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("라디오를 켭니다.");
    }
}

 

RemoteControlMain.java

public class RemoteControlMain {
    public static void main(String[] args) {
        RemoteControl rc = new Television();
        rc.turnOn(); // Tv를 켭니다. 출력

        rc = new Radio();
        rc.turnOn(); // 라디오를 켭니다. 출력
    }
}

[3] 상수 필드 

◈ 상수 필드

- 인터페이스에 불변의 상수 필드 선언 가능

- 기본적으로 public static final 특성 => 생략시 자동적으로 컴파일 과정에서 붙음

- 관례적으로 모두 대문자, 언더바(_) 로 연결하여 명명

 

더보기

RemoteControl.java (인터페이스)

public interface RemoteControl {
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;
}

 

RemoteControlMain.java

public class RemoteControlMain {
    public static void main(String[] args) {
        System.out.println(RemoteControl.MAX_VOLUME); // 10
        System.out.println(RemoteControl.MIN_VOLUME); // 0
    }
}

[4] 추상 메소드 

◈ 추상 메소드 (abstract method)

- public abstract 생략해도 컴파일 과정에서 자동으로 붙음

- 리턴 타입, 메소드명, 매개변수만 기술 ( 중괄호, 내용 작성 x )

 

더보기

RemoteControl.java (인터페이스)

package ch08.sec04;

public interface RemoteControl {
    // 상수 필드
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;

    // public 추상 메서드
    void turnOn();
    void turnOff();
    void setVolume(int volume);
}

 

Television.java (클래스)

package ch08.sec04;

public class Television implements RemoteControl {
    private int volume;

    @Override
    public void turnOn() {
        System.out.println("Tv를 켭니다.");
    }

    @Override
    public void turnOff() {
        System.out.println("Tv를 끕니다.");
    }

    public void setVolume(int volume) {
        if(volume < RemoteControl.MIN_VOLUME){
            this.volume = RemoteControl.MIN_VOLUME;
        } else if(volume > RemoteControl.MAX_VOLUME){
            this.volume = RemoteControl.MAX_VOLUME;
        } else {
            this.volume = volume;
        }
        System.out.println("현재 Tv 볼륨 : " + this.volume);
    }
}

 

Radio.java (클래스)

package ch08.sec04;

public class Radio implements RemoteControl {
    int volume;
    @Override
    public void turnOn() {
        System.out.println("라디오를 켭니다.");
    }

    public void turnOff() {
        System.out.println("라디오를 끕니다.");
    }

    public void setVolume(int volume) {
        if(volume > RemoteControl.MAX_VOLUME){
            this.volume = RemoteControl.MAX_VOLUME;
        }
        else if(volume < RemoteControl.MIN_VOLUME){
            this.volume = RemoteControl.MIN_VOLUME;
        }
        else {
            this.volume = volume;
        }
        System.out.println("현재 라디오 볼륨 : " + this.volume);
    }

}

 

RemoteControlMain.java (메인)

package ch08.sec04;

public class RemoteControlMain {
    public static void main(String[] args) {
        RemoteControl rc = new Television();
        rc.turnOn(); // Tv를 켭니다. 출력
        rc.turnOff(); // Tv를 끕니다. 출력
        rc.setVolume(3); // 현재 Tv 볼륨 : 3 출력
        rc.setVolume(14); // 현재 Tv 볼륨 : 10 출력

        rc = new Radio();
        rc.turnOn(); // 라디오를 켭니다. 출력
        rc.turnOff(); // 라디오를 끕니다. 출력
        rc.setVolume(5); // 현재 라디오 볼륨 : 5 출력
        rc.setVolume(-3); // 현재 라디오 볼륨 : 0 출력

    }
}

[5] 디폴트 메소드 

◈ 디폴트 메소드

- 완전한 실행 코드를 가진 메소드 => 실행부 (중괄호) 존재 

- 리턴 타입 앞에 default 키워드 추가

[public] default 리턴타입 메소드명(매개변수, ..) { ... }

- 구현 클래스에서 디폴트 메소드 재정의 가능

  - 반드시 public 이어야하고, default 생략해야 함


[6] 정적 메소드 

◈ 정적 메소드

- 구현 객체 없어도 인터페이스만으로 호출 가능

- public 생략해도 컴파일시 자동 추가

[public | private] static 리턴타입 메소드명(매개변수, ...) { ... }

 - 실행부에서 상수 필드 제외한 다른 메소드, 필드 등 호출 불가


[7] private 메소드 

◈ private 메소드

- private 메소드 : default 메소드 내에서만 호출 가능, 객체 내 중복 코드 줄이기 위해 사용

- private static 메소드 : static 메소드 내에서도 호출 가능


[8] 다중 인터페이스 

◈ 다중 인터페이스

- 여러개 인터페이스 implements 가능 

=> 쉼표로 구분하여 추가하면 됨

public class implements 인터페이스A, 인터페이스B { ... }

[9] 인터페이스 상속 

◈ 인터페이스 상속

- 인터페이스도 다른 인터페이스 상속 가능

- 다중 상속 허용

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }

- 자식 인터페이스 구현 클래스에서는 부모 인터페이스의 추상 메소드도 재정의 해야함


[10] 타입 변환 

◈ 자동 타입 변환 (promotion)

- 부모가 인터페이스 구현(implements) 중이면 자식 클래스도 인터페이스 타입으로 자동 타입 변환 가능

- B, C, D, E는 모두 인터페이스 A로 자동 타입 변환 가능

 

◈ 강제 타입 변환 (casting)

- 구현 객체가 인터페이스 타입으로 자동 변환시 인터페이스에 선언된 메소드만 사용 가능

=> 구현 객체의 메소드 사용하고 싶으면 강제 타입 변환 필요


'KB IT's Your Life > Java' 카테고리의 다른 글

Java [10] 라이브러리와 모듈  (0) 2025.04.24
Java [09] 중첩 선언과 익명 객체  (0) 2025.04.24
Java [07] 상속  (1) 2025.04.22
Java [06] 클래스  (1) 2025.04.22
Java [05] 참조 타입  (3) 2025.04.22