ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상클래스, 인터페이스와 다형성
    백엔드/자바 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'을 자료형으로 하는 참조 변수가 생성된 인스턴스 객체 주소값을 저장하고 있다.

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

     

    '백엔드 > 자바' 카테고리의 다른 글

    오류와 예외(Error, exception)  (0) 2020.08.11
    익명 클래스(anonymous class)  (0) 2020.08.11
    인터페이스 (interface)  (0) 2020.08.07
    추상 클래스 (abstract class)  (0) 2020.08.06
    추상 메서드 (abstract method)  (0) 2020.08.06
Designed by Tistory.