TIL_180422 Interface, Polymorphism

Interface

  • ‘implements’를 사용한 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제하는 규제
  • 규제를 지키지 않을 시 아예 컴파일조차 되지 않음
  • 협업을 위한 클래스의 명세서처럼 사용됨 (어떠한 멤버(변수, 메소드)들을 사용하는가)
  • 따라서, 인터페이스 내의 메소드들은 public 접근제어자를 사용
  • 상속은 하나의 클래스만 가능한 반면, 인터페이스는 하위클래스가 여러개의 인터페이스를 구현할 수 있음
  • 인터페이스도 상속 가능

[Interface VS Abstract]

  • 인스턴스는 클래스가 아닌 인스턴스라는 고유한 형태를 가지고 있으나, 추상클래스는 일반 클래스임
  • 인스턴스는 구체적 로직을 가지고 있을수 없으나, 추상클래스는 가지고 있을 수 있음
1
2
3
4
5
6
7
8
9
10
11
interface I{
// z메소드의 구체적 로직은 서술x
public void z();
}
class A implements I{
// 하위 클래스는, 인터페이스에 있는 메소드를 반드시 구현해야함
public void z(){
// 구체적 로직 서술
}
}

Polymorphism (다형성)

하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미 (eg.오버로딩)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A{
public String x(){return "x";}
}
class B extends A{
public String y(){return "y";}
}
public class PolymorphismDemo1 {
public static void main(String[] args) {
/* B를 인스턴스화한 인스턴스를 변수 obj에 넣음
obj는 A클래스 데이터타입
즉, obj라는 변수에 클래스 B를 담았지만,
obj 변수는 클래스 A의 행세를 하고 있음 */
A obj = new B();
obj.x();
// obj.y(); 오류 발생
}
}
  • 공통의 부모를 갖는 하위클래스끼리 같은 메소드를 갖는다면, 부모클래스의 데이터타입으로 지정하여 중복없이 코드구현 가능
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class CalculatorDemo {
    /* excute 메소드는 두 하위클래스의 공통 부모클래스를
    가진 데이터타입의 매개변수를 설정함으로써
    CalculatorDecoPlus, CalculatorDecoMinus
    두가지로 써야하는 중복을 피할 수 있었음 */
    public static void execute(Calculator cal){
    System.out.println("실행결과");
    cal.run();
    }
    public static void main(String[] args) {
    Calculator c1 = new CalculatorDecoPlus();
    c1.setOprands(10, 20);
    Calculator c2 = new CalculatorDecoMinus();
    c2.setOprands(10, 20);
    execute(c1);
    execute(c2);
    }
    }