언어/java

[Java] 8. 인터페이스 (1) - 1~3

젼젼39 2025. 5. 22. 12:56

8.1 인터페이스 역할

    * 인터페이스 : 두 장치(객체)를 연결하는 접속기.

    - 객체 A는 인터페이스를 통해 객체 B를 사용할 수 있음.
      : 객체 A가 인터페이스의 메소드를 호출 --> 인터페이스는 객체 B의 메소드를 호출 --> 그 결과를 받아 객체 A로 전달

    (+) 객체 B가 객체 C로 교체된 경우 --> 객체 A는 인터페이스의 메소드만 사용하므로 객체의 변경과는 무관함
        (객체 A가 인터페이스 없이 객체 B를 직접 사용했다면, 객체 A의 코드 중 객체 B에서 객체 C로 코드 변경이 필요했을 것임)

    -> 다형성 구현에 주된 기술로 사용됨

 

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

(1) 인터페이스 선언

    - class 키워드 대신 interface 키워드 사용

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

    - 멤버들 : public 상수 필드, public 추상 메소드, public 디폴트 메소드, public/private 정적 메소드, private 메소드

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

(2) 구현 클래스 선언

    - 객체 A가 인터페이스의 추상 메소드를 호출했을 때 인터페이스는 객체 B의 메소드를 실행함.
      --> 객체 B는 인터페이스에 선언된 추상 메소드와 동일한 선언부를 가진(재정의된) 메소드를 가지고 있어야 함 

    - 객체 B는 인터페이스를 구현한 객체라고 함: 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현되어 있기 때문

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

    * implements 키워드 : 해당 클래스가 인터페이스를 통해 사용할 수 있다는 표시
                                       (== 인터페이스의 추상 메소드를 재정의한 메소드가 있다는 의미)

public class Television implements RemoteControl {
    @Override
    public void turnOn() { //인터페이스에 선언된 turnOn() 추상 메소드 재정의
    	System.out.println("TV를 켭니다.");
    }
}

(3) 변수 선언과 구현 객체 대입

    - 인터페이스도 하나의 타입 --> 변수의 타입으로 사용 가능! (참조 타입의 하나; null 대입 가능)

RemoteControl rc = null;

    - 인터페이스를 통해 구현 객체 사용하려면, 인터페이스 변수에 구현 객체(의 번지)를 대입해야 함
    - 이 때, Television이 implements RemoteControl로 선언되어야 RemoteControl 타입의 변수 rc에 대입 가능

    - rc 변수에는 RemoteControl을 구현한 어떠한 객체든 대입이 가능함
    - 객체가 교체되면, 교체된 객체에서 재정의된 turnOn() 메소드가 실행됨

rc = new Television();
//RemoteControl rc = new Television(); 과 동일
rc.turnOn();

    - 인터페이스 변수 rc를 통해 turnOn() 메소드가 호출되면, 실제로 실행되는 것은 Television에서 재정의된 turnOn() 메소드임

 

8.3 상수 필드

    - 인터페이스는 public static final 특성을 갖는 불변의 상수 필드를 멤버로 가질 수 있음

[public static final] 타입 상수명 = 값;

    - 인터페이스에 선언된 필드는 모두 public static final 특성을 갖게 됨 (== 생략하더라도 자동적으로 컴파일 과정에서 붙음)

    - 상수명은 대문자로 작성하고, 서로 다른 단어는 _ 로 연결함

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

    - 상수는 구현 객체와 관련 없는, 인터페이스 소속 멤버
        == 객체 없이, 인터페이스로 바로 접근해 상수값 읽을 수 있음

public class RemoteControlExample {
    public static void main(String[] args) {
        System.out.println("최대볼륨: " + RemoteControl.MAX_VOLUME);
        System.out.println("최저볼륨: " + RemoteControl.MIN_VOLUME);
    }
}