Back-End/Java

์ž๋ฐ”์˜ ์ •์„ 7์žฅ: ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…

์ฑ”๐Ÿป 2024. 1. 23. 18:21
7๏ธโƒฃ

[ ์ถœ์ฒ˜ ]
์ž๋ฐ”์˜ ์ •์„:
https://product.kyobobook.co.kr/detail/S000001550352
์ž๋ฐ”์˜ ์ •์„ ์œ ํŠœ๋ธŒ:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp

1. ์ƒ์†

<์ •์˜>

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

<ํŠน์ง•>

  • ์ฝ”๋“œ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ์ด ๋งค์šฐ ์šฉ์ดํ•˜๋‹ค

    โ†’ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ํฌ๊ฒŒ ๊ธฐ์—ฌํ•œ๋‹ค.

์ž๋ฐ”์—์„œ ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„ ๋’ค์— ์ƒ์†๋ฐ›๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํ‚ค์›Œ๋“œ โ€˜extendsโ€™์™€ ํ•จ๊ป˜ ์จ ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

class Parent() { }
class Child extends Parent {
	// ...
}

<์ƒ์†๊ณ„์ธต๋„>

์ด ๋‘ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋‹ค๊ณ  ํ•˜๋ฉฐ, ์ƒ์†ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ โ€˜์กฐ์ƒ ํด๋ž˜์Šค'๋ผ ํ•˜๊ณ  ์ƒ์† ๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ โ€˜์ž์† ํด๋ž˜์Šคโ€™๋ผ ํ•œ๋‹ค.

๐Ÿ’ก
์ž์† ํด๋ž˜์Šค๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
(๋‹จ, ์ƒ์„ฑ์ž์™€ ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ์€ ์ƒ์†๋˜์ง€ ์•Š๋Š”๋‹ค.)
์ž์† ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๊ฐœ์ˆ˜๋Š” ์กฐ์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ํ•ญ์ƒ ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ๋‹ค.

3. ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„ - ํฌํ•จ๊ด€๊ณ„

์ƒ์†์ด์™ธ์—๋„ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ํด๋ž˜์Šค ๊ฐ„์— โ€˜ํฌํ•จ(Composite)โ€™ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ํด๋ž˜์Šค ๊ฐ„์˜ ํฌํ•จ๊ด€๊ณ„๋ฅผ ๋งบ์–ด๋Š” ๊ฒƒ์€ ํ•œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์›(Circle)์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ Circleํด๋ž˜์Šค์™€ ์ขŒํ‘œ์ƒ์˜ ํ•œ ์ ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ Poinํด๋ž˜์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

class Circle {
	int x; // ์›์ ์˜ x์ขŒํ‘œ
	int y; // ์›์ ์˜ y์ขŒํ‘œ
	int r; // ๋ฐ˜์ง€๋ฆ„(radius)
}

class Point {
	int x;
	int y;
}

Point ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์„œ Circle ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

class Circle {
	int x; // ์›์ ์˜ x์ขŒํ‘œ
	int y; // ์›์ ์˜ y์ขŒํ‘œ
	int r; // ๋ฐ˜์ง€๋ฆ„(radius)
}
class class Circle {
	Point p = new Point(); // ์›์ 
	int r; // ๋ฐ˜์ง€๋ฆ„(radius)
}

์ด์™€ ๊ฐ™์ด ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‹จ์œ„๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ, ์ด ๋‹จ์œ„ ํด๋ž˜์Šค๋“ค์„ ํฌํ•จ๊ด€๊ณ„๋กœ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์†์‰ฝ๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„ ๊ฒฐ์ •ํ•˜๊ธฐ

๐Ÿ’ก
์ƒ์†๊ด€๊ณ„ โ€˜~์€ ์ด๋‹ค.โ€™(is-a)

ํฌํ•จ๊ด€๊ณ„ โ€˜~์€ ~์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. โ€™(has-a)

<์˜ˆ์‹œ> - Circle, Point

์›์€ ์ ์ด๋‹ค. - Circle is a Point. (X)

์›์€ ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. - Circle has a Point. (O)

โ†’ ํฌํ•จ๊ด€๊ณ„

<์˜ˆ์‹œ2> - SportsCar, Car

์Šคํฌ์ธ ์นด๋Š” ์ฐจ์ด๋‹ค. - SportsCar is a Car. (O)

์Šคํฌ์ธ ์นด๋Š” ์ฐจ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. - SportsCar has a Car (X)

โ†’ ์ƒ์†๊ด€๊ณ„

5. ๋‹จ์ผ ์ƒ์†(single inheritance)

์žฅ์ ๋‹จ์ 
์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณตํ•ฉ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค- ํด๋ž˜์Šค๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง„๋‹ค
- ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ๋ฉค๋ฒ„๊ฐ„์˜ ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

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

6. Objectํด๋ž˜์Šค - ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ

Object ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ํด๋ž˜์Šค ์ƒ์†๊ณ„์ธต๋„์˜ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ์กฐ์ƒํด๋ž˜์Šค์ด๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์† ๋ฐ›์ง€ ์•Š๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์€ ์ž๋™์ ์œผ๋กœ Obejct ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๊ฒŒ ํ•จ์œผ๋กœ์จ ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•œ๋‹ค.

class Tv {
	...
}

โ†’

class Tv extends Object{
	...
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž๋™์ ์œผ๋กœ โ€˜extends Objectโ€™๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Tv ํด๋ž˜์Šค๊ฐ€ Object ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋„๋กํ•œ๋‹ค.

class Tv {
	...
}

class SmartTv extends Tv {
	...
}

๋งŒ์ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์ƒ์†๊ณ„์ธต๋„๋ฅผ ๋”ฐ๋ผ ์กฐ์ƒํด๋ž˜์Šค, ์กฐ์ƒํด๋ž˜์Šค์˜ ์กฐ์ƒํด๋ž˜์Šค๋ฅผ ์ฐพ์•„ ์˜ฌ๋ผ๊ฐ€๋‹ค๋ณด๋ฉด ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰ ์ตœ์ƒ์œ„ ์กฐ์ƒ์€ Obejct ํด๋ž˜์Šค์ผ ๊ฒƒ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ ๋ชจ๋“  ์ƒ์†๊ณ„์ธต๋„์˜ ์ตœ์ƒ์œ„์—๋Š” Object ํด๋ž˜์Šค๊ฐ€ ์œ„์น˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ”์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์€ Object ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค์„ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— Object ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋™์•ˆ toString() ์ด๋‚˜ equals(Object o)์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” ์ด ๋ฉ”์„œ๋“œ๋“ค์ด Object ํด๋ž˜์Šค์— ์ •์˜๋œ ๊ฒƒ๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

7. ์˜ค๋ฒ„๋ผ์ด๋”ฉ(overriding)

์กฐ์ƒ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์ž์† ํด๋ž˜์Šค ์ž์‹ ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

2์ฐจ์› ์ขŒํ‘œ๊ณ„์˜ ํ•œ ์ ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ Point ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ๋•Œ, ์ด๋ฅผ ์กฐ์ƒ์œผ๋กœ ํ•˜๋Š” Point3D ํด๋ž˜์Šค, 3์ฐจ์› ์ขŒํ‘œ๊ณ„์˜ ํ•œ ์ ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒˆ๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค๊ณ  ํ•˜์ž.

class Point {
    int x;
    int y;

    String getLocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;

    @Override
    String getLocation() { // ์˜ค๋ฒ„๋ผ์ด๋”ฉ
        return super.getLocation() + ", z : " + z;
    }
}

Point ํด๋ž˜์Šค์˜ getLocation()์€ ํ•œ ์ ์˜ x, y ์ขŒํ‘œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž‘์„ฑ๋˜์—ˆ๋‹ค.

์ด ๋‘ ํด๋ž˜์Šค๋Š” ์„œ๋กœ ์ƒ์†๊ด€๊ณ„์— ์žˆ์œผ๋ฏ€๋กœ Point3D ํด๋ž˜์Šค๋Š” Point ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ getLocation()์„ ์ƒ์†๋ฐ›์ง€๋งŒ, Point3D ํด๋ž˜์Šค๋Š” 3์ฐจ์› ์ขŒํ‘œ๊ณ„์˜ ํ•œ ์ ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์กฐ์ƒ์ธ Point ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ getLocation()์€ Point3D ํด๋ž˜์Šค์— ๋งž์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ Point3D ํด๋ž˜์Šค ์ž์‹ ์— ๋งž๊ฒŒ z์ถ•์˜ ์ขŒํ‘œ๊ฐ’๋„ ํฌํ•จํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์˜€๋‹ค.

Point ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์‚ฌ๋žŒ๋“ค์€ ์ƒˆ๋กœ ์ž‘์„ฑ๋œ Point3D ํด๋ž˜์Šค๊ฐ€ Point ํด๋ž˜์Šค์˜ ์ž์†์ด๋ฏ€๋กœ Point3D ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด์„œ getLocation()์„ ํ˜ธ์ถœํ•˜๋ฉด Point ํด๋ž˜์Šค์˜ getLocation()์ด ๊ทธ๋žฌ๋“ฏ์ด ์ ์˜ ์ขŒํ‘œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋ฅธ ์„ ํƒ์ด๋‹ค.

8. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์กฐ๊ฑด

๐Ÿ’ก
์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์† ํด๋ž˜์Šค์—์„œ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๋•Œ
  1. ์„ ์–ธ๋ถ€๊ฐ€ ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
  1. ์ ‘๊ทผ ์ œ์–ด์ž๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์ข์€ ์ ‘์œ„๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

