JAVA-Basic

6.Interface와 다형성의 구현과정

Jungsoomin :) 2020. 7. 10. 12:38

Interface 는 하나의 새로운 타입을 정의하는 것으로 Controller , Service Dao 등이 인터페이스로서 정의되고 구현되고 있는 것을 보면 인터페이스의 개념을 잡는 일은 굉장히 중요하다고 생각이 든다.

 

자바 버전이 올라가면서 Interface 에 추상클래스 default 메서드 static 메서드 등이 추가되면서 꼭 추상클래스를 사용할 상황이 아니라면 Interface 를 고려하는 것이 우선 순위이다.

 

5번 글의 상속과정에서 하나의 타입으로서 Pet을 지정하고 싶다. 라고 한다면, Interface를 사용하여 Pet이라는 타입과 공통 속성(Field), 동작(Method) 을 정의하기 아주 용이한 것 같다.

 

-기존 상속관계를 보면.

public abstract class KindaCat {
	abstract void cry();
}
public abstract class KindaDog {
	abstract void bark();
}

이 두 absractClass를 상속 받아 재정의(타입의 안정성을 보장받기 위해서) 했는데,

 

public interface SledDog {
	 void pull();
}
// 인터페이스는 하나의 타입 정의 이다. 타입 정의.
public interface Pet {
	//인터페이스의 필드는 public static final이다.
	public static final int i=3;
	
	// 추상메서드와 상수로 선언가능했었으나  default메서드 가능하게 됨
	void sit();
	
	//추상 클래스처럼 메서드를 정의함으로서 다형성 구현시 안전성을 보장받는다.
	
	//인터페이스 는 언제나 public 접근제한을 가진다.
	
	
	
//	후에 default 메서드와 static 메서드가 설정가능해졌다.
	default void method1() {
		//Pet 구현객체 공통으로 사용할 수 있는 메서드
	}
	public static void method2() {
		//Pet 클래스 자체의 메서드
	}

}

해당 2개의 Interface 로 SledDog , Pet 이라는 타입을 지정하여 해당 속성(Field)과 동작(Method)를 정의해줄 수 있게 된다.

 

구현과정과 다형성 구현을 보면

public class Cat extends KindaCat implements Pet{
	//구현객체임으로 반드시 인터페이스 메서드를 구현하여 안정성을 보장받아야한다.
	@Override
	public void sit() {
		System.out.println("고양이가 앉습니다.");
	}
	@Override
	void cry() {
		System.out.println("고양이가 웁니다.");
	}
}
public class Malamute extends KindaDog implements Pet, SledDog{
	//안정성 보장을 위한 구현객체의 메서드 재정의
	@Override
	public void pull() {
		System.out.println("썰매를 끕니다.");
	}
	
	
	//구현객체임으로 반드시 인터페이스 메서드를 구현하여 안정성을 보장받아야한다.
	@Override
		public void sit() {
			System.out.println("말라뮤트가 앉습니다.");
		}
	
@Override
void bark() {
	System.out.println("말라뮤트가 짖습니다.");	
}
}

implements 키워드를 통해 구현이 가능하며 다중 구현 또한 가능하다.

public class Main {

	public static void main(String[] args) {
		Cat c = new Cat();
		
		//인터페이스에 구현객체 대입가능. 
		Pet p1 =c;
		p1.sit();
//		p1.cry 컴파일에러, 인터페이스타입이다.
//		상속객체의 메서드를 보장받지 못하므로 할 수 없다.

		
		Pet p2= new Malamute();
		p2.sit();
		
//		추상메서드와 같다. 구현객체 값은 call by reference로 구현객체의 주소값이므로
//		구현객체의 메서드가 실행된다.
		
		System.out.println("다형성 ---------------------------");
		InterfaceP(c); // 고양이가 앉습니다.
		InterfaceP(p2);// 말라뮤타가 앉습니다.
	}
	public static  void InterfaceP(Pet pet) {
		pet.sit();
	}
}

Interface 인 Pet 타입으로 대입하여 하나의 메서드에 다른 결과 값을 받아내는 것을 볼 수 있다.