새로운 하루가 시작되었다!
상속
- 다른 클래스가 가지고 있는 멤버(필드, 메서드)들을 새로 작성할 클래스에서 직접 만들지 않고
상속을 받음으로써 새 클래스가 자신의 멤버처럼 사용할 수 있는 기능- 부모의 유산을 자식이 상속받아서 자신의 것처럼 그대로 사용, 변형해서 사용하는 것으로 비유
- 상속의 목적:
클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약 정의- 상속의 장점:
1) 보다 적은 양의 코드로 새로운 클래스 작성 가능
2) 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이
3) 코드의 중복을 제거하여 프로그램의 생산성과 유지 보수에 기여[접근제한자] class 클래스명 extends 클래스명 {}
public class Academy extends Company {}
단일상속과 다중상속
- 1) 단일상속:
클래스간의 관계가 다중상속보다 명확하고 신뢰성 있는 코드 작성- 2) 다중상속:
C++에서 가능한 기능으로 여러 클래스로부터 상속을 받으며
복합적인 기능을 가진 클래스를 쉽게 작성 가능
서로 다른 클래스로부터 상속 받은 멤버 간의 이름이 같은 경우 문제 발생
자바에서는 클래스 사이의 다중 상속 미지원
super()와 super.
- super():
- 부모 객체의 생성자를 호출하는 메서드
- 기본적으로 후손 생성자에 부모 생성자 포함
- 후손 객체 생성 시에는 부모부터 생성이 되기 때문에 후손 클래스 생성자 안에는
부모 생성자를 호출하는 super()를 컴파일러가 자동으로 추가
(부모 생성자가 가장 먼저 실행되어야 하기에 명시적으로 작성 시에도 반드시 첫 줄에만 작성)- 매개변수 있는 부모 생성자 호출은 super(매개변수, 매개변수)를 넣으면 됨
public Child1() { super(); // super() 생성자 -> 컴파일러가 자동으로 생성(명시적으로도 생성 가능) System.out.println("Child1 기본 생성자"); }
- super.:
상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모 객체를 가리키는 참조변수
자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메서드 호출 시 사용return car + " / " + super.toString();
- super()와 super.은 코드의 재사용성을 대폭 증가시키는 기술
상속의 메모리 구조
- 상속을 받으면 Heap에 부모 객체를 먼저 생성함
- 자식 객체가 부모 객체를 참조하는 것이 아니라 아예 포함함
- 모든 클래스는 Object 클래스를 상속하기 때문에 마지막 빈칸에는 항상 Object 클래스가 있다고 생각