자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.
인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있다. 인터페이스를 통해 다형성을 구현할 수 있다.
인터페이스(interface)
-
개발 코드는 인터페이스를 통해서 객체와 서로 통신한다.
-
인터페이스의 메소드를 호출하면 객체의 메소드가 호출된다.
-
개발 코드를 수정하지 않으면서 객체 교환이 가능하다.
인터페이스 선언
-
~.java 형태 소스 파일로 작성되고, 컴파일러를 통해 ~.class 형태로 컴파일 된다.
-
클래스와 물리저거 파일 형태는 같으나 소스 작성 내용이 다르다.
[public] interface 인터페이스이름 { ... }
-
인터페이스는 객체로 생성할 수 없으므로 생성자를 가질 수 없다.
interface 인테페이스 이름 {
//상수
타입 상수이름 = 값;
//추상 메소드
타입 메소드이름(매개변수, ...);
}
상수 필드(constant field) 선언
-
데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언 할 수 없다.
-
상수 필드만 선언이 가능하다.
[public static final] 타입 상수이름 = 값;
-
상수 이름은 대문자로 작성하며, 서로 다른 단어로 구성되어 있을 경우 언더바(_) 를 이용한다.
public interface RemoteControl{
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
// 인터페이스 상수는 반드시 선언과 동시에 초기값을 지정해야 한다.
추상 메소드 선언
-
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행 된다.
-
인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.
예시1) 상수 필드 선언 & 추상 메소드 선언
public interface RemoteControl {
//상수
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
//추상 메소드 - 메소드 선언부만 작성한다.
public void turnOn();
public void turnOff();
public void setVolume(int volume);
}
인터페이스 구현
- 인터페이스의 구현 객체: 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드
- 구현 클래스: 구현 객체를 생성하는 클래스
구현(implement) 클래스
- 인터페이스에서 정의된 추상 메소드를 재정의해서 실행내용을 가지고 있는 클래스
- 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시한다.
- 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언한다.
pulbic class 구현클래스이름 implements 인터페이스이름{
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
인터페이스와 구현 클래스 사용 방법
인터페이스 변수를 선언하고 구현 객체를 대입 한다.
인터페이스 변수;
변수 = 구현 객체;
인터페이스 변수 = 구현객체;
예시2) 인터페이스 구현
추상 메소드 선언
public interface RemoteControl {
//상수
int MAX_VOLUME = 10; //public static final 생략 가능
int MIN_VOLUME = 0;
//메소드
void turnOn(); //public avstract 생략 가능
void turnOff();
void setVolume(int volume);
}
구현 클래스
public class Television implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("TV를 킨다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끈다.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
this.volume = RemoteControl.MIN_VOLUME;
} else { // 올바른 볼륨 값
this.volume = volume;
}
System.out.println("현재 TV 볼륨: " + this.volume);
}
}
구현 클래스
public class Audio implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("Audio를 킨다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끈다.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
this.volume = RemoteControl.MIN_VOLUME;
} else {// 올바른 볼륨 값
this.volume = volume;
}
System.out.println("현재 Audio 볼륨: " + this.volume);
}
}
인터페이스 변수에 구현 객체 대입
public class RemoteControlEx {
public static void main(String[] args) {
RemoteControl rc;
rc = new Audio();
rc.turnOn();
rc.setVolume(5);
rc.turnOff();
System.out.println("--------------");
rc = new Television();
rc.turnOn();
rc.setVolume(7);
rc.turnOff();
}
}
다중 인터페이스 구현 클래스
객체는 다수의 인터페이스 타입으로 사용 가능 하다.
public class 구현클래스이름 implements 인터페이스A, 인터페이스B{
//인터페이스 A에 선언된 추상 메소드의 실제 메소드 선언
//인터페이스 B에 선언된 추상 메소드의 실제 메소드 선언
}
예시3) 인터페이스 구현
인터페이스
public interface Searchable {
void search(String url);
}
구현 클래스
public interface RemoteControl {
//상수
int MAX_VOLUME = 10; //public static final 생략 가능
int MIN_VOLUME = 0;
//메소드
void turnOn(); //public avstract 생략 가능
void turnOff();
void setVolume(int volume);
}
다중 인터페이스 구현 클래스
public class SmartTelevision implements RemoteControl, Searchable {
private int volume;
// Searchable의 추상 메소드에 대한 실체 메소드
@Override
public void search(String url) {
System.out.println(url + "을 검색한다.");
}
// RemoteControl의 추상 메소드에 대한 실체 메소드
@Override
public void turnOn() {
System.out.println("TV를 킨다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끈다.");
}
@Override
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("현재 TV 볼륨: " + this.volume);
}
}
인터페이스 변수에 구현 객체 대입
public class SmartTelevisionEx {
public static void main(String[] args) {
SmartTelevision tv = new SmartTelevision();
RemoteControl rc = tv;
rc.turnOn();
rc.setVolume(5);
rc.turnOff();
Searchable seachable = tv;
seachable.search("http://www.naver.com");
}
}
예시4) 인터페이스 구현
추상 메소드 선언
public interface RemoteControl {
//상수
int MAX_VOLUME = 10; //public static final 생략 가능
int MIN_VOLUME = 0;
//메소드
void turnOn(); //public avstract 생략 가능
void turnOff();
void setVolume(int volume);
}
구현 클래스
public class Television implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("TV를 킨다.");
}
@Override
public void turnOff() {
System.out.println("TV를 끈다.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
this.volume = RemoteControl.MIN_VOLUME;
} else { // 올바른 볼륨 값
this.volume = volume;
}
System.out.println("현재 TV 볼륨: " + this.volume);
}
}
구현 클래스
public class Audio implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("Audio를 킨다.");
}
@Override
public void turnOff() {
System.out.println("Audio를 끈다.");
}
@Override
public void setVolume(int volume) {
if (volume > RemoteControl.MAX_VOLUME) {// 최대 볼륨시 MAX_VOLUME값으로 대체
this.volume = RemoteControl.MAX_VOLUME;
} else if (volume < RemoteControl.MIN_VOLUME) { // 최소 볼륨시 MIN_VOLUME값으로 대체
this.volume = RemoteControl.MIN_VOLUME;
} else {// 올바른 볼륨 값
this.volume = volume;
}
System.out.println("현재 Audio 볼륨: " + this.volume);
}
}
인터페이스 사용
public class MyClass {
//Field
RemoteControl rc = new Television();
//Constructor
MyClass(){
}
MyClass(RemoteControl rc){
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
//Method
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
void methodB(RemoteControl rc) {
rc.turnOn();
rc.setVolume(5);
}
}
인터페이스 사용
public class MyCalssEx {
public static void main(String[] args) {
System.out.println("1)-----------------");
MyClass myClass1 = new MyClass();
myClass1.rc.turnOn();
myClass1.rc.setVolume(5);
System.out.println("2)-----------------");
MyClass myClass2 = new MyClass(new Audio());
System.out.println("3)-----------------");
MyClass myClass3 = new MyClass();
myClass3.methodA();
System.out.println("4)-----------------");
MyClass myClass4 = new MyClass();
myClass4.methodB(new Television());
}
}
※용어 정리
-
인터페이스: 객체의 사용 방법을 정의한 타입이며, 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출 시킨다. 구성 멤버는 상수 필드와 추상메소드 이다.
-
상수 필드: 인터페이스의 상수 필드는 기본적으로 pulbic static final 특성을 갖는다. 관례적으로 필드 이름은 모두 대문자로 작성해야하며, 선언시 초기값을 대입해야 한다.
-
추상 메소드: 인터페이스에 선언된 메소드는 public abstract가 생략되고 메소드 선언부만 있는 추상 메소드 이다. 구현 클래스는 반드시 추상메소드를 재정의 해야한다.
-
implements: 구현 클래스는 어떤 인터페이스로 사용가능한지를 기술하기 위해 클래스 선언 시 implements키워드를 사용한다.
-
인터페이스 사용: 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.
-
인터페이스가 필드 타입으로 사용될 경우: 필드에 구현 객체를 대입할 수 있다.
-
인터페이스가 생성자의 매개 변수 타입으로 사용될 경우: new연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.
-
인터페이스가 로컬 변수 타입으로 사용될 경우: 변수에 구현 객체를 대입할 수 있다.
-
인터페이스가 메소드의 매개 변수 타입으로 사용될 경우: 메소드 호출 시 구현 객체를 매개 값으로 대입할 수 있다.
-
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 중첩 클래스와 중첩 인터페이스 (0) | 2020.11.23 |
---|---|
자바(Java) - 타입 변환과 다형성 (0) | 2020.11.17 |
자바(Java) - 추상 클래스 (0) | 2020.11.09 |
자바(Java) - 강제 타입 변환 (0) | 2020.11.05 |
자바(Java) - 필드의 다형성 (0) | 2020.11.05 |