컴퓨터/Java

클래스 04: 인터페이스

수제녹차 2019. 9. 4. 14:02
728x90
반응형

- 디자인 원칙

구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.

-> 꼭 인터페이스가 아니더라도, 실제 실행시에 쓰이는 객체가 코드에 의해서 고정되지 않도록 어떤 상위 형식에 맞춰서 프로그래밍함으로써 다형성을 활용해야 한다. 

변수를 선언할 때는 보통 추상 클래스나 인터페이스 같은 상위형식으로 선언해야 한다.

 

- 인터페이스란

클래스와 외형은 비슷하나 객체 생성 불가, 메서드 호출 및 기능 수행 불가

클래스에서 구현해야 하는 작업 명세서

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();
		}
	}
}

 

반응형