ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속과 다형성(polymorphism)
    백엔드/자바 2020. 8. 5. 18:07

    다형성이란?

    다형성은 객체지향에서의 중요한 특서어 중 하나로 상속과 깊은 관계가 있다.

     

    '다형성이란 여러 형태를 가질 수 있는 능력'을 의미한다.

     

    자바는 한 가지 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 설계되었다.

     

    이러한 자바의 다형성을 이용하면 코드를 절약하고 효율적인 프로그래밍이 가능하다.

     

    상속과 다형성

    다형성은 상속과 아주 밀접한 관련을 갖는다.

     

    왜냐하면 다형성은 상속할 때 비로소 나타나기 때문이다.

     

    클래스 상속이 일어날 때 중요한 포인트는 하나는 '부모 클래스가 자식 클래스들을 대표'한다는 점이다.

     

    현실에서 미성년자 자녀를 여럿 두고 있는 집안의 법적인 대리인이 부모인 것과 같은 개념이다.

     

    자바상에서는 부모 클래스 타입의 참조 변수로 자식의 인스턴스를 참조할 수 있다는 말과 같은 뜻이다.

     

    코드를 보면 이해가 쉽다.

     

    public class main {
    	
    	public static void main(String[] args) {
    
    	test t1 = new test();  // test클래스 객체 t1 생성
    	
    	t1.test(new Mother());  // "다형성" 출력
    	t1.test(new Son());  // "다형성" 출력
    	t1.test(new grand_Son());  // "다형성" 출력
    	
    	}
    }
    
    class test{
    	void test(Mother a){
    		System.out.println("다형성");
    	}
    }
    
    class Mother{}  // 최상위 부모 클래스
    
    
    class Son extends Mother{}  // 부모 클래스의 상속을 받은 중간 자식 클래스
    
    
    class grand_Son extends Son{}  // 자식 클래스의 상속을 받은 손자 클래스  

     

    해당 코드에서 Son 클래스는 Mother의 상속을 받았고, grand_Son은 Son의 상속을 받았다.

     

    즉 가장 위로 올라가보면 Mother 클래스가 존재하고 3개의 클래스의 대표는 Mother인 셈이다.

     

    한편 test클래스의 test 메서드는 Mother를 참조자료형으로 하는 변수만 받을 수 있다고 써있다.

     

    하지만 메인 클래스를 보면 Mother 뿐만 아니라 이를 상속한 Son과 grand_Son을 넣어도 정상 작동을 한다.

     

    이게 다형성의 기본 개념이다.

     

    부모 클래스의 자료 타입을 넣어줘야 하는 상황에서 부모를 상속한 자식 클래스들도 넣을 수 있다는 것.

     

    결국 타입별로 함수를 따로 만들어줘야 하는 수고도 덜고 매우 편리하게 코드를 짤 수 있다.

     

    상속과 다형성 2

    위에서는 부모 클래스 밑으로 자식 클래스들이 쭉 밑으로 나열되었다.

     

    그럼 이번엔 부모 클래스를 두고 자식 클래스들이 동등한 수평 관계일 경우는 어떨까?

     

    package Build;
    
    public class main {
    	
    	public static void main(String[] args) {
    
    	t1.test(new Mother());  // "다형성" 출력
    	t1.test(new Son());  // "다형성" 출력
    	t1.test(new Son2());  // "다형성" 출력
    	t1.test(new Son3());  // "다형성" 출력
    	
    	}
    }
    
    class test{
    	void test(Mother a){
    		System.out.println("다형성");
    	}
    }
    
    class Mother{}  // 최상위 부모 클래스
    
    class Son extends Mother{}  // 부모의 상속을 받은 아들1 클래스
    
    class Son2 extends Mother{}  // 부모의 상속을 받은 아들2 클래스
    
    class Son3 extends Mother{}  // 부모의 상속을 받은 아들3 클래스

     

    위의 예시와 달리 이번엔 Mother 클래스를 중심으로 수평 상속 관계가 펼쳐져있다.

     

    그럼에도 불구하고 수직 상속 관계와 같은 결과를 보여준다.

     

    상속 관계에서 가장 대표하는 상속 클래스는 수평이든 수직이든 대표성이 사라지지 않는다.

     

     

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

    추상 클래스 (abstract class)  (0) 2020.08.06
    추상 메서드 (abstract method)  (0) 2020.08.06
    초기화  (0) 2020.08.05
    생성자(Constructor)  (0) 2020.08.05
    클래스 / 메소드 오버라이딩(method overriding)  (0) 2020.07.28
Designed by Tistory.