Skip to content

Day 14(21.09.23)

Byeong Gwan Seo edited this page Sep 25, 2021 · 3 revisions

21. ์ƒ์†(Inheritance)

(1) ์ƒ์†์ด๋ž€?

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์ƒ์†์ด๋ž€ ๊ฐœ๋…์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„(field, method)๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—๊ฒŒ ๋ฌผ๋ ค์ฃผ๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.
์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด, ์ž๋™์ฐจ ์‹œ์žฅ์—๋Š” ํฌ๋“œ, ํŽ˜๋ผ๋ฆฌ, ๋ฒค์ธ  ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”์ด์ปค๊ฐ€ ์žˆ๊ณ  ๋ฉ”์ด์ปค์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ์™ธํ˜•์€ ์ฒœ์ฐจ๋งŒ๋ณ„์ด๋‹ค. ํ•˜์ง€๋งŒ, ๊ฒฐ๊ตญ ์ž๋™์ฐจ๋ผ๋Š” ํฐ ์ง‘ํ•ฉ์— ์†Œ์†๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ž๋™์ฐจ๋ผ๋Š” ํฐ ๊ฐœ๋…์ด ๊ฐ€์ง€๋Š” ๊ณตํ†ต์ ์ธ ์†์„ฑ์€ ๋ชจ๋“  ์ž๋™์ฐจ ๋ฉ”์ด์ปค๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž๋™์ฐจ๋ผ๋Š” ๋”์šฑ ํฌ๊ด„์ ์ธ ๊ฐœ๋…์„ ๋ถ€๋ชจ ํด๋ž˜์Šค, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ž๋™์ฐจ ๋ฉ”์ด์ปค๋ฅผ ์ž์‹ ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ข‹๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์†์€ ์ž˜ ๊ฐœ๋ฐœ๋œ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์—ฌ์ฃผ๊ณ , ๋”์šฑ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

(2) ํด๋ž˜์Šค ์ƒ์†

ํ•˜์ง€๋งŒ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์ƒ์†์€ ํ˜„์‹ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿด ๋•Œ extends๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Porsche์˜ ๊ฒฝ์šฐ ์ž๋™์ฐจ ๋ฉ”์ด์ปค๋กœ ์œ ๋ช…ํ•˜์ง€๋งŒ ํ•œ๋•Œ ํƒฑํฌ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค๋„ ๋งŒ๋“ค์—ˆ๋˜ ๋ธŒ๋žœ๋“œ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ž๋™์ฐจ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค ํ• ๋•Œ๋Š” ์ž๋™์ฐจ ๊ณต์žฅ์„ ์„ธ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ด ๊ฒฝ์šฐ์—” Tank ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ Car ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

class Porsche extends Car {
   //Field
   //Constructor
   //Method
}

์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Porche๋Š” extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด Car ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ์ž๋™์ฐจ ๊ณต์žฅ์—์„œ ํƒฑํฌ๋‚˜ ๋น„ํ–‰๊ธฐ๋ฅผ ๋ฝ‘์•„๋‚ผ ์ˆ˜๋Š” ์—†๋“ฏ์ด(์‹ค์ œ๋กœ๋Š” ๊ฐ€๋Šฅํ• ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ณ๋„) ์ž๋ฐ” ์—์„œ๋Š” ๋‹ค์ค‘ ์ƒ์†์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค. ์ฆ‰, extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Car ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ–ˆ๋”ฐ๋ฉด Tank, Airplane๊ณผ ๊ฐ™์€ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ค‘๋ณต์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์•„๋ž˜๋Š” ํด๋ž˜์Šค ์ƒ์†์˜ ์˜ˆ์‹œ์ด๋‹ค.

//Porche.java
public class Porsche {
 public static void main(String[] args) {
   
   Vehicle normalCar = new Vehicle();
   SportsCar carrera = new SportsCar();

   normalCar.maxSpeed = 120;
   normalCar.name = "Just car";
   normalCar.info();

   carrera.maxSpeed = 300;
   carrera.name = "Carrera";
   carrera.cost = 12000;

   carrera.info();
 }
}
//Vehicle.java
public class Vehicle {
 int maxSpeed;
 String name;

 public void info() {
   System.out.println("์ด๋ฆ„: " + name);
   System.out.println("์ตœ๋Œ€ ์†๋„: " + maxSpeed);
  }
}
//SportsCar.java
public class SportsCar extends Vehicle{
	int cost;
}

