인터페이스

dy7888·2023년 8월 22일
0

인터페이스

interface 인터페이스이름 {
	//상수
    타입 상수명 =;
    //추상메소드
    타입 메소드명();
}
interface RemoteControl {
	//상수
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;
    
    //추상메소드
    void turnOn();
    void turnOff();
}
  • 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
  • 메소드 오버라이딩 필수
    구현 클래스는 반드시 인터페이스의 모든 메소드를 오버라이딩해야한다.
  • 다중 상속 가능
  • 상수 필드는 public static final이 생략되어있음. 예) int MAX_VOLUME = 10;
  • 추상 메소드만 보유. 추상 메소드는 리턴타입, 메소드 이름, 매개변수만 기술되고 중괄호는 붙이지 않는다. public abstract가 생략되어있음.
  • 인터페이스에서는 어떤 메소드들이 있어야 하는지 선언만 하고, 실제 메소드의 구현은 구현 클래스에서 이루어진다.

✅ 개발 코드가 직접 객체의 메소드를 호출하면 간단한데 중간에 왜 인터페이스를 둘까?
코드를 수정하지 않고 사용하는 구현 객체를 손쉽고 빠르게 변경할 수 있기 때문이다.
코드 변경없이 구현 객체를 교체하면서 프로그램의 실행 결과와 리턴값이 다양해진다 -> 다형성

인터페이스 구현

인터페이스에 정의된 메소드들을 실제로 구현한다.

public class 구현클래스이름 implements 인터페이스 {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드
}
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 class Audio implements RemoteControl {
	private int volume;
    
    @Override
    public void turnOn{
    	System.out.println("Audio를 켭니다.");
    }
    
    @Override
    public void turnOff
    	System.out.println("Audio를 끕니다.");
    }
}

인터페이스 사용

public class MyClass {

	// 필드
	RemoteControl rc = new Television();
    
    // 생성자
    MyClass() {
    }
    
    MyClass(RemoteControl rc) {
    	this.rc = rc;
        rc.turnOn();
    }
    // 메소드
    void methodA() {
    	RemoteControl rc = new Audio();
        rc.turnOn();
    }
    
}
public class MyClassEx {
	public static void main(String[] args) {
    	MyClass myClass1 = new MyClass();
        myClass1.rc.turnOn(); // TV를 켭니다.
        
        MyClass myClass2 = new MyClass(new Audio()); // Audio를 켭니다.
        
        MyClass myClass3 = new MyClass();
        myClass3.methodA(); // Audio를 켭니다.
        
    }
}

클래스는 다중 상속이 안되는데, 인터페이스는 왜 가능할까?

클래스는 이미 구현된 메소드가 있을 수 있기 때문에 다중 상속이 불가능하지만,
인터페이스는 선언만 할 뿐 구현된 메소드가 없기 때문에 오버라이딩해서 쓰면 돼서 메소드를 얼마든 상속 받아도 아무런 문제가 발생하지 않는다.

profile
나의 기록하는 개발 일지

0개의 댓글