ํฌ์ŠคํŠธ

Inheritance

Inheritance

๐Ÿ”Ž Inheritance(์ƒ์†)

์ƒ์†์˜ ์žฅ์ 

โ’ˆ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

โ’‰ ํšจ์œจ์ ์ด๊ณ , ๊ฐœ๋ฐœ์‹œ๊ฐ„ ๋‹จ์ถ•.

โ’Š ์œ ์ง€๋ณด์ˆ˜ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ๊ฐ€๋Šฅ.


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

extends ๋’ค์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ถ€๋ชจํด๋ž˜์Šค๋Š” ์˜ฌ ์ˆ˜ ์—†๋‹ค.

์ฆ‰, java์—์„œ๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

1
์ž์‹ํด๋ž˜์Šค extends ๋ถ€๋ชจํด๋ž˜์Šค {}

์ถ”๊ฐ€์ ์œผ๋กœ ์กฐ์ƒ(๋ถ€๋ชจ)๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค๋Š” ์ž๋™์ ์œผ๋กœ Object ํด๋ž˜์Šค๋ฅผ

์ƒ์†๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ ์ƒ๋žตํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

์ฆ‰, ์ƒ์†๊ณ„์ธต์˜ ์ตœ์ƒ์œ„์—๋Š” Objectํด๋ž˜์Šค๊ฐ€ ์œ„์น˜ํ•œ๋‹ค๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ Object ํด๋ž˜์Šค์—๋Š” 11๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// class
public class People extends Object{

    // Field
    public String name;
    public String ssn;

    // Constructor
    public People(String name; String ssn;) {

        this.name = name;
        this.ssn = ssn;

    }
}

๋ถ€๋ชจ ์ƒ์„ฑ์ž๋Š” ์ž์‹ ์ƒ์„ฑ์ž์˜ ๋งจ ์œ—์ค„์— ํ˜ธ์ถœ๋œ๋‹ค.

๋”ฐ๋กœ ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์„ ์–ธ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
package practice.java;

public class Student extends People {

    // Field
    int age = age;

    // Constructor
    public Student(String name; String ssn; int age;) {
        super(name, ssn);  // ๋ถ€๋ชจ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
        this.age = age;
    }
}


๐Ÿ”Ž Composite(ํฌํ•จ)

ํฌํ•จ์ด๋ž€?

ํ•œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ž‘์€ ๋‹จ์œ„์˜ ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ๋งŒ๋“ค๊ณ , ์ด ๋“ค์„ ์กฐํ•ฉํ•ด์„œ ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€

ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ์–ด ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ 

์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•œ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ํฌํ•จ๊ณผ ์ƒ์† ์‚ฌ์ด์—์„œ

ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด is-a, has-a ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฌธ์žฅ์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ๋œ๋‹ค.

์ž๋™์ฐจ์™€ ๋ฐ”ํ€ด๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด

  • is-a : ์ž๋™์ฐจ๋Š” ๋ฐ”ํ€ด์ด๋‹ค.

  • has-a : ์ž๋™์ฐจ๋Š” ๋ฐ”ํ€ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์œ„ ๋‘ ๋ฌธ์žฅ์ค‘ ์•„๋ž˜์˜ ๋ฌธ์žฅ์ด ๋” ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ”ํ€ดํด๋ž˜์Šค๋Š” ์ž๋™์ฐจ ํด๋ž˜์Šค์— ํฌํ•จ ๋˜์–ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Tire ํด๋ž˜์Šค 
class Tire {
	String tire; 
}

// newCarํด๋ž˜์Šค ํฌํ•จ 
class newCar {
	Tire t = new Tire();
	String name;
	
}


public class inheritanceTest {

	public static void main(String[] args) {
		
		newCar myCar = new newCar();
		
		myCar.t.tire = "kumho";
		myCar.name = "Sonata";
		
		System.out.println(myCar.t.tire);
		System.out.println(myCar.name);

	}

}