Result

์ด๋ฆ„ : Just car
์ตœ๋Œ€ ์†๋„ : 120
์ด๋ฆ„ : Carrera
์ตœ๋Œ€ ์†๋„ : 300

์œ„ ์˜ˆ์‹œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด SportsCar ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Vehicle์˜ ๋ชจ๋“  ํ•„๋“œ์™€ ์ƒ์„ฑ์ž๋ฅผ ์ด์–ด๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— Porsche ํด๋ž˜์Šค์—์„œ name๊ณผ maxSpeed์˜ ํ•„๋“œ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , info() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊นŒ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ถ„๋ช… SportsCar ํด๋ž˜์Šค์—์„œ๋Š” cost๋ผ๋Š” ํ•„๋“œ๊ฐ’์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ info() ๋ฉ”์†Œ๋“œ์— ํ•ด๋‹น ๋‚ด์šฉ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜(Method Override)๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

(3) ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜(Method Override)

๋ฉ”์†Œ๋“œ ์žฌ์ •์˜๋ž€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž์‹ ํด๋ž˜์Šค์— ๋งž๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ์ง€ ์•Š์•„ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒฝ์šฐ, ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ '์žฌ์ •์˜(override)'ํ•จ์œผ๋กœ์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜๊ธฐ ์œ„ํ•ด์„  '@Override'๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ, ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

//SportsCar.java
public class SportsCar extends Vehicle{
	int cost;
	
	@Override //Vehicle ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ SportsCar์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ info() ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธ
	public void info() {
		System.out.println("๊ฐ€๊ฒฉ: " + cost);
	}
}

Result

์ด๋ฆ„: Just car
์ตœ๋Œ€ ์†๋„: 120
๊ฐ€๊ฒฉ: 12000

SportsCar ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜(์˜ค๋ฒ„๋ผ์ด๋”ฉ)ํ•œ info() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋˜ ๋‹ค์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. SportsCar์˜ ํ•„๋“œ๊ฐ’์ธ ์ด๋ฆ„๊ณผ ์ตœ๋Œ€ ์†๋„๊ฐ€ ๋ณด์ด์งˆ ์•Š๊ฒŒ ๋๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฉ”์†Œ๋“œ ์žฌ์ •์˜์˜ ํŠน์ง•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜๊ณ , ์ž์‹ ๊ฐ์ฒด(์—ฌ๊ธฐ์„  SportsCar)์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๋ชจ ๋ฉ”์†Œ๋“œ(์—ฌ๊ธฐ์„  Vehicle)๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  ์ž์‹ ํด๋ž˜์Šค์˜ info() ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ์—”, ํ•˜๋‚˜ํ•˜๋‚˜ ์ถœ๋ ฅ ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ์ž‘์„ฑํ• ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

(4) super

์œ„ ํ•ญ๋ชฉ์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ, ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ–ˆ๊ณ , ์ž์‹ ๊ฐ์ฒด์—์„œ ์žฌ์ •์˜ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ์—” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”๊ฐ€ ์—†์„๋• ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ฃผ๋Š” ์ •๋ณด(์ด๋ฆ„๊ณผ ์ตœ๋Œ€์†๋„)๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด super ํ‚ค์›Œ๋“œ์ด๋‹ค. super๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์™€ ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.(์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋ฉ”์†Œ๋“œ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค.) ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

//SportsCar.java
public class SportsCar extends Vehicle{
	int cost;
	
	@Override //Vehicle ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ SportsCar์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ info() ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธ
	public void info() {
                super.info(); //superํ‚ค์›Œ๋“œ๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ๋‹ท ์—ฐ์‚ฐ์ž(.)๋กœ info๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ
		System.out.println("๊ฐ€๊ฒฉ: " + cost);
	}
}

Result

์ด๋ฆ„: ๊ทธ๋ƒฅ ์ฐจ
์ตœ๋Œ€ ์†๋„: 120
์ด๋ฆ„: Carrera
์ตœ๋Œ€ ์†๋„: 300
๊ฐ€๊ฒฉ: 12000

super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ์— ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ info ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ ์˜๋„ํ–ˆ๋˜ ๋Œ€๋กœ ์ด๋ฆ„๊ณผ ์ตœ๋Œ€ ์†๋„, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ฒฉ์ด ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Clone this wiki locally