<인터페이스> : 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템
구현은 없고 어떤게 있다고 보여주는것 기능 구현하는 게 아니라 정의만
인터페이스는 자체적으로 타입의 역할은 가능하지만 객체 생성은 못함
동일한 인터페이스를 구현한다 = 클래스의 사용법이 동일!
클래스는 인터페이스를 구현해서 사용가능하고 인터페이스를 여러개 구현해서 사용도 가능
- 인터페이스 정의하는 방법
- 추상 메소드와 상수를 정의 할 수 있다.
public interface TV{
public int MAX_VOLUME = 100;
public int MIN_VOLUME = 0;
public void turnOn();
public void turnOff();
public void changeVolume(int volume);
public void changeChannel(int channel);
}
인터페이스에서 변수를 선언하면 컴파일시 자동으로 아래와 같이 바뀐다.
public static final int MAX_VOLUME = 100;
public static final int MIN_VOLUME = 0;
인터페이스에서 정의된 메소드는 모두 추상 메소드이다. 위에서 선언된 모든 메소드는 컴파일 시에 다음과 같이 자동으로 변경된다.
public abstract void on();
public abstract void off();
public abstract void volume(int value);
public abstract void channel(int number);
- 인터페이스 사용하는 방법
- 인터페이스는 사용할때 해당 인터페이스를 구현하는 클래스에서 implements 키워드를 이용한다.
public class LedTV implements TV{
public void on(){
System.out.println("켜다");
}
public void off(){
System.out.println("끄다");
}
public void volume(int value){
System.out.println(value + "로 볼륨조정하다.");
}
public void channel(int number){
System.out.println(number + "로 채널조정하다.");
}
}
- 인터페이스가 가지고 있는 메소드를 하나라도 구현하지 않는다면 해당 클래스는 추상클래스가 된다.
- (추상클래스는 인스턴스를 만들 수 없음)
public class LedTVExam{
public static void main(String args[]){
TV tv = new LedTV();
tv.on();
tv.volume(50);
tv.channel(6);
tv.off();
}
}
- 참조변수의 타입으로 인터페이스를 사용할 수 있다. 이 경우 인터페이스가 가지고 있는 메소드만 사용할 수 있다.
- 만약 TV인터페이스를 구현하는 LcdTV를 만들었다면 위의 코드에서 new LedTV부분만 new LcdTV로 변경해도 똑같이 프로그램이 동작할 것다. 동일한 인터페이스를 구현한다는 것은 클래스 사용법이 같다는 것을 의미한다.
- 클래스는 이러한 인터페이스를 여러개 구현할 수 있다.
JAVA 8이 등장하면서 interface에 대한 정의가 몇 가지 변경되었다.
default메소드
- 인터페이스가 default키워드로 선언되면 메소드가 구현될 수 있다. 또한 이를 구현하는 클래스는 default메소드를 오버라이딩 할 수 있다.
public interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
default int exec(int i, int j){ //default로 선언함으로 메소드를 구현할 수 있다.
return i + j;
}
}
//Calculator인터페이스를 구현한 MyCalculator클래스
public class MyCalculator implements Calculator {
@Override
public int plus(int i, int j) {
return i + j;
}
@Override
public int multiple(int i, int j) {
return i * j;
}
}
public class MyCalculatorExam {
public static void main(String[] args){
Calculator cal = new MyCalculator();
int value = cal.exec(5, 10);
System.out.println(value);
}
}
- 인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 있다. 이런 문제를 해결하기 위하여 인터페이스에 메소드를 구현해 놓을 수 있도록 하였다.
static메소드
public interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
default int exec(int i, int j){
return i + j;
}
public static int exec2(int i, int j){ //static 메소드
return i * j;
}
}
//인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다.
public class MyCalculatorExam {
public static void main(String[] args){
Calculator cal = new MyCalculator();
int value = cal.exec(5, 10);
System.out.println(value);
int value2 = Calculator.exec2(5, 10); //static메소드 호출
System.out.println(value2);
}
}
- 인터페이스에 static 메소드를 선언함으로써, 인터페이스를 이용하여 간단한 기능을 가지는 유틸리티성 인터페이스를 만들 수 있게 되었다.
- 인터페이스에서 정의한 static메소드는 반드시 인터페이스명.메소드 형식으로 호출해야한다.
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] 예외처리(Exception) / Throws (0) | 2022.08.13 |
---|---|
[JAVA] 내부클래스 (0) | 2022.08.12 |
[JAVA] 메소드 - 오버라이딩 (0) | 2022.08.10 |
[JAVA] 추상클래스 (0) | 2022.08.10 |
[JAVA] 접근 제어자 (0) | 2022.08.10 |