클래스 04: 인터페이스
- 디자인 원칙
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
-> 꼭 인터페이스가 아니더라도, 실제 실행시에 쓰이는 객체가 코드에 의해서 고정되지 않도록 어떤 상위 형식에 맞춰서 프로그래밍함으로써 다형성을 활용해야 한다.
변수를 선언할 때는 보통 추상 클래스나 인터페이스 같은 상위형식으로 선언해야 한다.
- 인터페이스란
클래스와 외형은 비슷하나 객체 생성 불가, 메서드 호출 및 기능 수행 불가
클래스에서 구현해야 하는 작업 명세서
cf) class로부터 new 키워드로 생성, 레퍼런스로 접근해서 사용했음
class에서 인터페이스를 구현- 인터페이스가 가지고 있는 기능, 상세한 내용
ex.
FlyBehavior라는 인터페이스를
FlyWithWings와 FlyNoWay라는 클래스로 각각 구현할 수 있다.
- 인터페이스를 사용하는 이유
가장 큰 이유는 객체가 다양한 자료형(타입)을 가질 수 있기 때문
package lec11Pjt001;
public class ImplementClass implements InterfaceA, InterfaceB, InterfaceC, InterfaceD {
public ImplementClass() {
System.out.println("ImplementClass constructor")
}
}
InterfaceA ia = new ImplementClass();
InterfaceB ib = new ImplementClass();
InterfaceB ic = new ImplementClass();
InterfaceD id = new ImplementClass();
각 객체는 ImplementClass 타입뿐만 아니라 InterfaceA, B, C, D 타입 또한 가질 수 있다.
- 인터페이스 구현
InterfaceA.java
package lec11Pjt001;
public interface InterfaceA {
// 어떤 메소드를 선언만 하고 정의하지는 않는다.
public void funA();
}
InterfaceB.java
package lec11Pjt001;
public interface InterfaceB {
// 어떤 메소드를 선언만 하고 정의하지는 않는다.
public void funB();
}
Interfaceclass.java
package lec11Pjt001;
// 자바는 다중상속을 지원하지는 않지만 InterfaceA를 구현할 수도, InterfaceB를 구현할 수도 있기 때문에
// 다형성을 가진다고 한다.
public class Interfaceclass implements InterfaceA, InterfaceB {
public Interfaceclass() {
System.out.println(" -- Interfaceclass -- ");
}
@Override
public void funA() {
System.out.println(" -- funA() --");
}
@Override
public void funB() {
System.out.println(" -- funB() --");
}
}
MainClass.java
package lec11Pjt001;
public class MainClass {
public static void main(String[] args) {
InterfaceA ia = new Interfaceclass();
InterfaceB ib = new Interfaceclass();
// 데이터 타입에 따라 사용할 수 있는 메서드가 다르다
ia.funA();
ib.funB();
}
}
- 래퍼 클래스 관용구와 함께 사용하면 기능을 향상시키는 안전하고 강력한 수단
- 디폴트 메서드
디폴트메서드란???
equals, hashCode 같은 Object의 메서드들은 디폴트 메서드로 제공해서는 안 된다.
- 주의
인스턴스 필드를 가질 수 없다.
public이 아닌 정적 멤버도 가질 수 없다(private 정적 메서드는 예외)
내가 만들지 않은 인터페이스에는 디폴트 메서드 추가 불가
- 인터페이스와 추상 클래스의 장점을 모두 취하고자 한다면?
템플릿 메서드 패턴
- 장난감 인터페이스
Toy.java
package lec11Pjt001;
public interface Toy {
public void walk();
public void run();
public void alarm();
public void light();
}
ToyRobot.Java
package lec11Pjt001;
public class ToyRobot implements Toy {
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("The robot can walk");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("The robot can run.");
}
@Override
public void alarm() {
// TODO Auto-generated method stub
System.out.println("The robot has no alarm function.");
}
@Override
public void light() {
// TODO Auto-generated method stub
System.out.println("The robot has light function.");
}
}
ToyAirplane.java
package lec11Pjt001;
public class ToyAirplane implements Toy {
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("The airplane can not walk.");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("The airplane can not run.");
}
@Override
public void alarm() {
// TODO Auto-generated method stub
System.out.println("The airplane has alarm function.");
}
@Override
public void light() {
// TODO Auto-generated method stub
System.out.println("The airplane has no light function.");
}
}
MainClass.java
package lec11Pjt001;
public class MainClass {
public static void main(String[] args) {
Toy robot = new ToyRobot();
Toy airplane = new ToyAirplane();
Toy toys[] = {robot, airplane};
for (int i=0;i<toys.length;i++) {
toys[i].walk();
toys[i].run();
toys[i].alarm();
toys[i].light();
System.out.println();
}
}
}