인터페이스
객체의 사용 방법을 정의한 타입
인터페이스는 외형적으로 추상 클래스와 비슷
하지만 인터페이스를 생성할 때 class를 쓰지않고
interface 인터페이스이름{ }
이런 형식으로 씀
인터페이스를 상속받을 때에는 implements 키워드 사용
인터페이스에서는 상수 필드와 추상 메소드만을 멤버로 가짐
인터페이스는객체로 생성할 수 없기 때문에 생성자 X
추상 클래스와 인터페이스는
상속받는 클래스 혹은 구현하는 인터페이스 안에 있는
추상 메소드를 강제로 구현하게 함
추상 클래스와 인터페이스의 차이
추상클래스는 이 추상 클래스의 멤버들을 상속받아서
기능을 이용하고 확장시키는데 있는 반면
인테페이스는 함수선언만 있고 정의는 없다
이유는 그 함수의 구현을 강제하기 위해
구현을 강제함으로써 구현 객체의 같은 동작을 보장 가능
또 추상 클래스에서는 추상 메소드와 일반 메소드
일반변수도 가질 수 있고 접근제한자는 어떤 것도 가능
하지만 인터페이스에 모든 메소드는 추상 메소드
자바에서 다중 상속은 불가능 하지만
여러 인터페이스를 상속가능
요약하면
추상 클래스는 자식 클래스에서 추상 클래스의 기능을 이용하거나 확장하기 위해 사용되고
인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재
예제
하나의 리모콘(인터페이스)으로
TV, Audio(구현 객체들)을 사용하는법
리모콘
public interface RemoteControl{
public int MAX_VOLUME = 10;//static final을 생략하더라도 자동 상수
public int MIN_VOLUME = 0;//static final을 생략하더라도 자동 상수
public void turnOn();//abstract를 생략하더라도 자동 추상메소드
public void turnOff();//abstract를 생략하더라도 자동 추상메소드
public void setVolume(int volume);//abstract를 생략하더라도 자동 추상메소드;
}
TV
public class TV implements RemoteControl{
private int volume;
public void turnOn(){
System.out.println("TV Turn ON!");
}
public void turnOff(){
System.out.println("TV Turn OFF!");
}
public void setVolume(int volume){
if(volume>RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("TV volume:"+this.volume);
}
}
Audio
public class Audio implements RemoteControl{
private int volume;
public void turnOn(){
System.out.println("Audio Turn ON!");
}
public void turnOff(){
System.out.println("Audio Turn OFF!");
}
public void setVolume(int volume){
if(volume>RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("Audio volume:"+this.volume);
}
}
MyClass
public class MyClass{
RemoteControl rc = new TV();//기본적으로 TV
MyClass(){}//기본생성자
MyClass(RemoteControl rc){//생성자를 구현 객체로 호출 할 때
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
void methodA(){//메소드 사용시 Audio객체로 인터페이스 사용
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
void methodB(RemoteControl rc){//메소드 매개변수로 온 구현 객체 사용
rc.turnOn();
rc.setVolume(5);
}
}
Test
public class Test{
public static void main(String[] args){
System.out.println("1)-----------------------------");
MyClass myClass = new MyClass();//기본생성자 TV
myClass.rc.turnOn();
myClass.rc.setVolume(5);
System.out.println("2)-----------------------------");
MyClass myClass2 = new MyClass(new Audio());//구현객체로 Audio타입 선택
System.out.println("3)-----------------------------");
MyClass myClass3 = new MyClass();
myClass3.methodA();//메소드로 Audio선택
System.out.println("4)-----------------------------");
MyClass myClass4 = new MyClass();
myClass4.methodB(new TV());//methodB의 매개변수로 오는 클래스를 자동 타입변환해 TV사용
}
}
위의 예제는 TV와 Audio가 하나의 인터페이스로 구현
2개이상의 인터페이스를 사용하는 클래스도 가능
위의 RemoteControl과
검색기능을 하는 새로운 인터페이스 searchable을 동시에 가지는 클래스는
RemoteControl과 searchable에 있는 모든 메소드를 재정의 해야함
public interface Searchable{
void search(String url);
}
public class SmartTV implements Searchable, RemoteControl{
private int volume;
public void turnOn(){
System.out.println("SMART TV Turn ON!");
}
public void turnOff(){
System.out.println("SMART TV Turn OFF!");
}
public void setVolume(int volume){
if(volume>RemoteControl.MAX_VOLUME){
this.volume = RemoteControl.MAX_VOLUME;
}
else{
this.volume = volume;
}
System.out.println("SMART TV volume:"+this.volume);
}
public void search(String url){
System.out.println(url+"을 검색");
}
}
public class MyClass{
RemoteControl rc = new SmartTV();
Searchable sc = new SmartTV();
MyClass(){}//기본생성자
void methodC(SmartTV stv, String url){
rc.turnOn();
rc.setVolume(5);
sc.search(url);
}
}
public class Test{
public static void main(String[] args){
MyClass myClass5 = new MyClass();
myClass5.methodC(new SmartTV(),"네이버");
}
}
'프로그래밍 > Java' 카테고리의 다른 글
익명객체 (0) | 2019.12.06 |
---|---|
중첩 클래스와 중첩 인터페이스 (0) | 2019.12.05 |
추상 클래스 (0) | 2019.12.04 |
타입 변환과 다형성 (0) | 2019.12.04 |
상속 (0) | 2019.12.03 |