본문 바로가기
프로젝트 개발 기록/[개발] java | spring

[Java] 상속 (Inheritance), 오버라이딩, super, super()

by HelloJudy 2022. 10. 9.

상속 (Inheritance)

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것. (코드의 재사용)

 

  • 자손은 조상의 모든 멤버를 상속받는다. (생성자, 초기화 블록 제외)
  • 자손의 멤버 개수는 조상보다 적을 수 없다. 
class Parent { 
	int age;
}
class Child extends Parent {}

: 이때 부모 멤버 1개를 모두 상속받았기 때문에 자식 또한 멤버 1개이다.

 

  • 자손의 변경은 조상에 영향을 미치지 않는다.

 

예시

class Point {
	int x;
	int y;
}

class Point3D extends Point {
	int z;
}

 

✔️ 포함 관계

클래스의 멤버로 참조변수를 선언하는 것

 

  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다.

 

예시 

class Point {
	int x;
	int y;
}

class Circle {
	Point c = new Point(); // 원점
	int r; // 반지름
}

 

 

상속관계: '~은 ~이다. (is-a)'
포함관계: '~은~을 가지고 있다. (has-a)'

 

✔️ 단일 상속 (Single Inheritance)

Java는 단일상속만을 허용한다.

 

✔️ Object 클래스

모든 클래스의 조상이다. 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.

 

  • 부모가 없는 경우 extends Object는 컴파일러가 자동 추가한다.
  • toString()

 


오버라이딩 (overriding)

상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

  • 선언부는 변경 불가능
  • 구현부만 변경 가능

 

오버라이딩 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

* 접근자 : public, private, default, protected

 

 

✔️ @Override 어노테이션 (Annotation)

재정의된 메서드라는 정보를 컴파일러에게 제공한다.

 

  • DiscountPolicy.java
public interface DiscountPolicy {

    /**
    * @return 할인 대상 금액
    */
    int discount(Member member, int price);
}

 

  • FixDiscountPolicy.java
public class FixDiscountPolicy implements DiscountPolicy {

    private int discountFixAmount = 1000; // 1000원 할인

    @Override
    public int discount(Member member, int price) {
        if (member.getGrade() == Grade.VIP) {
            return discountFixAmount;
        } else {
            return 0;
        }
    }
}

 

오버로딩 (overloading): 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩 (overriding): 상속받은 메서드의 내용을 변경하는 것 (change, modify)

 


super, super()

 

✔️ 참조변수 super

객체 자신을 가리키는 참조변수

 

  • 인스턴스 메서드(생성자) 내에만 존재
    • static 메서드 내에 사용 불가
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용

 

예시

class Parent { int x = 10; }
class Child extends Parent {
	int x = 20;
}

 

이때 부모로부터 상속받은 x는 super.x이고 원래 있는 x는 this.x이다.

 

class Parent { int x = 10; }
class Child extends Parent {}

 

이때는 super.x this.x는 같은 x를 가리킨다.

 

 

✔️ 조상의 생성자 super()

조상의 생성자를 호출할 때 사용

 

  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
  • 그렇지 않으면 컴파일러가 첫 줄에 super(); 삽입

 

기본 생성자 작성 필수!

 

 


📌 Reference

  • 남궁 선, 「자바의 정석」, 도우출판
반응형

댓글