    ์กฐ์ƒ โ‰ค ์ž์†

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

    ์ž์† โ‰ค ์กฐ์ƒ

9. ์˜ค๋ฒ„๋กœ๋”ฉ VS ์˜ค๋ฒ„๋ผ์ด๋”ฉ

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

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

class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {}      // ์˜ค๋ฒ„๋ผ์ด๋”ฉ   
	void parentMethod(int i) {} // ์˜ค๋ฒ„๋กœ๋”ฉ
	
	void childMethod() {}       // ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ ์ •์˜
	void childMethod(int i) {}  // ์˜ค๋ฒ„๋กœ๋”ฉ
	void childMethod() {}       // ์—๋Ÿฌ. ์ค‘๋ณต์ •์˜ ๋˜์—ˆ์Œ / already defined in Child
}

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

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

class Ex7_2 {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

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);
    }
}
<์‹คํ–‰๊ฒฐ๊ณผ>
x = 20
this.x = 20
super.x = 10

์œ„์˜ ์˜ˆ์ œ์—์„œ Child ํด๋ž˜์Šค๋Š” ์กฐ์ƒ์ธ Parent ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ x๋ฅผ ์ƒ์†๋ฐ›๋Š”๋ฐ, ๊ณต๊ต๋กญ๊ฒŒ๋„ ์ž์‹ ์˜ ๋ฉค๋ฒ„์ธ x์™€ ์ด๋ฆ„์ด ๊ฐ™์•„์„œ ์ด ๋‘˜์„ ๊ตฌ๋ถ„ํ•  ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ”๋กœ ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด super๋‹ค.

์•„๋ž˜์˜ ๊ฒฝ์šฐ x, this.x, super.x ๋ชจ๋‘ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์ด ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

class Ex7_2 {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

class Parent {
    int x = 10; /* super.x์™€ this.x ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ */
}

class Child extends Parent {
    void method() {
        System.out.println("x = " + x);
        System.out.println("this.x  = " + this.x);
        System.out.println("super.x  = " + super.x);
    }
}
<์‹คํ–‰๊ฒฐ๊ณผ>
x = 10
this.x = 20
super.x = 10

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

11. super() - ์กฐ์ƒ์˜ ์ƒ์„ฑ์ž

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

class Point {
	int x, y;

	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
class Point3D extends Point{
	int x, y;

	Point(int x, int y, int z) {
		this.x = x; // ์กฐ์ƒ์˜ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”
		this.y = y; // ์กฐ์ƒ์˜ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”
		this.z = z;
	}
}

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” Point3D ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ์กฐ์ƒ์ธ Point ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ x, y๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ํ‹€๋ฆฐ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ƒ์„ฑ์ž Point3D()๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์กฐ์ƒ์˜ ๋ฉค๋ฒ„๋Š” ์กฐ์ƒ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™”๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

Point3D(int x, int y, int z) {
	super(x, y); // ์กฐ์ƒํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž Point(int x, int y)๋ฅผ ํ˜ธ์ถœ
	this.z = z;  //์ž์‹ ์˜ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๊ธฐํ™”
}

12. ํŒจํ‚ค์ง€(package)

ํŒจํ‚ค์ง€๋ž€, ํด๋ž˜์Šค์˜ ๋ฌถ์Œ์ด๋‹ค. ํŒจํ‚ค์ง€์—๋Š” ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋กœ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค๋ผ๋ฆฌ ๊ทธ๋ฃน ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๋†“์Œ์œผ๋กœ์จ ํด๋ž˜์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋ž˜์Šค์ผ์ง€๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ž์‹ ๋งŒ์˜ ํŒจํ‚ค์ง€ ์ฒด๊ณ„๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœํ•œ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํด๋ž˜์Šค์™€ ์ด๋ฆ„์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋‹จ์ˆœํžˆ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ๋งŒ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ํด๋ž˜์Šค์˜ ์‹ค์ œ ์ด๋ฆ„(full name)์€ ํŒจํ‚ค์ง€๋ช…์„ ํฌํ•จํ•œ ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด String ํด๋ž˜์Šค์˜ ์‹ค์ œ ์ด๋ฆ„์€ java.lang.String์ด๋‹ค. java.langํŒจํ‚ค์ง€์— ์†ํ•œ String ํด๋ž˜์Šค๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋ž˜์Šค์ผ์ง€๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์†ํ•˜๋ฉด ํŒจํ‚ค์ง€๋ช…์œผ๋กœ ๊ตฌ๋ณ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ž˜์Šค๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํด๋ž˜์ŠคํŒŒ์ผ(.class)์ธ ๊ฒƒ๊ณผ ๊ฐ™์ด ํŒจํ‚ค์ง€๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ํŒจํ‚ค์ง€์— ์†ํ•œ ํด๋ž˜์Šค๋Š” ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ํด๋ž˜์ŠคํŒŒ์ผ(ํด๋ž˜์Šค ์ด๋ฆ„.class)์ด์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, java.lang.String ํด๋ž˜์Šค๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ java์˜ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ์ธ lang์— ์†ํ•œ String.class ํŒŒ์ผ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” System ํด๋ž˜์Šค ์—ญ์‹œ java.lang ํŒจํ‚ค์ง€์— ์†ํ•˜๋ฏ€๋กœ lang๋””๋ ‰ํ† ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

String ํด๋ž˜์Šค๋Š” rt.jar ํŒŒ์ผ์— ์••์ถ•๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด ํŒŒ์ผ์˜ ์••์ถ•์„ ํ’€๋ฉด ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํŒจํ‚ค์ง€๋„ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ '.โ€™์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด java.lang ํŒจํ‚ค์ง€์—์„œ lang ํŒจํ‚ค์ง€๋Š” java ํŒจํ‚ค์ง€์˜ ํ•˜์œ„ํŒจํ‚ค์ง€์ด๋‹ค.

13. ํŒจํ‚ค์ง€์˜ ์„ ์–ธ

ํŒจํ‚ค์ง€๋Š” ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์†Œ์ŠคํŒŒ์ผ(.java)์˜ ๋งจ ์œ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ ์ค„๋งŒ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

package ํŒจํ‚ค์ง€๋ช…;
  • ํŒจํ‚ค์ง€ ์„ ์–ธ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ์†Œ์ŠคํŒŒ์ผ์—์„œ ์ฃผ์„๊ณผ ๊ณต๋ฐฑ์„ ์ œ์™ธํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์žฅ์ด์–ด์•ผํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ์†Œ์ŠคํŒŒ์ผ์— ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ํด๋ž˜์Šค๋ช…๊ณผ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์†Œ๋ฌธ์ž๋กœ ํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค.

14. ํด๋ž˜์Šค ํŒจ์Šค(classpath)

PackageTest ํด๋ž˜์Šค๊ฐ€ com.codechobo.book ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค ํŒŒ์ผ์ธ PackageTest.class๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด com ํด๋” ์•ˆ์˜ codechobo ํด๋” ์•ˆ์˜ book ํด๋” ์•ˆ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด์ œ๋Š” ํŒจํ‚ค์ง€์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํด๋ž˜์ŠคํŒจ์Šค(classpath)์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค. com.codechobo.book ํŒจํ‚ค์ง€์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋””๋ ‰ํ† ๋ฆฌ โ€˜comโ€™์˜ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์ธ โ€˜C:\jdk1.8\workโ€™์ด๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํด๋ž˜์ŠคํŒจ์Šค์— ํฌํ•จ์‹œ์ผœ์•ผ๋งŒ ์‹คํ–‰ ์‹œ JVM์ด PackageTest ํด๋ž˜์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

Windows์—์„œ๋Š” โ€˜์ œ์–ดํŒ - ์‹œ์Šคํ…œ - ๊ณ ๊ธ‰ ์‹œ์Šคํ…œ ์„ค์ • - ํ™˜๊ฒฝ๋ณ€์ˆ˜ - ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐโ€™์—์„œ ๋ณ€์ˆ˜์ด๋ฆ„์— โ€˜CLASSPATHโ€™๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋ณ€์ˆ˜ ๊ฐ’์—๋Š” โ€˜.;c:\jdk1.8\workโ€™๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

โ€˜;โ€™๋ฅผ ๊ตฌ๋ถ„์ž๋กœํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฝ๋กœ๋ฅผ ํด๋ž˜์ŠคํŒจ์Šค์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งจ ์•ž์— โ€˜.;โ€™๋ฅผ ์ถ”๊ฐ€ํ•œ ์ด์œ ๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(.)๋ฅผ ํด๋ž˜์ŠคํŒจ์Šค์— ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ์ง€์ •ํ•ด ์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ(.)๊ฐ€ ํด๋ž˜์ŠคํŒจ์Šค๋กœ ์ง€์ •๋˜์ง€๋งŒ, ์ด์ฒ˜๋Ÿผ ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ์ด์ƒ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ž๋™์ ์œผ๋กœ ํด๋ž˜์ŠคํŒจ์Šค๋กœ ์ง€์ •๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ฒ˜๋Ÿผ ๋ณ„๋„๋กœ ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

jarํŒŒ์ผ์„ ํด๋ž˜์ŠคํŒจ์Šค์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฝ๋กœ์™€ ํŒŒ์ผ๋ช…์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€˜C:\jdk1.8\work\util.jarโ€™ํŒŒ์ผ์„ ํด๋ž˜์ŠคํŒจ์Šค์— ํฌํ•จ์‹œํ‚ค๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค

C:\WINDOWS>SET CLASSPATH=.;C:\jdk1.8\work;C:\jdk1.8\work\util.jar;

15. import๋ฌธ

import๋ฌธ์œผ๋กœ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๋ช…์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.


java util Date today 
= new java.util.Data();

โ†’

import java.util.Date;
...
Date today = new Date();

import๋ฌธ์˜ ์—ญํ• ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์†Œ์ŠคํŒŒ์ผ์— ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ปดํŒŒ์ผ ์‹œ์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” import๋ฌธ์„ ํ†ตํ•ด ์†Œ์ŠคํŒŒ์ผ์— ์‚ฌ์šฉ๋œ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๋ฅผ ์•Œ์•„ ๋‚ธ ๋‹ค์Œ, ๋ชจ๋“  ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— ํŒจํ‚ค์ง€๋ช…์„ ๋ถ™์—ฌ์ค€๋‹ค.

// ํ‚ค์›Œ๋“œ import์™€ ํŒจํ‚ค์ง€๋ช…์„ ์ƒ๋žตํ•˜๊ณ ์ž ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํŒจํ‚ค์ง€๋ช…๊ณผ ํ•จ๊ป˜ ์จ์ฃผ๋ฉด ๋œ๋‹ค.
import ํŒจํ‚ค์ง€๋ช….ํด๋ž˜์Šค๋ช…;
	๋˜๋Š”
// ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ,
//import๋ฌธ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  โ€˜ํŒจํ‚ค์ง€๋ช….*โ€™์„ ์ด์šฉํ•ด์„œ ์ง€์ •๋œ ํŒจํ‚ค์ง€์— ์†ํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ํŒจํ‚ค์ง€๋ช… ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
import ํŒจํ‚ค์ง€๋ช….*;

ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋Œ€์‹  โ€˜*โ€™์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ํŒจํ‚ค์ง€์—์„œ ์ผ์น˜ํ•˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋” ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋‹จ์ง€ ๊ทธ ๋ฟ์ด๋‹ค. ์‹คํ–‰ ์‹œ ์„ฑ๋Šฅ์ƒ์˜ ์ฐจ์ด๋Š” ์ „ํ˜€ ์—†๋‹ค.

16. static import๋ฌธ

static import๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด static๋ฉค๋ฒ„๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

import static java.lang.Integer.*; // Integer ํด๋ž˜์Šค์˜ ๋ชจ๋“  static ๋ฉ”์„œ๋“œ
import static java.lang.Math.random; // Math.random()๋งŒ. ๊ด„ํ˜ธ ์•ˆ ๋ถ™์ž„
import static java.lang.System.out; // System.out์„ out๋งŒ์œผ๋กœ ์ฐธ์กฐ๊ฐ€๋Šฅ

์œ„์™€ ๊ฐ™์ด static import๋ฌธ์„ ์„ ์–ธํ•˜์˜€๋‹ค๋ฉด, ์•„๋ž˜์˜ ์™ผ์ชฝ ์ฝ”๋“œ๋ฅผ ์˜ค๋ฅธ์ชฝ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๊ฐ„๋žตํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

System.out.println(Math.random());

โ†’

out.println(random());

// ์˜ˆ์ œ 7-6
import static java.lang.System.out;
import static java.lang.Math.*;
class Ex7_2 {
    public static void main(String[] args) {
        // System.out.println(Math.random());
        out.println(random());

        // System.out.println("Math.PI : " + Math.PI);
        System.out.println("Math.PI : " + PI);
    }
}

17. ์ œ์–ด์ž(modifier)

์ œ์–ด์ž(modifier)๋Š” ํด๋ž˜์Šค, ๋ณ€์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€์— ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๋ถ€๊ฐ€์ ์ธ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.

์ œ์–ด์ž์˜ ์ข…๋ฅ˜๋Š” ํฌ๊ฒŒ ์ ‘๊ทผ ์ œ์–ด์ž์™€ ๊ทธ ์™ธ์˜ ์ œ์–ด์ž๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก
์ ‘๊ทผ ์ œ์–ด์ž private, (default), protected, private

๊ทธ ์™ธ static, final, abstract, native, transient, synchronized, volatile, strictfp

์ œ์–ด์ž๋Š” ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ ์ œ์–ด์ž๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

18. static - ํด๋ž˜์Šค์˜, ๊ณตํ†ต์ ์ธ

๐Ÿ’ก
static์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ๋ฉค๋ฒ„๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ
๋Œ€์ƒ์˜๋ฏธ
๋ฉค๋ฒ„๋ณ€์ˆ˜- ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
- ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
- ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ์ƒ์„ฑ๋œ๋‹ค.
๋ฉ”์„œ๋“œ- ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ static ๋ฉ”์„œ๋“œ๊ฐ€ ๋œ๋‹ค.
- static๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋“ค์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋Š” static์„ ๋ถ™์—ฌ์„œ static ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด๋„๋ก ํ•˜์ž. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด static ๋ฉ”์„œ๋“œ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ด์„œ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ์†๋„๋„ ๋” ๋น ๋ฅด๋‹ค.

class StaticTest {
	static int width = 200;        // ํด๋ž˜์Šค ๋ณ€์ˆ˜(static ๋ณ€์ˆ˜)
	static int hegith = 120;       // ํด๋ž˜์Šค ๋ณ€์ˆ˜(static ๋ณ€์ˆ˜)

