-
클래스 04: 인터페이스컴퓨터/Java 2019. 9. 4. 14:02
- 디자인 원칙
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
-> 꼭 인터페이스가 아니더라도, 실제 실행시에 쓰이는 객체가 코드에 의해서 고정되지 않도록 어떤 상위 형식에 맞춰서 프로그래밍함으로써 다형성을 활용해야 한다.
변수를 선언할 때는 보통 추상 클래스나 인터페이스 같은 상위형식으로 선언해야 한다.
- 인터페이스란
클래스와 외형은 비슷하나 객체 생성 불가, 메서드 호출 및 기능 수행 불가
클래스에서 구현해야 하는 작업 명세서
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(); } } }
'컴퓨터 > Java' 카테고리의 다른 글
람다식 (0) 2019.09.04 클래스 05: 추상클래스 (0) 2019.09.04 클래스 03: 내부 클래스와 익명 클래스 (0) 2019.09.04 상속 (0) 2019.09.03 데이터 은닉 (0) 2019.09.03