자바의 상속

상속

기존 클래스로부터 새로운 내용을 덧붙이거나(확장), 내용의 일부를 바꾸어 사용(재정의, 오버라이딩)하는 것

장단점

  • 코드 재사용, 유지 보수성 향상, 확장의 용이함, 개발 시간 및 비용 감축 효과
  • 그러나 과도하게 결합될 수 있다는 단점 존재

조건과 특징

논리적으로 “자식 is a 부모” 관계가 성립할 때만 상속 가능

  • 자바에서는 중복된 변수명 사용을 막는 등 개발의 편의성과 가독성을 위해 문법적으로 단일상속만을 허용함(이를 극복하기 위해 ‘인터페이스’와 ‘has a’관계 활용 가능)
  • 별도로 extends 선언 없는 클래스는 모두 extends Object가 생략됨. 즉, 모든 클래스는 Object 클래스를 상속받고 있음.

상속과 생성자

  • 상속된 자식 클래스 객체가 생성될 때 부모 클래스의 생성자도 자동으로 호출되어 자동으로 객체 초기화가 이루어지도록 함.
  • super() 생성자 호출

    • 부모 클래스의 생성자를 명시적으로 호출
    • 부모 클래스 생성자가 Overloading되어 여러 개 존재하는 경우, 특정 생성자를 호출하기 위해 사용
    Java
    class Shape {
        int x = 0;
        int y = 0;
    
        Shape() {  // 부모 클래스 기본 생성자
            this(0, 0);
        }
    
        Shape(int x, int y) {  // 부모 클래스 생성자 Overloading
            this.x = x;
            this.y = y;
        }
    }
    
    class Circle extends Shape {
        int radius;
    
        Circle(int x, int y, int radius) {
            super(x, y);  // 부모 클래스의 생성자중 Overloading된 생성자를 명시적으로 호출
            this.radius = radius;  // 단, super()를 쓸 경우 무조건 자식 클래스 생성자의 첫번째 라인에 위치해야 함
        }
    }

상속과 멤버

변수 상속

  • 부모 클래스의 private 변수는 자식 클래스에 상속되지 않음
  • 부모 클래스가 가진 변수와 같은 타입, 같은 이름의 변수를 선언하면, 부모 클래스 변수는 상속되지 않음. 자식 클래스에서 정의한 변수가 사용됨.
  • this 예약어 : 객체 자신에 대한 참조 -> this.grade : 자신의 클래스에 존재하는 grade 변수
  • super 예약어 : 부모 객체에 접근하기 위한 참조 변수 -> super.grade : 부모 클래스에 존재하는 grade 변수

메서드 상속 - 메서드 Overriding

  • 메서드 재정의 ; 자식 클래스가 부모 클래스의 메서드를 그대로 사용하지 않고 새롭게 정의(재정의)하여 사용하는 것

    • <-> 메서드 Overloading은 하나의 클래스에서 동일한 이름의 메서드 여러 개를 정의하는 것
  • 자식 클래스의 재정의된 메서드는 부모 클래스 메서드와 메서드 이름, 매개변수의 유형, 개수, 순서가 동일해야 함
  • final 예약어를 사용할 경우 자식 클래스에서 부모 클래스 메서드 Overriding이 불가능함

클래스 상속과 인터페이스 상속

클래스 상속

extends 클래스명

  • 구현 상속
  • 단일 상속만 지원
  • Concrete 클래스(온전한 클래스)를 상속받을 경우 재정의는 선택사항
  • Abstract 클래스(추상 클래스)를 상속받을 경우 해당 부모 클래스가 추상 메서드를 포함하고 있다면 재정의는 필수

인터페이스 상속

implements 인터페이스명

  • 껍데기 상속
  • 다중 상속 지원
  • 재정의는 필수