	satic {                        // ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๋ธ”๋Ÿญ
		// static ๋ณ€์ˆ˜์˜ ๋ณต์žกํ•œ ์ดˆ๊ธฐํ™” ์ˆ˜ํ–‰
	}

	static int max(int a, int b) { // ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ(static ๋ฉ”์„œ๋“œ)
		return a > b ? a : b;
	}
}

19. final - ๋งˆ์ง€๋ง‰์˜, ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š”

๐Ÿ’ก
final์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ๋ฉค๋ฒ„๋ณ€์ˆ˜, ์ง€์—ญ๋ณ€์ˆ˜
๋Œ€์ƒ์˜๋ฏธ
ํด๋ž˜์Šค๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค, ํ™•์žฅ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ final๋กœ ์ง€์ •๋œ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด ๋  ์ˆ˜ ์—†๋‹ค.
๋ฉ”์„œ๋“œ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ, final๋กœ ์ง€์ •๋œ ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ์žฌ์ •์˜ ๋  ์ˆ˜ ์—†๋‹ค.
๋ฉค๋ฒ„๋ณ€์ˆ˜๋ณ€์ˆ˜ ์•ž์— final์ด ๋ถ™์œผ๋ฉด, ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒ์ˆ˜๊ฐ€ ๋œ๋‹ค.
์ง€์—ญ๋ณ€์ˆ˜โ€œโ€

+) final ํด๋ž˜์Šค์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” String๊ณผ Math์ด๋‹ค.

final class FinalTest { // ์กฐ์ƒ์ด ๋  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค
	final int MAX_SIZE = 10; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜(์ƒ์ˆ˜)

