반응형
해당 강의를 보고 정리한 것입니다.
https://programmers.co.kr/learn/courses/5
인터페이스
: 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템
마치 목차처럼 어떤 기능들이 있는지 쭉 나열하는 것. (추상 클래스!!!)
- 인터페이스 정의
- 추상 메서드와 상수를 정의할 수 있다.
- 객체를 생성 불가능
public interface TV {
public int MIN_VOLUME= 0;
public int MAX_VOLUME= 100;
public void turnOn();
public void turnOff();
public void changeVolume(int volume);
public void changeChannel(int channel);
}
- 인터페이스에서 변수를 선언하면 컴파일 시 자동으로 아래와 같이 바뀐다.
public static final int MIN_VOLUME = 0;
public static final int MAX_VOLUME = 100;
- 인터페이스에서 정의된 메소드는 모두 추상 메서드이다. 컴파일 시 아래와 같이 바뀐다.
public abstract void turnOn();
public abstract void turnOff();
public abstract void changeVolume(int volume);
public abstract void changeChanner(int channel);
인터페이스 사용하기
- 인터페이스는 사용할떄 해당 인터페이스를 구현하는 클래스에서 implements키워드를 이용한다.
- 이클립스에선 인터페이스에 넣으면 자동으로 클래스가 짜여서 나온다.
public class LedTV implements TV {
@Override
public void turnOn() {
// TODO Auto-generated method stub
}
@Override
public void turnOff() {
// TODO Auto-generated method stub
}
@Override
public void changeVolume(int volume) {
// TODO Auto-generated method stub
}
@Override
public void changeChannel(int channel) {
// TODO Auto-generated method stub
}
}
- 클래스 작성
public class LedTV implements TV {
public void turnOn() {
System.out.println("켜기");
}
public void turnOff() {
System.out.println("끄기");
}
public void changeVolume(int volume) {
System.out.println(volume + "으로 볼륨변경");
}
public void changeChannel(int channel) {
System.out.println(channel + "으로 채널변경");
}
}
- 테스트
public class LedTVExam {
public static void main(String[] args) {
TV led = new LedTV();
led.turnOn();
led.changeChannel(53);
led.changeVolume(39);
led.turnOff();
}
}
>>
켜기
53으로 채널변경
39으로 볼륨변경
끄기
- 참조변수의 타입으로 인터페이스를 사용할 수 있음. 이 경우 인터페이스가 가지고 있는 메서드만 사용할 수 있다.
- 만약 TV인터페이스를 구현하는 LcdTV를 만들었다면 위의 코드에서 new LedTV부분만 new LcdTV로 변경해도 똑같이 프로그램이 동작할 것이다.
동일한 인터페이스를 구현한다는 것은 클래스의 사용법이 같다는 것을 의미함. - 클래스는 이러한 인터페이스를 여러 개 구현할 수 있다.
인터페이스의 default method
: JAVA 8에서 인터페이스에 대한 정의가 몇 가지 변경되었음.
- defalut 메서드
- static 메서드
defalut메서드
- 인터페이스가 defalut 키워드로 선언되면 메서드가 구현될 수 있다. 또한 이를 구현하는 클래스는 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) {
return i + j;
}
}
public class MyCalculator implements Calculator {
public int plus(int i, int j) {
return i + j;
}
public int multiple(int i, int j) {
return i * j;
}
}
public class MyCalExam {
public static void main(String[] args) {
Calculator cal = new MyCalculator();
System.out.println(cal.plus(3, 4));
System.out.println(cal.multiple(5, 2));
System.out.println(cal.exec(2, 5));
}
}
- 인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 발생.
이러한 문제를 해결하기 위해서 인터페이스에 기본 메서드를 구현해 놓을 수 있도록 하였다.
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) {
return i * j;
}
}
public class MyCalculator implements Calculator {
public int plus(int i, int j) {
return i + j;
}
public int multiple(int i, int j) {
return i * j;
}
}
public class MyCalExam {
public static void main(String[] args) {
Calculator cal = new MyCalculator();
System.out.println(cal.plus(3, 4));
System.out.println(cal.multiple(5, 2));
//default 메서드
System.out.println(cal.exec(2, 5));
//static 메서드
System.out.println(Calculator.exec2(3, 4));
}
}
- 인터페이스에 static 메서드를 선언함으로써, 인터페이스를 이용하여 간단한 기능을 가지는 유틸리티 성 인터페이스를 만들 수 있게 됨.
- static 메서드를 사용할때는 인터페이스명. 메서드명 형식으로 사용해야 함
cal.exec2(3,4) (x), Calculator.exec2(3,4) (o)
반응형
'Language > Java' 카테고리의 다른 글
자바 입문하기17 - Exception (0) | 2022.01.12 |
---|---|
자바 입문하기16 - 내부클래스 (0) | 2022.01.12 |
자바 입문하기14 - 클래스 형변환 (0) | 2022.01.11 |
자바 입문하기13 - 상속, 접근제한자, 추상클래스, super (0) | 2022.01.11 |
자바 입문하기12 - 오버로딩, 오버라이딩, this(), 패키지 (0) | 2022.01.11 |