- 기존 클래스 재사용
- 부모 클래스의 필드와 메소드를 자식 클래스에 물려줄 수 있음
- 자식과 부모는 IS-A 관계여야함 (자식이 부모이다)
- is-a & has-a
구분 설명 예시 IS-A 관계 "A는 B이다" 관계 상속을 통해 표현 고양이는 동물이다 (Cat extends Animal) HAS-A 관계 "A는 B를 가지고 있다" 관계필드를 통해 표현 자동차는 엔진을 가진다 (Car has Engine) - 장점
- 클래스 재사용으로 중복 코드 줄임
- 수정을 최소화할 수 있음
public class 자식클래스 extends 부모클래스{}
자식클래스 변수 = new 자식클래스();
super.메소드() public final class Member {
}
// 다른 파일에서
public class VeryImportantPerson extends Member { // 컴파일 에러 상속 불가
}
public class Car {
//필드 선언
public int speed;
//final 메소드
public final void stop() {
speed = 0;
}
}
// 다른 파일에서
// 컴파일 에러, final 메서드는 오버라이딩을 할 수 없음
- 변수에 들어있는 주소를 다른 변수에 넣을 때 타입을 변환해서 할당
크기 기준 큰 작 기본형 변수의 크기 큰 크기의 변수 ( int,double등)(작은 크기의 변수 byte,short등)참조형 상속관계만! 개념의 크기 부모 클래스 자식클래스 자동 타입 변환 Up Casting
- 작 -> 큰 복사되는 경우
- 자동으로 형변환되어 저장
- 기본형은 크기 기준, 참조형은 상속 기준
- 참조형일 경우: 자식 타입 → 부모 타입으로 자동 형변환 가능
- 주의 : 부모 타입으로 변환되면 부모가 가진 멤버만 접근 가능 (자식만의 필드나 메서드 사용 불가능)
강제 타입 변환 Down Casting
- 큰 -> 작 복사되는 경우
- 강제로 형변환하여 저장
- 자식 타입이여야 다운 캐스팅 가능!
instanceof연산자를 활용해서 타입 체크하면 안전하게 다운 캐스팅 가능
- 하나의 타입(부모)으로 여러 타입(자식)을 처리할 수 있음
- 코드의 재사용성과 유지보수성을 높여줌
필드 다형성
- 필드 타입은 동일하지만, 대입되는 객체가 달라서 실행 결과가 다양
Animal a = new Dog(); // Dog도 되고 a = new Cat(); // Cat도 됨매개변수 다형성
- 메소드가 클래스 타입의 매개변수를 가진 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음
Parent p = new Parent(); : 부모타입 -> 부모객체
Parent 객체 1개가 Heap 영역에 생성됨Parent 타입의 변수 p가 Stack 영역에 만들어지고, 이 변수는 Heap의 Parent 객체를 가리킴Parent 클래스에 정의된 필드, 메서드만 사용 가능'Child c = new Child(); : 자식타입 -> 자식 객체
Child와 Parent 부분도 함께 생성Child는 Parent를 상속받았기 때문에, Parent 부분도 함께 만들어짐Child 타입의 변수 c가 이 전체 Child 객체를 가리킴Parent의 멤버 + Child에서 정의된 멤버 전부 가능Parent p = new Child(); new Child()시 자식과 부모 객체 모두 heap에 생성되지만, 변수 p는 부모 타입이라서 부모가 가진 것(parent 클래스)만 접근 가능함
new Child()니까 → 실제로는 Child 객체가 생성됨Parent의 멤버도 있고, Child의 멤버도 있음 (상속 구조니까)Parent 타입의 변수 p가 이 Child 객체를 가리킴