	final void getMaxSize() { // ์˜ค๋ฒ„๋ผ๋”ฉํ•  ์ˆ˜ ์—†๋Š” ๋ฉ”์„œ๋“œ(๋ณ€๊ฒฝ๋ถˆ๊ฐ€)
		final int LV = MAX_SIZE; // ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ง€์—ญ๋ณ€์ˆ˜(์ƒ์ˆ˜)
		return MAX_SIZE;
	}
}

20. abstract - ์ถ”์ƒ์˜, ๋ฏธ์™„์„ฑ์˜

๐Ÿ’ก
abstract๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ
๋Œ€์ƒ์˜๋ฏธ
ํด๋ž˜์Šคํด๋ž˜์Šค ๋‚ด์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
๋ฉ”์„œ๋“œ์„ ์–ธ๋ถ€๋งŒ ์ž‘์„ฑํ•˜๊ณ  ๊ตฌํ˜„๋ถ€๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ž„์„ ์•Œ๋ฆฐ๋‹ค.
abstract class AbstractTest { // ์ถ”์ƒ ํด๋ž˜์Šค(์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค)
	abstract void move();       // ์ถ”์ƒ ๋ฉ”์„œ๋“œ(๊ตฌํ˜„๋ถ€๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ)
}

// ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” '๋ฏธ์™„์„ฑ ์„ค๊ณ„๋„'์ด๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
AbstractTest a = new AbstractTest(); // ์—๋Ÿฌ. ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ถˆ๊ฐ€

21. ์ ‘๊ทผ ์ œ์–ด์ž(access modifier)

๐Ÿ’ก
์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณณ - ํด๋ž˜์Šค, ๋ฉค๋ฒ„๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž
private๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
default๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
protected๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์ž์† ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
private์ ‘๊ทผ ์ œํ•œ์ด ์—†๋‹ค.

22. ์บก์Аํ™”์™€ ์ ‘๊ทผ ์ œ์–ด์ž

๐Ÿ’ก
์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
- ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด์„œ
- ์™ธ๋ถ€์—๋Š” ๋ถˆํ•„์š”ํ•œ, ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•ด์„œ

๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์„ ์œ ์ง€ํ•˜๋„๋ก, ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ํ•จ๋ถ€๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

์ด๊ฒƒ์„ ๋ฐ์ดํ„ฐ ๊ฐ์ถ”๊ธฐ(data hiding)๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์˜ ์บก์Аํ™”(encapsulation)์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์ด๋‹ค.


์˜ˆ์ œ

์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค

public class Time {
	public int hour;
	public int minute;
	public int seconde;
}

Time t = new Time();
t.hour = 25; // ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ์ง์ ‘ ์ ‘๊ทผ

๋ฉค๋ฒ„๋ณ€์ˆ˜ hour๋Š” 0๋ณด๋‹ค๋Š” ๊ฐ™๊ฑฐ๋‚˜ ํฌ๊ณ  24๋ณด๋‹ค๋Š” ์ž‘์€ ๋ฒ”์œ„์˜ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ์—์„œ์ฒ˜๋Ÿผ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ด๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ private์ด๋‚˜ protected๋กœ ์ œํ•œํ•˜๊ณ  ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

public class Time {
	private int hour;
	private int minute;
	private int second;

	public int getHour() { return hour; }
	public void setHour(int hour) {
		if (hour < 0 || hour > 23) return;
		this.hour = hour;
	}
	public int getMinute() { return minute; }
	public int setMinute() {
		if( minute < 0 || minute > 59 ) return;
		this.minute = minute;
	}
	public int getSecond() { return second; }
	public void setSecond() {
	  if( second < 0 || second > 59 ) return;
		this.second = second;
	}

}

๋งŒ์ผ ์ƒ์†์„ ํ†ตํ•ด ํ™•์žฅ๋  ๊ฒƒ์ด ์˜ˆ์ƒ๋˜๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ๋ฉค๋ฒ„์— ์ ‘๊ทผ ์ œํ•œ์„ ์ฃผ๋˜ ์ž์†ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด private ๋Œ€์‹  protected๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

23. ๋‹คํ˜•์„ฑ(polymorphisom)

๐Ÿ’ก
์กฐ์ƒํƒ€์ž… ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์†ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ ์ž์†ํƒ€์ž… ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์กฐ์ƒํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜๋Š” ์—†๋‹ค.

๋‹คํ˜•์„ฑ์ด๋ž€ โ€˜์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅโ€™์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ž๋ฐ”์—์„œ๋Š” ์กฐ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์† ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

CaptionTv c = new CaptionTv(); // ์ฐธ์กฐ ๋ณ€์ˆ˜์™€ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์ด ์ผ์น˜
Tv        t = new CaptionTv(); // ์กฐ์ƒ ํƒ€์ž… ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์† ํƒ€์ž… ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ

์œ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ CaptionTv ํƒ€์ž…์ด๋ผ ํ• ์ง€๋ผ๋„, ์ฐธ์กฐ๋ณ€์ˆ˜ t๋กœ๋Š” CaptionTv ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

Tv ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ๋Š” CaptionTv ์ธ์Šคํ„ด์Šค ์ค‘์—์„œ Tv ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค(์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„ํฌํ•จ)๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ƒ์„ฑ๋œ Caption ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ์ค‘์—์„œ Tv ํด๋ž˜์Šค์— ์ •์˜๋˜์ง€ ์•Š์€ ๋ฉค๋ฒ„, text์™€ caption()์€ ์ฐธ์กฐ๋ณ€์ˆ˜ t๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, t.text ๋˜๋Š” t.caption()์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‘˜ ๋‹ค ๊ฐ™์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ง€๋งŒ ์ฐธ์กฐ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

๋ฐ˜๋Œ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์† ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์กฐ์ƒ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ• ๊นŒ?

Caption c = new Tv(); // ์—๋Ÿฌ. ํ—ˆ์šฉ ์•ˆ ๋จ.

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์‹ค์ œ ์ธ์Šคํ„ด์Šค์ธ Tv์˜ ๋ฉค๋ฒ„ ๊ฐœ์ˆ˜๋ณด๋‹ค ์ฐธ์กฐ๋ณ€์ˆ˜ c๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„ ๊ฐœ์ˆ˜๊ฐ€ ๋” ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

24. ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ํ˜•๋ณ€ํ™˜

๐Ÿ’ก
์„œ๋กœ ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํƒ€์ž…๊ฐ„์˜ ํ˜•๋ณ€ํ™˜์€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ž์†ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋ž˜์„œ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ๋จผ์ € ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

class Ex7_7 {
    public static void main(String[] args) {
        Car car = null;
        FireEngine fe = new FireEngine();
        FireEngine fe2 = null;

        fe.water();
        car = fe; // car = (Car) fe; ์—์„œ ํ˜•๋ณ€ํ™˜์ด ์ƒ๋žต๋จ 
        // car.water(); // ์ปดํŒŒ์ผ ์—๋Ÿฌ!!! Car ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ๋Š” water()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค. 
        fe2 = (FireEngine) car; // ์กฐ์ƒํƒ€์ž… -> ์ž์†ํƒ€์ž…. ํ˜•๋ณ€ํ™˜ ์ƒ๋žต ๋ถˆ๊ฐ€ 
        fe2.water();
    }
}

class Car {
    String color;
    int door;

    void drive() {
        System.out.println("drive, Brrrr~");
    }

