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 타입으로 대입하여 하나의 메서드에 다른 결과 값을 받아내는 것을 볼 수 있다.
'JAVA-Basic' 카테고리의 다른 글
7.람다(Lamda)를 이용한 익명 구현 객체(Anonymous implementation Object) 사용 (0) | 2020.07.10 |
---|---|
7.익명클래스(AnonymousClass) (0) | 2020.07.10 |
5.추상클래스와 상속관계의 Promotion & Casting (0) | 2020.07.10 |
4.상속(Inheritance)과 다형성의 구현과정 (0) | 2020.07.10 |
3.Overloading 과 접근제한(AccessModifier) (0) | 2020.07.10 |