/* 
[์ถœ๋ ฅ ๊ฒฐ๊ณผ]

kumho
Sonata
*/


๐Ÿ”Ž Method Override

Method overriding์ด๋ž€?

์ƒ์† ๋ฐ›์€ ์กฐ์ƒ(๋ถ€๋ชจ)์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ์—๊ฒŒ ๋งž๊ฒŒ ์žฌ์ •์˜ ํ•˜๋Š” ๊ฒƒ.


๊ทœ์น™

โ’ˆ ์„ ์–ธ๋ถ€๊ฐ€ ๊ฐ™์•„์•ผํ•œ๋‹ค. (์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ดํƒ€์ž…)

โ’‰ ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์ข์€ ๋ฒ”์œ„๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

  • ์กฐ์ƒ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ protected๋ผ๋ฉด, ๋ฒ”์œ„๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋„“์€ protected, public์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

โ’Š ์กฐ์ƒ(๋ถ€๋ชจ)ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋งŽ์€ ์ˆ˜์˜ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

โ’‹ @Override ๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ์ข‹๋‹ค(ํ•„์ˆ˜๋Š” ์•„๋‹Œ๋“ฏ)


ํ›„์†(์ž์‹)ํด๋ž˜์Šค์—์„œ ์กฐ์ƒ(๋ถ€๋ชจ)ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ–ˆ์ง€๋งŒ, ์žฌ์ •์˜ ํ•˜๊ธฐ ์ „์˜

๋ฉ”์†Œ๋“œ(๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ)๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•, ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

1
super.parentMethod();


์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด

์˜ค๋ฒ„๋กœ๋”ฉ : ๊ธฐ์กด์— ์—†๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ (new)

์˜ค๋ฒ„๋ผ์ด๋”ฉ : ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ (change, modify)



๐Ÿ”Ž super

์ฐธ์กฐ ๋ณ€์ˆ˜ super

์กฐ์ƒ์˜ ๋ฉค๋ฒ„์™€ ์ž์‹ ์˜ ๋ฉค๋ฒ„๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Test {
	public static void main(String args[]) {
		Child c = new Child();
		c.method();
	}
}

class Parent { 
    int x=10; // super.x
}

class Child extends Parent {
	int x=20; // this.x

	void method() {
		System.out.println("x=" + x);
		System.out.println("this.x=" + this.x);
		System.out.println("super.x="+ super.x);
	}
}

/*
[์ถœ๋ ฅ๊ฒฐ๊ณผ]

20
20
10
*/


super() ์ƒ์„ฑ์ž

์ž์†ํด๋ž˜์Šค์—์„œ ์กฐ์ƒํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

์กฐ์ƒ์˜ ์ƒ์„ฑ์ž ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๋•Œ super() ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
public class Person {

	String name;
	String gender;
	
	Person(String name, String gender) {
		this.name = name;
		this.gender = gender;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Student extends Person {
	
	int age;
	String school;
	
	Student(String name, String gender, int age, String school) {
		super(name, gender);
		this.age = age;
		this.school = school;
		
	}
	
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SuperTest {

	public static void main(String[] args) {
		Student gilbert = new Student("ํ™๊ธธ๋™", "๋‚จ์ž", 28, "ํ•œ๊ตญ๋Œ€ํ•™๊ต");
		
		System.out.println("์ด๋ฆ„: " + gilbert.name);
		System.out.println("์„ฑ๋ณ„: " + gilbert.gender);
		System.out.println("๋‚˜์ด: " + gilbert.age);
		System.out.println("ํ•™๊ต: " + gilbert.school);

	}

}

/*
[์ถœ๋ ฅ๊ฒฐ๊ณผ]

์ด๋ฆ„: ํ™๊ธธ๋™
์„ฑ๋ณ„: ๋‚จ์ž
๋‚˜์ด: 28
ํ•™๊ต: ํ•œ๊ตญ๋Œ€ํ•™๊ต
*/

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.