상속 (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)
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
- 선언부는 변경 불가능
- 구현부만 변경 가능
오버라이딩 조건
- 선언부가 조상 클래스의 메서드와 일치해야 한다.
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
* 접근자 : 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
- 남궁 선, 「자바의 정석」, 도우출판
반응형
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
[Java] 다형성(polymorphism), 추상 클래스, 인터페이스, 내부 클래스 (0) | 2022.10.12 |
---|---|
[Java] package와 import, 제어자 (1) | 2022.10.11 |
[Java] 클래스와 객체, 변수와 메서드, 오버로딩, 생성자 (0) | 2022.09.17 |
[Java] 비트연산자(bitwise operator) "& | ^ ~ << >>" (0) | 2022.07.19 |
댓글