    void stop() {
        System.out.println("stop!!!!");
    }
}

class FireEngine extends Car {
    void water() {
        System.out.println("water!!!");
    }
}

์ด ์˜ˆ์ œ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋‹ค์Œ์˜ ๋‘ ์ค„์ด๋ฉฐ, ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

FireEngine fe = new FireEngine(); // FireEngine ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
car = (Car) fe;                   // fe์˜ ๊ฐ’์„ car์— ์ €์žฅ.(ํ˜•๋ณ€ํ™˜ ์ƒ๋žต๋จ)

์ฐธ์กฐ๋ณ€์ˆ˜ fe์˜ ๊ฐ’์„ car์— ์ €์žฅํ•˜์—ฌ car๋กœ๋„ FireEngine ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋‹ค๋งŒ ์ฐธ์กฐ๋ณ€์ˆ˜ fe์™€ ๋‹ฌ๋ฆฌ car๋กœ๋Š” FireEngine ์ธ์Šคํ„ด์Šค์˜ ๋ฉค๋ฒ„ ์ค‘ 4๊ฐœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

26. instanceof ์—ฐ์‚ฐ์ž

๐Ÿ’ก
์–ด๋–ค ํƒ€์ž…์— ๋Œ€ํ•œ instanceof ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ true๋ผ๋Š” ๊ฒƒ์€ ๊ฒ€์‚ฌํ•œ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค์˜ ์‹ค์ œ ํƒ€์ž…์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ๋กœ ์กฐ๊ฑด๋ฌธ์— ์‚ฌ์šฉ๋˜๋ฉฐ, instanceof์˜ ์™ผ์ชฝ์—๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ, ์˜ค๋ฅธ์ชฝ์—๋Š” ํƒ€์ž…(ํด๋ž˜์Šค๋ช…)์ด ํ”ผ์—ฐ์‚ฐ์ž๋กœ ์œ„์น˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ boolean๊ฐ’์ธ true์™€ false์ค‘์˜ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

instanceof๋ฅผ ์ด์šฉํ•œ ์—ฐ์‚ฐ๊ฒฐ๊ณผ๋กœ true๋ฅผ ์–ป์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฒ€์‚ฌํ•œ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

void doWork(Car c) {
	if(c instanceof FireEngine) {    // 1. ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ.
		FireEngine fe = (FireEngine)c; // 2. ํ˜•๋ณ€ํ™˜
		fe.water();
	}
}

์œ„์˜ ์ฝ”๋“œ๋Š” Carํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ c๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Car ํด๋ž˜์Šค ๋˜๋Š” ๊ทธ ์ž์† ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ฒจ๋ฐ›๊ฒ ์ง€๋งŒ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋Š” ์ •ํ™•ํžˆ ์–ด๋–ค ์ธ์Šคํ„ด์Šค์ธ์ง€ ์•Œ ๊ธธ์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ instanceof ์—ฐ์‚ฐ์ž๋กœ ์ฐธ์กฐ๋ณ€์ˆ˜ c๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ์ฒดํฌํ•˜๊ณ , ์ ์ ˆํžˆ ํ˜•๋ณ€ํ™˜ํ•œ ๋‹ค์Œ์— ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค.

์กฐ์ƒํƒ€์ž… ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ž์†ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์ด ํ•ญ์ƒ ์ผ์น˜ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค. ์กฐ์ƒํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ๋Š” ์‹ค์ œ ์ธ์Šคํ„ด์Šค์˜ ๋ฉค๋ฒ„๋“ค์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์ธ์Šคํ„ด์Šค์™€ ๊ฐ™์€ ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•ด์•ผ๋งŒ ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

27. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์„ฑ

์ฐธ์กฐ๋ณ€์ˆ˜์˜ ๋‹คํ˜•์ ์ธ ํŠน์ง•์€ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋„ ์ ์šฉ๋œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด Product, Tv, Computer, Buyer ํด๋ž˜์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

class Product {
	int price;                      // ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ
	int bonusPoint;                 // ์ œํ’ˆ๊ตฌ๋งค ์‹œ ์ œ๊ณตํ•˜๋Š” ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ
}

class Tv extends Product {}
class Computer extends Product {}

class Buyer {                     // ๊ณ ๊ฐ, ๋ฌผ๊ฑด์„ ์‚ฌ๋Š” ์‚ฌ๋žŒ
	int money = 1000;               // ์†Œ์œ ๊ธˆ์•ก
	int bonusPoint = 0;             // ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ
}

Product ํด๋ž˜์Šค๋Š” Tv์™€ Computer ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด๋ฉฐ, Buyer ํด๋ž˜์Šค๋Š” ์ œํ’ˆ(Product)๋ฅผ ๊ตฌ์ž…ํ•˜๋Š” ์‚ฌ๋žŒ์„ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

Buyer ํด๋ž˜์Šค์— ๋ฌผ๊ฑด์„ ๊ตฌ์ž…ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž. ๊ตฌ์ž…ํ•  ๋Œ€์ƒ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ตฌ์ž…ํ•  ์ œํ’ˆ์„ ๋„˜๊ฒจ๋ฐ›์•„์•ผ ํ•œ๋‹ค. Tv๋ฅผ ์‚ด ์ˆ˜ ์žˆ๋„๋ก ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ Tvํƒ€์ž…์œผ๋กœ ํ•˜์˜€๋‹ค.

void buy(Tv t) {
	// Buyer๊ฐ€ ๊ฐ€์ง„ ๋ˆ(money)์—์„œ ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ(t.price)๋งŒํผ ๋บ€๋‹ค.
	money = money - t.price;
	
	// Buyer์˜ ๋ณด๋„ˆ์Šค์ ์ˆ˜(bonusPoint)์— ์ œํ’ˆ์˜ ๋ณด๋„ˆ์Šค์ ์ˆ˜(t.bonusPoint)๋ฅผ ๋”ํ•œ๋‹ค.
	bonusPoint = bonusPoint + t.bonusPoint;
}

buy(Tv t)๋Š” ์ œํ’ˆ์„ ๊ตฌ์ž…ํ•˜๋ฉด ์ œํ’ˆ์„ ๊ตฌ์ž…ํ•œ ์‚ฌ๋žŒ์ด ๊ฐ€์ง„ ๋ˆ์—์„œ ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ์„ ๋นผ๊ณ , ๋ณด๋„ˆ์Šค ์ ์ˆ˜๋Š” ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋„๋ก ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ buy(Tv t)๋กœ๋Š” Tv๋ฐ–์— ์‚ด ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ์ œํ’ˆ๋“ค๋„ ๊ตฌ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋‹ค.

void buy(Computer c) {
	money = money - t.price;
	bonusPoint = bonusPoint + t.bonusPoint;
}

์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ์ œํ’ˆ์˜ ์ข…๋ฅ˜๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค Buyer ํด๋ž˜์Šค์—๋Š” ์ƒˆ๋กœ์šด buy๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฒŒ๋ณ€์ˆ˜์— ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

void buy(Computer p) {
	money -= p.price;
	bonusPoint += p.bonusPoint;
}

โ†’

void buy(Product p) {
	money -= p.price;
	bonusPoint += p.bonusPoint;
}

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Product ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์€, ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Product ํด๋ž˜์Šค์˜ ์ž์†ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฉด ์–ด๋А ๊ฒƒ์ด๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  Product ํด๋ž˜์Šค์— price์™€ bonusPoint๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๋ณ€์ˆ˜ p๋กœ ์ธ์Šคํ„ด์Šค์˜ price์™€ bonusPoint๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ด์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•ž์œผ๋กœ ๋‹ค๋ฅธ ์ œํ’ˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ Product ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ๋งŒ ํ•˜๋ฉด, buy(Product p)๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์—ฌ์งˆ ์ˆ˜ ์žˆ๋‹ค.

Buyer b = new Buyer();
Tv t = new Tv();
Computer c = new Computer();

b.buy(t); // b.buy(new Tv());
t.buy(c); // b.buy(new Computer());

Tv ํด๋ž˜์Šค์™€ Computer ํด๋ž˜์Šค๋Š” Product ํด๋ž˜์Šค์˜ ์ž์†์ด๋ฏ€๋กœ ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด buy(Product p) ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Tv ์ธ์Šคํ„ด์Šค์™€ Computer ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

// ์˜ˆ์ œ 7-8

class Product {
	int price;                      // ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ
	int bonusPoint;                 // ์ œํ’ˆ๊ตฌ๋งค ์‹œ ์ œ๊ณตํ•˜๋Š” ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ

	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price / 10.0); // ๋ณด๋„ˆ์Šค ์ ์ˆ˜๋Š” ์ œํ’ˆ ๊ฐ€๊ฒฉ์˜ 10%
	}
}

class Tv extends Product {
	Tv() {
		super(100);
	}

	public String toString() { return "Tv"; }
}
class Computer extends Product {
	Computer() {
		super(200);
	}

	public String toString() { return "Computer"; }
}

class Buyer {                     // ๊ณ ๊ฐ, ๋ฌผ๊ฑด์„ ์‚ฌ๋Š” ์‚ฌ๋žŒ
	int money = 1000;               // ์†Œ์œ ๊ธˆ์•ก
	int bonusPoint = 0;             // ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ

	void buy(Product p) {
		if( money < p.price ) {
			System.out.println("์ž”์•ก์ด ๋ถ€์กฑํ•˜์—ฌ ๋ฌผ๊ฑด์„ ์‚ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
			return;
		}

		money -= p.price;
		bonusPoint += p.bonusPoint;
		System.out.println(p + "์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.");
	}
}

class Ex7_8 {
	public static void main(String args[]) {
		Buyer b = new Buyer();

		b.buy(new Tv());
		b.buy(new Computer());

		System.out.println("ํ˜„์žฌ ๋‚จ์€ ๋ˆ์€ " + b.money + "๋งŒ์›์ž…๋‹ˆ๋‹ค.");
		System.out.println("ํ˜„์žฌ ๋ณด๋„ˆ์Šค ์ ์ˆ˜๋Š” " + b.bonusPoint + "์ ์ž…๋‹ˆ๋‹ค.");
	}

}
<๊ฒฐ๊ณผ>
Tv์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
Computer์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋‚จ์€ ๋ˆ์€ 700๋งŒ์›์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ณด๋„ˆ์Šค ์ ์ˆ˜๋Š” 30์ ์ž…๋‹ˆ๋‹ค.

28. ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃจ๊ธฐ

Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = n ew Audio();

โ†’

Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();

์™ผ์ชฝ์˜ ์ฝ”๋“œ๋ฅผ Product ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ ๋ฐฐ์—ด๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™๋‹ค.

์ด์ฒ˜๋Ÿผ ์กฐ์ƒํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ณตํ†ต์˜ ์กฐ์ƒ์„ ๊ฐ€์ง„ ์„œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฌถ์–ด์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ๋˜๋Š” ๋ฌถ์–ด์„œ ๋‹ค๋ฃจ๊ณ  ์‹ถ์€ ๊ฐ์ฒด๋“ค์˜ ์ƒ์†๊ด€๊ณ„๋ฅผ ๋”ฐ์ ธ์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณตํ†ต์กฐ์ƒ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์„œ ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

// ์˜ˆ์ œ 7-9
class Product {
	int price;                      // ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ
	int bonusPoint;                 // ์ œํ’ˆ๊ตฌ๋งค ์‹œ ์ œ๊ณตํ•˜๋Š” ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ

	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price / 10.0); // ๋ณด๋„ˆ์Šค ์ ์ˆ˜๋Š” ์ œํ’ˆ ๊ฐ€๊ฒฉ์˜ 10%
	}

    Product() {

    }
}

class Tv extends Product {
	Tv() {
		super(100);
	}

	public String toString() { return "Tv"; }
}
class Computer extends Product {
	Computer() {
		super(200);
	}

	public String toString() { return "Computer"; }
}

class Audio extends Product {
    Audio() { 
        super(50); 
    }

    public String toString() { return "Audio"; }
}

class Buyer {                         // ๊ณ ๊ฐ, ๋ฌผ๊ฑด์„ ์‚ฌ๋Š” ์‚ฌ๋žŒ
	int money = 1000;                 // ์†Œ์œ ๊ธˆ์•ก
	int bonusPoint = 0;               // ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ
    Product[] cart = new Product[10]; // ๊ตฌ์ž…ํ•œ ์ œํ’ˆ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด
    int i = 0;

