• 상속과 다형성(inheritance&polymorphism)

    2021. 6. 2.

    by. 와트

    객체 지향 프로그래밍의 중요한 특징 중 하나인 상속

    상속: 부모 클래스의 멤버 변수와 메소드를 자식 클래스에서 사용. extends 예약어 사용.

    즉, 부모 클래스에 일반 속성과 기능이 이미 구현되어 있고 자식 클래스에는 필요한 추가 속성과 기능을 구현하도록 하는 것.

    여기서 주의해야 할 것은 상위 클래스를 상속받은 하위 클래스가 생성될 때, 상위 클래스의 생성자가 반드시 먼저 호출된다는 것. 

    하위 클래스에서 상위 클래스로 접근하려면 super 예약어 사용. super를 사용하면 1) 상위 클래스의 생성자를 호출하거나, 2) 상위 클래스의 멤버 변수나 메서드를 참조할 수 있다.

     

    메소드 오버라이딩: 상위 클래스에 정의한 메소드가 하위 클래스에서 구현할 내용과 맞지 않을 경우에 하위 클래스에서 이 메소드를 재정의할 수 있음

    (ex. 백화점 멤버십에 따른 추가 혜택으로 인해 할인가가 달라지는 경우) @Override 애노테이션을 통해 '이 메소드는 재정의된 메소드'라고 컴파일러에 명확히 알려줌.

     

    묵시적 형 변환에서 주의해야 할 것은 상속에서 상하위 클래스에서 같은 이름의 메소드가 존재할 때 호출되는 메소드는 인스턴스에 따라 결정된다는 것. 재정의된 메소드는 서로 다른 메소드 주소를 갖고 있기 때문이다. 재정의되지 않은 경우는 메소드 주소가 같은 상위 클래스의 메소드 호출.

    다운 캐스팅: 상위 클래스로 형 변환되었던 하위 클래스를 다시 원래 자료형으로 형 변환하는 것. 다운 캐스팅 이전에 상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인해야 오류 방지 가능. 이를 위해 instanceof 사용.

     

    다형성: 하나의 코드가 여러 자료형으로 구현되어 실행되는 것. 코드는 변함이 없지만 어떤 매개변수가 넘어왔느냐에 따라 구현이 달라진다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class Shape {
        public void draw() {
            System.out.println("Shape");
        }
    }
     
    class Circle extends Shape{
        public void draw() {
            System.out.println("Circle");
        }
    }
     
    class Triangle extends Shape{
        public void draw() {
            System.out.println("Triangle");
        }
    }
     
    public class ShapeTest{
        public static void main(String[] args) {
            ArrayList<Shape> list = new ArrayList<Shape>();
            list.add(new Circle());
            list.add(new Triangle());
            list.add(new Shape());
     
            for(Shape s: list) {
                s.draw();
            }
        }}
    cs

    arrayList를 이용하면 배열의 자료형을 Shape로 지정할 경우, Circle, Triangle, Shape 모두 사용 가능.

    add 속성을 이용해 객체 배열에 하위 클래스를 넣으면 자연스레 Shape형으로 형 변환.

    배열 요소를 Shape형으로 꺼내서 draw를 호출하면 재정의된 함수가 호출된다.

    '혼자 있는 방 > Java' 카테고리의 다른 글

    인터페이스(interface)  (0) 2021.06.03
    추상 클래스(abstract class)  (0) 2021.06.02
    객체 배열  (1) 2021.05.30
    객체 간 협력  (0) 2021.05.30
    중간 복습(Review)  (0) 2021.05.06

    댓글

Designed by Nana