● 상속(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);
}
}

실습(상속(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();
}
}

실습(상속(3))
1. 부모 클래스(Car) 작성하기
class Car{
// 변수
// 브랜드, 색상, 가격
String brand;
String color;
int price;
// 기본 생성자
public Car() {;}
// 초기화 생성자
public Car(String brand, String color, int price) {
super();
this.brand = brand;
this.color = color;
this.price = price;
}
// 메소드
// "열쇠로 시동 킴" 출력
void engineStart() {
System.out.println("열쇠로 시동 킴");
}
// "열쇠로 시동 끔" 출력
void engineStop() {
System.out.println("열쇠로 시동 끔");
}
}
2. 자식 클래스(SuperCar) 작성하기
class SuperCar extends Car{
// 변수
// 브랜드, 색상, 가격(Car 클래스와 일치하므로 따로 작성할 필요가 없다.)
// 모드
String mode;
// 기본 생성자
public SuperCar() {;}
// 초기화 생성자
public SuperCar(String brand, String color, int price, String mode) {
super(brand, color, price); // 부모 클래스(Car)에서 작성한 정보를 가져온다.
this.mode = mode;
}
// 메소드
// "열쇠로 시동 킴", "음성으로 시동 킴" 출력
@Override // 재정의
void engineStart() {
super.engineStart(); // 부모 클래스(Car)의 engineStart() 메소드도 실행한다.
System.out.println("음성으로 시동 킴");
}
// "음성으로 시동 끔" 출력
@Override
void engineStop() { // 부모 클래스(Car)의 engineStop() 메소드는 실행하지 않고 재정의만 한다.
System.out.println("음성으로 시동 끔");
}
// "지붕 열림" 출력
// 부모 클래스에는 없는 새로운 메소드
void openRoof() {
System.out.println("지붕 열림");
}
// "지봉 닫힘" 출력
// 부모 클래스에는 없는 새로운 메소드
void closeRoof() {
System.out.println("지붕 닫힘");
}
}
3. main 메소드에서 실행
public class Road {
public static void main(String[] args) {
Car matiz = new Car(); // 부모
SuperCar ferrari = new SuperCar("Ferrari", "RED", 35000, "sport"); // 자식
matiz.engineStart(); // 부모
ferrari.engineStart(); // 자식
ferrari.engineStop(); // 자식
ferrari.openRoof(); // 자식
ferrari.closeRoof(); // 자식
}
}

'ETC > 복습' 카테고리의 다른 글
[복습_JAVA] 25 (0) | 2022.09.14 |
---|---|
[복습_JAVA] 23 (0) | 2022.09.07 |
[복습_JAVA] 22 (0) | 2022.09.06 |
[복습_JAVA] 21 (0) | 2022.09.02 |
[복습_JAVA] 20 (0) | 2022.09.01 |