	void buy(Product p) {
		if( money < p.price ) {
			System.out.println("์ž”์•ก์ด ๋ถ€์กฑํ•˜์—ฌ ๋ฌผ๊ฑด์„ ์‚ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
			return;
		}

		money -= p.price;             // ๊ฐ€์ง„ ๋ˆ์—์„œ ๊ตฌ์ž…ํ•œ ์ œํ’ˆ์˜ ๊ฐ€๊ฒฉ์„ ๋บ€๋‹ค.
		bonusPoint += p.bonusPoint;   // ์ œํ’ˆ์˜ ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
        cart[i++] = p;                // ์ œํ’ˆ์„ Product[] cart์— ์ €์žฅํ•œ๋‹ค.
		System.out.println(p + "์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.");
	}

    void summary() {
        int sum = 0;
        String itemList = "";

        for(int i = 0; i < cart.length; i++) {
            if(cart[i] == null) break;

            sum += cart[i].price;
            itemList += cart[i] + ", ";
        }

        System.out.println("๊ตฌ์ž…ํ•˜์‹  ๋ฌผํ’ˆ์˜ ์ด ๊ธˆ์•ก์€ " + sum + "๋งŒ์›์ž…๋‹ˆ๋‹ค.");
        System.out.println("๊ตฌ์ž…ํ•˜์‹  ์ œํ’ˆ์€ " + itemList + "์ž…๋‹ˆ๋‹ค.");

    }
}

class Ex7_7 {
	public static void main(String args[]) {
		Buyer b = new Buyer();

		b.buy(new Tv());
		b.buy(new Computer());
        b.buy(new Audio());

        b.summary();
	}

}
<๊ฒฐ๊ณผ>
Tv์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
Computer์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
Audio์„/๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
๊ตฌ์ž…ํ•˜์‹  ๋ฌผํ’ˆ์˜ ์ด ๊ธˆ์•ก์€ 350๋งŒ์›์ž…๋‹ˆ๋‹ค.
๊ตฌ์ž…ํ•˜์‹  ์ œํ’ˆ์€ Tv, Computer, Audio, ์ž…๋‹ˆ๋‹ค.

31. ์ถ”์ƒ ํด๋ž˜์Šค(abstract class)

๐Ÿ’ก
์ถ”์ƒ ํด๋ž˜์Šค ๋ฏธ์™„์„ฑ ์„ค๊ณ„๋„. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋ถˆ๊ฐ€
๋ฏธ์™„์„ฑ ๋ฉ”์„œ๋“œ(์ถ”์ƒ ๋ฉ”์„œ๋“œ)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค

์ถ”์ƒ ํด๋ž˜์Šค ์ž์ฒด๋กœ๋Š” ํด๋ž˜์Šค๋กœ์„œ์˜ ์—ญํ• ์„ ๋‹ค ๋ชปํ•˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ฐ”ํƒ•์ด ๋˜๋Š” ์กฐ์ƒ ํด๋ž˜์Šค๋กœ์„œ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ™๋Š”๋‹ค. ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์™„์ „ํ•˜์ง€๋Š” ๋ชปํ•˜๋”๋ผ๋„ ์–ด๋А ์ •๋„ ํ‹€์„ ๊ฐ–์ถ˜ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ๊ฒƒ์ด๋‹ค.

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

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํ‚ค์›Œ๋“œ โ€˜abstractโ€™๋ฅผ ๋ถ™์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํด๋ž˜์Šค ์„ ์–ธ๋ถ€์˜ abstract๋ฅผ ๋ณด๊ณ  ์ด ํด๋ž˜์Šค์—๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ƒ์†์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

abstract class ํด๋ž˜์Šค์ด๋ฆ„ {
	...
}

์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ์ „ํ˜€ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์—๋„ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋ฉค๋ฒ„๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

32. ์ถ”์ƒ ๋ฉ”์„œ๋“œ(abstract method)

๐Ÿ’ก
์ถ”์ƒ ๋ฉ”์„œ๋“œ ๋ฏธ์™„์„ฑ ๋ฉ”์„œ๋“œ.
์„ ์–ธ๋ถ€๋งŒ ์ž‘์„ฑํ•˜๊ณ  ๊ตฌํ˜„๋ถ€๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ๋‚จ๊ฒจ ๋‘” ๊ฒƒ

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

์ถ”์ƒ๋ฉ”์„œ๋“œ ์—ญ์‹œ ํ‚ค์›Œ๋“œ โ€˜abstractโ€™๋ฅผ ์•ž์— ๋ถ™์—ฌ ์ฃผ๊ณ , ์ถ”์ƒ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„๋ถ€๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ด„ํ˜ธ{} ๋Œ€์‹  ๋ฌธ์žฅ์˜ ๋์„ ์•Œ๋ฆฌ๋Š” โ€˜;โ€™์„ ์ ์–ด์ค€๋‹ค.

/* ์ฃผ์„์„ ํ†ตํ•ด ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์˜€๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค. */
abstract ๋ฆฌํ„ดํƒ€์ž… ๋ฉ”์„œ๋“œ์ด๋ฆ„();

์ถ”์ƒํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ์ž์† ํด๋ž˜์Šค๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•ด ์กฐ์ƒ์ธ ์ถ”์ƒํด๋ž˜์Šค์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์ผ ์กฐ์ƒ์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ์ถ”์ƒ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ž์†ํด๋ž˜์Šค ์—ญ์‹œ ์ถ”์ƒํด๋ž˜์Šค๋กœ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

abstract class Player { // ์ถ”์ƒํด๋ž˜์Šค
	abstract void play(int pos);         // ์ถ”์ƒ๋ฉ”์„œ๋“œ
	abstract void stop();                // ์ถ”์ƒ๋ฉ”์„œ๋“œ
}

class AudioPlayer extends Player {
	void play(int pos) { /* ๋‚ด์šฉ ์ƒ๋žต */ } // ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„
	void stop() { /* ๋‚ด์šฉ ์ƒ๋žต */ }        // ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„

}

์‹ค์ œ ์ž‘์—…๋‚ด์šฉ์ธ ๊ตฌํ˜„๋ถ€๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฌด์Šจ ์˜๋ฏธ๊ฐ€ ์žˆ์„๊นŒ ์‹ถ๊ธฐ๋„ ํ•˜๊ฒ ์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ ์ž‘์—…๋‚ด์šฉ์ธ ๊ตฌํ˜„๋ถ€๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์„ ์–ธ๋ถ€์ด๋‹ค.

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

33. ์ถ”์ƒํด๋ž˜์Šค์˜ ์ž‘์„ฑ

์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ฐ”๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋„ ํ•˜๊ณ , ๊ธฐ์กด์˜ ํด๋ž˜์Šค์˜ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ๋ฝ‘์•„์„œ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ์ƒ์†ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ถ”์ƒ์˜ ์‚ฌ์ „์  ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๐Ÿ’ก
์ถ”์ƒ ๋ฏธ์™„์„ฑ ์„ค๊ณ„๋„. ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋ถˆ๊ฐ€
๋ฏธ์™„์„ฑ ๋ฉ”์„œ๋“œ(์ถ”์ƒ ๋ฉ”์„œ๋“œ)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค

์ƒ์†์ด ์ž์† ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์กฐ์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ์ด์™€ ๋ฐ˜๋Œ€๋กœ ์ถ”์ƒํ™”๋Š” ๊ธฐ์กด์˜ ํด๋ž˜์Šค์˜ ๊ณตํ†ต๋ถ€๋ถ„์„ ๋ฝ‘์•„๋‚ด์„œ ์กฐ์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”์ƒํ™”๋ฅผ ๊ตฌ์ฒดํ™”์™€ ๋ฐ˜๋Œ€๋Œ€๋Š” ์˜๋ฏธ๋กœ ์ดํ•ดํ•˜๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์†๊ณ„์ธต๋„๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐˆ์ˆ˜๋ก ํด๋ž˜์Šค๋Š” ์ ์  ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ๊ตฌ์ฒดํ™”์˜ ์ •๋„๊ฐ€ ์‹ฌํ•ด์ง€๋ฉฐ, ์ƒ์†๊ณ„์ธต๋„๋ฅผ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ํด๋ž˜์Šค๋Š” ์ถ”์ƒํ™”์˜ ์ •๋„๊ฐ€ ์‹ฌํ•ด์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ƒ์†๊ณ„์ธต๋„๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค ๊ฐˆ์ˆ˜๋ก ์„ธ๋ถ„ํ™”๋˜๋ฉฐ, ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๊ณตํ†ต์š”์†Œ๋งŒ ๋‚จ๊ฒŒ๋œ๋‹ค.

์œ ๋ช…ํ•œ ์ปดํ“จํ„ฐ ๊ฒŒ์ž„์— ๋‚˜์˜ค๋Š” ์œ ๋‹›๋“ค์„ ํด๋ž˜์Šค๋กœ ๊ฐ„๋‹จํžˆ ์ •์˜ํ•ด๋ณด์•˜๋‹ค. ์ด ์œ ๋‹›๋“ค์„ ๊ฐ์ž ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๊ณตํ†ต๋ถ€๋ถ„์„ ๋ฝ‘์•„๋‚ด์–ด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ์ด ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด์ž.

class Marine { // ๋ณด๋ณ‘
	int x, y;    // ํ˜„์žฌ ์œ„์น˜
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void stop()             { /* ํ˜„์žฌ ์œ„์น˜์— ์ •์ง€  */ }
	void stimPack()         { /* ์ŠคํŒ€ํŒฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. */ }
}

class Tank { // ํƒฑํฌ
	int x, y;  // ํ˜„์žฌ ์œ„์น˜
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void stop()             { /* ํ˜„์žฌ ์œ„์น˜์— ์ •์ง€  */ }
	void changeMode()       { /* ๊ณต๊ฒฉ๋ชจ๋“œ๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค. */ }
}

class Dropship{ // ์ˆ˜์†ก์„ 
	int x, y;  // ํ˜„์žฌ ์œ„์น˜
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void stop()             { /* ํ˜„์žฌ ์œ„์น˜์— ์ •์ง€  */ }
	void load()             { /* ์„ ํƒ๋œ ๋Œ€์ƒ์„ ํƒœ์šด๋‹ค. */ }
	void unload()           { /* ์„ ํƒ๋œ ๋Œ€์ƒ์„ ๋‚ด๋ฆฐ๋‹ค. */ }
}
abstract class Unit {
	int x, y;
	abstract void move(int x, int y);
	void stop();
}

class Marine extends Unit { // ๋ณด๋ณ‘
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void stimPack()         { /* ์ŠคํŒ€ํŒฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. */ }
}

class Tank extends Unit { // ํƒฑํฌ
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void changeMode()       { /* ๊ณต๊ฒฉ๋ชจ๋“œ๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค. */ }
}

class Dropship extends Unit { // ์ˆ˜์†ก์„ 
	void move(int x, int y) { /* ์ง€์ •๋œ ์œ„์น˜๋กœ ์ด๋™ */ }
	void load()             { /* ์„ ํƒ๋œ ๋Œ€์ƒ์„ ํƒœ์šด๋‹ค. */ }
	void unload()           { /* ์„ ํƒ๋œ ๋Œ€์ƒ์„ ๋‚ด๋ฆฐ๋‹ค. */ }
}

๊ฐ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ๋ถ€๋ถ„์„ ๋ฝ‘์•„๋‚ด์„œ Unit ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋„๋ก ํ•˜์˜€๋‹ค. ์ด Unitํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ์œ ๋‹›์„ ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋“ค ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ stop๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธ๋ถ€์™€ ๊ตฌํ˜„๋ถ€ ๋ชจ๋‘ ๊ณตํ†ต์ ์ด์ง€๋งŒ, Marine, Tank๋Š” ์ง€์ƒ์œ ๋‹›์ด๊ณ  Dropship์€ ๊ณต์ค‘์œ ๋‹›์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์„œ๋กœ ๋‹ฌ๋ผ์„œ move๋ฉ”์„œ๋“œ์˜ ์‹ค์ œ ๊ตฌํ˜„ ๋‚ด์šฉ์ด ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค.

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

move๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธ๋œ ๊ฒƒ์€, ์•ž์œผ๋กœ Unitํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์ž‘์„ฑ๋˜๋Š” ํด๋ž˜์Šค๋Š” move๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ์˜ ํด๋ž˜์Šค์— ์•Œ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ๋„ ํ•˜๋‹ค.

Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();

for(int i = 0; i < group.length; i++) {
	group[i].move(100, 200); // Unit ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์œ ๋‹›์„ ์ขŒํ‘œ(100, 200)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค.
}

34. ์ธํ„ฐํŽ˜์ด์Šค(interface)

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

์ถ”์ƒ๋ฉ”์„œ๋“œ = ๋ฏธ์™„์„ฑ ์„ค๊ณ„๋˜(๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ์™„์„ฑ๋œ)

์ธํ„ฐํŽ˜์ด์Šค = ๊ธฐ๋ณธ ์„ค๊ณ„๋„(๊ตฌํ˜„๋œ ๊ฒƒ์€ ์•„๋ฌด๊ฒƒ๋„ ์—†๊ณ  ๋ฐ‘๊ทธ๋ฆผ๋งŒ ๊ทธ๋ ค์ ธ ์žˆ์Œ)

์ธํ„ฐํŽ˜์ด์Šค๋„ ์ถ”์ƒํด๋ž˜์Šค์ฒ˜๋Ÿผ ์™„์„ฑ๋˜์ง€ ์•Š์€ ๋ถˆ์™„์ „ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ž์ฒด๋งŒ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋ณด๋‹ค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋„์›€ ์ค„ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ํ‚ค์›Œ๋“œ๋กœ class ๋Œ€์‹  interface๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ๋งŒ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ฆฌ๊ณ  interface์—๋„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ ‘๊ทผ์ œ์–ด์ž๋กœ public ๋˜๋Š” default๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

interface ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
	public static final ํƒ€์ž… ์ƒ์ˆ˜์ด๋ฆ„ = ๊ฐ’;
	public abstract ๋ฉ”์„œ๋“œ์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜๋ชฉ๋ก);
}

