상속(inheritance)이란?
클래스A -> 클래스B
부모 -> 자식
슈퍼 -> 서브
기반 -> 파생
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때
2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고
공통 필드를 묶어서 자식 클래스들에게 상속해준다.
상속 문법
class A {
A 필드
class B extends A {
A, B 필드
}
super() : 부모 생성자
자식 클래스 타입의 객체로 부모필드에 접근할 수 있다.
하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.
사실 자식 생성자에는 항상 부모 생성자를 호출하기 때문에
자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다.
이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.
만약, super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
상속 예시🐒
package inheritance;
class A{
String name = "A";
int data = 10;
public A() {
System.out.println("부모");
}
void printName() {
System.out.println(name);
}
}
class B extends A {
public B() {
super();
name = "B";
System.out.println("자식");
}
void printData() {
System.out.println(name);
System.out.println(data);
}
}
public class InheritanceTest {
public static void main(String[] args) {
B b = new B();
b.printData();
b.printName();
}
}
![](https://velog.velcdn.com/images/dev-april/post/e936cae7-7d7c-4677-82b5-a7c4d4b7b988/image.png)
다형성(polymorphism)
1. 오버로딩
2. 오버라이딩(재정의)
부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자 할 때 재정의를 해야 한다.
이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.
부모 필드가 메모리에 먼저 할당되고 a라는 메소드가 먼저 올라간다고 하면,
자식 필드가 메모리에 할당되면서 재정의한 a메소드가 새롭게 만들어지는 것이 아니라
기존에 할당된 a메소드 저장공간에 새롭게 재정의한 자식 필드의 소스코드 주소가 들어가게 된다.
따라서 자식 객체로 a메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.
오버라이딩 예시
package inheritance;
class Human{
void eat() {
System.out.println("먹기");
}
void sleep() {
System.out.println("꿀잠자기");
}
void walk() {
System.out.println("직립보행");
}
}
class Monkey extends Human{
void rideTree() {
System.out.println("기깔나게 나무타기");
}
@Override
void walk() {
super.walk();
System.out.println("네 발로 걷기");
}
}
public class InheritanceTest2 {
public static void main(String[] args) {
Monkey monkey = new Monkey();
monkey.eat();
monkey.walk();
}
}
![](https://velog.velcdn.com/images/dev-april/post/1a24a7e0-e0a6-43bb-affc-b53d83adb2ed/image.png)