● 상속(inheritance)
1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때 사용한다.
2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고 공통필드를 묶어서 자식 클래스에게 상속해준다.
● 상속 문법
- extends 키워드를 사용한다.
(ex)
class A{
A 필드
}
class B extends A{
A, B 필드
}
- A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스
- B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스
● super()
- 부모 생성자
- 자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다.
- 하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.
- 사실 자식 생성자는 항상 부모 생성자를 호출하기 때문에 자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다.
- 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.
- super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
● 다형성(polymorphism)
1. 오버로딩
2. 오버라이딩(재정의)
- 부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자할 때 재정의를 해야 한다.
- 이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.
- 부모 필드가 메모리에 먼저 할당되고 a 라는 메소드가 먼저 올라간다고 하면,
자식 필드가 메모리에 할당되면서 재정의한 a 메소드가 새롭게 만들어지는 것이 아닌
기존에 할당된 a 메소드 저장공간에 새롭게 재정의한 소스코드의 주소가 들어가게 된다.
- 따라서 자식 객체로 a 메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.
실습(상속(1))
class A{
String nameA = "A";
int data = 10;
public A() {
System.out.println("부모 생성자 호출");
}
}
class B extends A{
String nameB = "B";
public B() {
// ※ this : 접근한 객체의 주소값
// super() : 부모 필드의 주소값, A타입이므로 A클래스(부모 클래스)의 생성자이다.
// 자식보다 먼저 출력되야하므로 최상단에 적어준다.
super(); // 부모 생성자, 생략 시 컴파일러가 컴파일할 때 자동으로 작성한다.
System.out.println("자식 생성자 호출");
}
void printData() {
System.out.println(data);
}
}
public class InheritanceTest {
public static void main(String[] args) {
B b = new B();
b.printData();
System.out.println(b.nameA);
System.out.println(b.nameB);
}
}
![](https://blog.kakaocdn.net/dn/uCTpM/btruXT5mvF4/tka309ttXlGYpKpxwmo8Zk/img.png)
실습(상속(2))
//부모 클래스
class Human{
void eat() {
System.out.println("먹기");
}
void sleep() {
System.out.println("자기");
}
void walk() {
System.out.println("두 발로 걷기");
}
}
//자식 클래스
class Monkey extends Human{
void eatLouse() {
System.out.println("냠냠");
}
@Override
void walk() {
//덮어 쓰기 전에 부모의 기능을 가져와 사용한다.
//부모의 기능을 그대로 쓰면서 몇가지를 추가할 때 사용한다.
//하지만 부모의 기능을 완전 다 갈아 엎을 때는 쓰지 않는다.
super.walk();
System.out.println("네 발로 걷기");
}
}
public class InheritanceTest2 {
public static void main(String[] args) {
Monkey kingkong = new Monkey();
kingkong.walk();
}
}
![](https://blog.kakaocdn.net/dn/bbC7gR/btru1aywd7b/amekDzU6ks4setfYEhixnk/img.png)
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 20 (0) | 2022.03.06 |
---|---|
[Web_JAVA] 19 (0) | 2022.03.05 |
[Web_JAVA] 17 (0) | 2022.03.03 |
[Web_JAVA] 16 (0) | 2022.03.02 |
[Web_JAVA] 15 (0) | 2022.03.01 |