์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉค๋ฒ„๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ฝ์‚ฌํ•ญ์ด ์žˆ๋‹ค.

โ•
- ๋ชจ๋“  ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” public static final ์ด์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” public abstract ์ด์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹จ, static ๋ฉ”์„œ๋“œ์™€ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ(JDK1.8 ๋ถ€ํ„ฐ)

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

interface PlayingCard {
	public static final int SPADE = 4;
	final int DIAMOND = 3;
	static int HEART = 2;
	int CLOVER = 1;

	public abstract String getCardNumber();
	String getCardKind(); // public abstract String getCardKind();
}

36. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒ์†

โœ…
- ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ๋งŒ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
- ํด๋ž˜์Šค์™€๋Š” ๋‹ฌ๋ฆฌ ๋‹ค์ค‘์ƒ์†, ์ฆ‰ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ๋งŒ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ž˜์Šค์™€๋Š” ๋‹ฌ๋ผ ๋‹ค์ค‘์ƒ์†, ์ฆ‰ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†์„ ๋ฐ›๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

+) ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค์™€ ๋‹ฌ๋ฆฌ Obejct ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์ตœ๊ณ  ์กฐ์ƒ์ด ์—†๋‹ค.

interface Movable {
    // ์ง€์ •๋œ ์œ„์น˜(x, y)๋กœ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ฉ”์„œ๋“œ
    void move(int x, int y);
}

interface Attackable {
    // ์ง€์ •๋œ ๋Œ€์ƒ(u)์„ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ฉ”์„œ๋“œ
    void attack(Unit u);
}

interface Fightable extends Movable, Attackable { }

ํด๋ž˜์Šค์˜ ์ƒ์†๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž์† ์ธํ„ฐํŽ˜์ด์Šค(Fightable)๋Š” ์กฐ์ƒ ์ธํ„ฐํŽ˜์ด์Šค(Movable, Attackable)์— ์ •์˜๋œ ๋ฉค๋ฒ„๋ฅผ ๋ชจ๋‘ ์ƒ์†๋ฐ›๋Š”๋‹ค.

๊ทธ๋ž˜์„œ Fightable ์ž์ฒด์—๋Š” ์ •์˜๋œ ๋ฉค๋ฒ„๊ฐ€ ํ•˜๋‚˜๋„ ์—†์ง€๋งŒ ์กฐ์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋‘ ๊ฐœ์˜ ์ถ”์ƒ๋ฉ”์„œ๋“œ, move(int x, int y)์™€ attack(Unit u)์„ ๋ฉค๋ฒ„๋กœ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

37. ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„

โœ…
- ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์‹œ โ€˜implementsโ€™ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
- ๋งŒ์ผ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋งŒ ๊ตฌํ˜„ ์‹œ, ์ถ”์ƒํด๋ž˜์Šค๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋„ ์ถ”์ƒํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ทธ ์ž์ฒด๋กœ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

์ถ”์ƒํด๋ž˜์Šค๊ฐ€ ์ƒ์†์„ ํ†ตํ•ด ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ž์‹ ์— ์ •์˜๋œ ์ถ”์ƒ๋ฉ”์„œ๋“œ์˜ ๋ชธํ†ต์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ž˜์Šค๋Š” ํ™•์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ ํ‚ค์›Œ๋“œ โ€˜extendsโ€™๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ ํ‚ค์›Œ๋“œ โ€˜implementsโ€™๋ฅผ ์‚ฌ์šฉํ•  ๋ฟ์ด๋‹ค.

class ํด๋ž˜์Šค์ด๋ฆ„ implements ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„ {
	// ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
}

// Fighter ํด๋ž˜์Šค๋Š” Fightable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
class Fighter implements Fightable {
	public void move(int x, int y) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
	public void attack(Unit u) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
}

๋งŒ์ผ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ์ค‘ ์ผ๋ถ€๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด, abstract๋ฅผ ๋ถ™์—ฌ์„œ ์ถ”์ƒํด๋ž˜์Šค๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

abstract class Fighter implements Fightable {
	public void move(int x, int y) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์†๊ณผ ๊ตฌํ˜„์„ ๋™์‹œ์— ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
	public void attack(Unit u)     { /* ๋‚ด์šฉ ์ƒ๋žต */ }
}

38. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ๋‹คํ˜•์„ฑ

โœ…
์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹คํ˜•์„ฑ์„ ํ•™์Šตํ•  ๋•Œ ์ž์†ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์กฐ์ƒํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์—ญ์‹œ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ์˜ ํ˜•๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค Fightable์„ ํด๋ž˜์Šค Fighter๊ฐ€ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Fighter ์ธ์Šคํ„ด์Šค๋ฅผ Fightable ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Fightable f = (Fightable) new Fighter();
    ๋˜๋Š”
Fightable f = new Fighter();

๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

void attack(Fightable f) {
	// ...
}

์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ–๋Š” ์˜๋ฏธ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
	public void attack(Fightable f) { /* ๋‚ด์šฉ ์ƒ๋žต */ }
}

์œ„์™€ ๊ฐ™์ด Fightable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Fighter ํด๋ž˜์Šค๊ฐ€ ์žˆ์„ ๋•Œ, attack ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Fighter ์ธ์Šคํ„ด์Šค๋ฅผ ๋…๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ attack(new Fighter())์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ดํƒ€์ž…์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Fightable method() {
	...
	Fighter f = new Fighter();
	return f;
  // => return new Fighter();
}

๋ฆฌํ„ดํƒ€์ž…์ด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒƒ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋ฌธ์žฅ์€ ์™ธ์šธ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” method()์˜ ๋ฆฌํ„ดํƒ€์ž…์ด Fightable ์ธํ„ฐํŽ˜์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ์˜ return๋ฌธ์—์„œ Fightable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Fighter ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

39. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ 

๐Ÿ’ก
- ๊ฐœ๋ฐœ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
- ํ‘œ์ค€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
- ์„œ๋กœ ๊ด€๊ณ„์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
- ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  1. ๊ฐœ๋ฐœ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    ์ผ๋‹จ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž‘์„ฑ๋˜๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์— ๊ด€๊ณ„์—†์ด ์„ ์–ธ๋ถ€๋งŒ ์•Œ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ๋‹ค๋ฅธ ํ•œ ์ชฝ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ํ•˜๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ž‘์„ฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ๋„ ์–‘์ชฝ์—์„œ ๋™์‹œ์— ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ํ‘œ์ค€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ํ‹€์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž‘์„ฑํ•œ ๋‹ค์Œ, ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ณ  ์ •ํ˜•ํ™”๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  1. ์„œ๋กœ ๊ด€๊ณ„์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

    ์„œ๋กœ ์ƒ์†๊ด€๊ณ„์— ์žˆ์ง€๋„ ์•Š๊ณ , ๊ฐ™์€ ์กฐ์ƒํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์„œ๋กœ ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๋„ ์—†๋Š” ํด๋ž˜์Šค๋“ค์—๊ฒŒ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

  1. ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ํด๋ž˜์Šค์˜ ์„ ์–ธ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๊ตฌํ˜„์— ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค๊ฐ„์— ์ง์ ‘์ ์ธ ๊ด€๊ณ„๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ„์ ‘์ ์ธ ๊ด€๊ณ„๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด, ํ•œ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ์ด ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

<์ธํ„ฐํŽ˜์ด์Šค>

๋‘ ๋Œ€์ƒ(๊ฐ์ฒด) ๊ฐ„์˜ ์—ฐ๊ฒฐ, ๋Œ€ํ™”, ์†Œํ†ต์„ ๋•๋Š” ์ค‘๊ฐ„ ์—ญํ• (๊ธฐ๊ณ„ ๊ป๋ฐ๊ธฐ)

ex) GUI(graphic user interface)

  • ์•Œ๋งน์ด๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ป๋ฐ๊ธฐ๊ฐ€ ๊ทธ๋Œ€๋กœ๋ฉด ์‚ฌ์šฉ์— ์•„๋ฌด ์ง€์žฅ ์—†๋‹ค.(๋ณ€๊ฒฝ์— ์œ ๋ฆฌ)
  • ์„ ์–ธ(์„ค๊ณ„)์™€ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

    โ‡’ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ์ ๋‹ค.(๋А์Šจํ•œ ๊ฒฐํ•ฉ)

<์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ >

  1. ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋‹จ์ถ•
    • ์„ ์–ธ๊ณผ ๊ตฌํ˜„์„ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  1. ๋ณ€๊ฒฝ์— ์œ ๋ฆฌํ•œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  1. ํ‘œ์ค€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

    EX) JDBC(์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ - ํ‘œ์ค€)

    DB๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ application์— ํฐ ๋ณ€๊ฒฝ์ด ํ•„์š”์—†๋‹ค.

class A {
    public void method(B b) {
        b.method();
    }
}

class B {
    public void method() {
        System.out.println("Bํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ");
    }
}

class C {
    public void method() {
        System.out.println("Cํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new B()); // A๊ฐ€ B๋ฅผ ์‚ฌ์šฉ(์˜์กด)
        a.method(new C()); // A๊ฐ€ B๋ฅผ ์‚ฌ์šฉ(์˜์กด)
    }
}



โ†’

interface I {
    public void method();
}

class A {
    public void method(I i) {
        i.method();
    }
}

class B implements I {
    public void method() {
        System.out.println("Bํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ");
    }
}

class C implements I {
    public void method() {
        System.out.println("Cํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ");
    }
}

public class InterfaceTest {
    public static void main(String[] args) {
        A a = new A();
        a.method(new B());
        a.method(new C());
    }
}

40. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ

์›๋ž˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋‚˜, JDK1.8๋ถ€ํ„ฐ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์™€ static ๋ฉ”์„œ๋“œ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. static ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค์™€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ „๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ•  ์ด์œ ๊ฐ€ ์—†์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋ก ๊ทœ์น™์„ ๋‹จ์ˆœํžˆ ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์— ์˜ˆ์™ธ๋ฅผ ๋‘์ง€ ์•Š์•˜๋‹ค.

์กฐ์ƒ ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ณ„ ์ผ์ด ์•„๋‹ˆ์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณดํ†ต ํฐ ์ผ์ด ์•„๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ธฐ์กด์˜ ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ œ์ผ ์ข‹๊ฒ ์ง€๋งŒ, ์•„๋ฌด๋ฆฌ ์„ค๊ณ„๋ฅผ ์ž˜ํ•ด๋„ ์–ธ์  ๊ฐ€ ๋ณ€๊ฒฝ์€ ๋ฐœ์ƒํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. JDK์˜ ์„ค๊ณ„์ž๋“ค์€ ๊ณ ์‹ฌ ๋์— ๋””ํดํŠธ ๋ฉ”์„œ๋“œ(default method)๋ผ๋Š” ๊ฒƒ์„ ๊ณ ์•ˆํ•ด๋‚ด์—ˆ๋‹ค. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์–ด๋„ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ์•ž์— ํ‚ค์›Œ๋“œ default๋ฅผ ๋ถ™์ด๋ฉฐ, ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๋ชธํ†ต {}์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ ์—ญ์‹œ ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ public์ด๋ฉฐ, ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

interface MyInterface {
	void method();
	void newMethod(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
}

โ†’

interface MyInterface {
	void method();
	defulat void newMethod();
}

์œ„์˜ ์™ผ์ชฝ๊ณผ ๊ฐ™์ด newMethod()๋ผ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ , ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ๊ธฐ์กด์˜ MyInterface๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ฆ‰, ์กฐ์ƒ ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€์‹ , ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ์กด์˜ ๋ฉ”์„œ๋“œ์™€ ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์–ด ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ ๊ฐ„์˜ ์ถฉ๋Œ
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•œ๋‹ค.
  1. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ์™€ ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๊ฐ„์˜ ์ถฉ๋Œ
    • ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์†๋˜๊ณ , ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์‹œ๋œ๋‹ค.

์œ„์˜ ๊ทœ์น™์ด ์™ธ์šฐ๊ธฐ ๊ท€์ฐฎ์œผ๋ฉด, ๊ทธ๋ƒฅ ํ•„์š”ํ•œ ์ชฝ์˜ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด๋ฒ„๋ฆฌ๋ฉด ๊ทธ๋งŒ์ด๋‹ค.

// ์˜ˆ์ œ 7-11
class Ex7_11 {
    public static void main(String[] args) {
        Child c = new Child();
        c.method1();
        c.method2();
        MyInterface.staticMethod();
        MyInterface2.staticMethod();
    }
}

class Child extends Parent implements MyInterface, MyInterface2 {
    public void method1() {
        System.out.println("method1() in Child"); // ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    }
}

class Parent {
    public void method2() {
        System.out.println("method2() in Parent");
    }
}

interface MyInterface {
    default void method1() {
        System.out.println("method1() in MyInterface");
    }

    default void method2() {
        System.out.println("method2() in MyInterface");
    }

    static void staticMethod() {
        System.out.println("staticMethod() in MyInterface");
    }
}

interface MyInterface2 {
    default void method1() {
        System.out.println("method1() in MyInterface2");
    }

    static void staticMethod() {
        System.out.println("staticMethod() in MyInterface2");
    }
}


Uploaded by N2T