ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스 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

    댓글

Designed by Tistory.