백엔드/자바

추상클래스, 인터페이스와 다형성

ksge7 2020. 8. 7. 04:27

다형성이란?

일반 클래스의 상속 관계처럼 다형성이란 '다형성이란 여러 형태를 가질 수 있는 성질'을 말한다.

 

일반 클래스들의 상속 과정의 다형성의 포인트는 다음과 같았다.

 

"상속 관계에서 부모 클래스가 자식 클래스들을 대표 한다"

 

부모 클래스를 자료 타입으로 하는 참조 변수가 자손 클래스의 인스턴스를 가질 수 있다는 것이다.

 

추상 클래스, 인터페이스와 다형성

일반 클래스 상속과 다형성의 관계와 같이 추상클래스, 인터페이스도 그와 동일한 구조를 갖는다.

 

즉 추상클래스, 인터페이스를 상속한 자손 클래스의 인스턴스의 주소값을 추상클래스, 인터페이스를 자료형으로 하는 참조 변수가 참조할 수 있다는 것이다.

 

interface Human{  // 인터페이스 'Human' 선언

  String me();  // 반환값이 String인 추상 메서드 'me'선언.

}

////////////////////////////////////////////////////////////

class David implements Human{  //인터페이스 'Human'을 구현한 David 클래스

  public String me() {  // 추상 메서드 'me' 오버라이딩
    return "나는 데이빗입니다.";
  }

}

class Winson implements Human{  //인터페이스 'Human'을 구현한 Wilson 클래스

  public String me() {  // 추상 메서드 'me' 오버라이딩
    return "나는 윌슨입니다.";
  }

}

class Sarah implements Human{  //인터페이스 'Human'을 구현한 Sarah 클래스

  public String me() {  // 추상 메서드 'me' 오버라이딩
    return "나는 사라입니다.";
  }

}

/////////////////////////////////////////////////////////////

class Main {
  public static void main(String[] args) {

    Human David = new David();  
    // 부모격인 Human 인터페이스를 참조변수로 David 클래스 인스턴스를 저장
    System.out.println(David.me());

    Human Wilson = new Wilson();
    // 부모격인 Human 인터페이스를 참조변수로 Wilson 클래스 인스턴스를 저장
    System.out.println(Wilson.me());

    Human Sarah = new Sarah();
    // 부모격인 Human 인터페이스를 참조변수로 Sarah 클래스 인스턴스를 저장
    System.out.println(Sarah.me());

  }
}

 

코드를 보면서 이해하자.

 

- 'Human' 인터페이스를 선언하고 David, Wilson, Sarah 클래스가 이를 구현하고 있다.

- main 함수를 보면 'Human'을 자료형으로 하는 참조 변수가 생성된 인스턴스 객체 주소값을 저장하고 있다.

- 일반 클래스 간의 상속 관계처럼 이러한 방식을 이용해서 인터페이스를 다형성을 구현할 수 있다.

 

abstract class Human{  // abstract 추상 클래스 'Human' 선언

  abstract String me();  // abstract 추상 메서드 'me' 선언

}

//////////////////////////////////////////////////

class David extends Human{  // 추상 클래스 'Human'을 상속받은 'David' 일반 클래스

  public String me() {
    return "나는 데이빗입니다.";
  }

}

class Wilson extends Human{  // 추상 클래스 'Human'을 상속받은 'Wilson' 일반 클래스

  public String me() {
    return "나는 윌슨입니다.";
  }

}

class Sarah extends Human{  // 추상 클래스 'Human'을 상속받은 'Sarah' 일반 클래스

  public String me() {
    return "나는 사라입니다.";
  }

}

//////////////////////////////////////////////////////

class Main {
  public static void main(String[] args) {

    Human David = new David();
    // 'Human'을 자료형으로 갖는 참조 변수에 'David' 클래스 객체 생성 주소값을 저장
    System.out.println(David.me());

    Human Wilson = new Wilson();
    System.out.println(Wilson.me());

    Human Sarah = new Sarah();
    System.out.println(Sarah.me());

  }
}

 

이는 추상 클래스도 똑같다.

- 'Human' 추상 메서드를 선언하고 David, Wilson, Sarah 클래스가 이를 상속하고 있다.

- main 함수를 보면 'Human'을 자료형으로 하는 참조 변수가 생성된 인스턴스 객체 주소값을 저장하고 있다.

- 일반 클래스 간의 상속 관계처럼 이러한 방식을 이용해서 추상클래스로 다형성을 구현할 수 있다.