์๋ฐ์ ์ ์ 7์ฅ: ๊ฐ์ฒด์งํฅ ๊ฐ๋
[ ์ถ์ฒ ]
์๋ฐ์ ์ ์:
https://product.kyobobook.co.kr/detail/S000001550352
์๋ฐ์ ์ ์ ์ ํ๋ธ:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
1. ์์
<์ ์>
๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ
<ํน์ง>
- ์ฝ๋๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ์ด ๋งค์ฐ ์ฉ์ดํ๋ค
โ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์ฝ๋์ ์ค๋ณต์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ ํฌ๊ฒ ๊ธฐ์ฌํ๋ค.
์๋ฐ์์ ์์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์๋ก ์์ฑํ๊ณ ์ ํ๋ ํด๋์ค์ ์ด๋ฆ ๋ค์ ์์๋ฐ๊ณ ์ ํ๋ ํด๋์ค์ ์ด๋ฆ์ ํค์๋ โextendsโ์ ํจ๊ป ์จ ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ด ๋ ํด๋์ค๋ ์๋ก ์์ ๊ด๊ณ์ ์๋ค๊ณ ํ๋ฉฐ, ์์ํด์ฃผ๋ ํด๋์ค๋ฅผ โ์กฐ์ ํด๋์ค'๋ผ ํ๊ณ ์์ ๋ฐ๋ ํด๋์ค๋ฅผ โ์์ ํด๋์คโ๋ผ ํ๋ค.
(๋จ, ์์ฑ์์ ์ด๊ธฐํ ๋ธ๋ญ์ ์์๋์ง ์๋๋ค.)
์์ ํด๋์ค์ ๋ฉค๋ฒ ๊ฐ์๋ ์กฐ์ ํด๋์ค๋ณด๋ค ํญ์ ๊ฐ๊ฑฐ๋ ๋ง๋ค.
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. ํด๋์ค ๊ฐ์ ๊ด๊ณ ๊ฒฐ์ ํ๊ธฐ
<์์> - 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 ํด๋์ค๋ก๋ถํฐ ์์๋ฐ๋๋กํ๋ค.
๋ง์ผ ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ ์์์ ๋ฐ๋๋ค๊ณ ํ๋๋ผ๋ ์์๊ณ์ธต๋๋ฅผ ๋ฐ๋ผ ์กฐ์ํด๋์ค, ์กฐ์ํด๋์ค์ ์กฐ์ํด๋์ค๋ฅผ ์ฐพ์ ์ฌ๋ผ๊ฐ๋ค๋ณด๋ฉด ๊ฒฐ๊ตญ ๋ง์ง๋ง ์ต์์ ์กฐ์์ 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. ์ค๋ฒ๋ผ์ด๋ฉ์ ์กฐ๊ฑด
- ์ ์ธ๋ถ๊ฐ ์กฐ์ ํด๋์ค์ ๋ฉ์๋์ ์ผ์นํด์ผ ํ๋ค.
- ์ ๊ทผ ์ ์ด์๋ ์กฐ์ ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ์ข์ ์ ์๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์กฐ์ โค ์์
- ์กฐ์ ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๋ง์ ์์ ์์ธ๋ฅผ ์ ์ธํ ์ ์๋ค.
์์ โค ์กฐ์
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)๋ ํด๋์ค, ๋ณ์ ๋๋ ๋ฉ์๋์ ์ ์ธ๋ถ์ ํจ๊ป ์ฌ์ฉ๋์ด ๋ถ๊ฐ์ ์ธ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ค.
์ ์ด์์ ์ข ๋ฅ๋ ํฌ๊ฒ ์ ๊ทผ ์ ์ด์์ ๊ทธ ์ธ์ ์ ์ด์๋ก ๋๋ ์ ์๋ค.
๊ทธ ์ธ static, final, abstract, native, transient, synchronized, volatile, strictfp
์ ์ด์๋ ํด๋์ค์ ๋ฉค๋ฒ๋ณ์์ ๋ฉ์๋์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ํ๋์ ๋์์ ๋ํด์ ์ฌ๋ฌ ์ ์ด์๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
18. 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 ํด๋์ค์ ๋ํ์ ์ธ ์๋ String๊ณผ Math์ด๋ค.
final class FinalTest { // ์กฐ์์ด ๋ ์ ์๋ ํด๋์ค
final int MAX_SIZE = 10; // ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฉค๋ฒ๋ณ์(์์)
final void getMaxSize() { // ์ค๋ฒ๋ผ๋ฉํ ์ ์๋ ๋ฉ์๋(๋ณ๊ฒฝ๋ถ๊ฐ)
final int LV = MAX_SIZE; // ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์ง์ญ๋ณ์(์์)
return MAX_SIZE;
}
}
20. 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 ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค. ์ฃผ๋ก ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉ๋๋ฉฐ, 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 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. ์ธํฐํ์ด์ค์ ๊ตฌํ
- ๋ง์ผ ๊ตฌํํ๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ค ์ผ๋ถ๋ง ๊ตฌํ ์, ์ถ์ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค.
์ธํฐํ์ด์ค๋ ์ถ์ํด๋์ค์ฒ๋ผ ๊ทธ ์์ฒด๋ก๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
์ถ์ํด๋์ค๊ฐ ์์์ ํตํด ์ถ์๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ, ์ธํฐํ์ด์ค๋ ์์ ์ ์ ์๋ ์ถ์๋ฉ์๋์ ๋ชธํต์ ๋ง๋ค์ด์ฃผ๋ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํด๋์ค๋ ํ์ฅํ๋ค๋ ์๋ฏธ์ ํค์๋ โ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. ์ธํฐํ์ด์ค์ ์ฅ์
- ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์๋ก ๊ด๊ณ์๋ ํด๋์ค๋ค์๊ฒ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์๋ค.
- ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ๊ฐ๋ฐ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์๋ค.
์ผ๋จ ์ธํฐํ์ด์ค๊ฐ ์์ฑ๋๋ฉด, ์ด๋ฅผ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ชฝ์์๋ ๋ฉ์๋์ ๋ด์ฉ์ ๊ด๊ณ์์ด ์ ์ธ๋ถ๋ง ์๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋์์ ๋ค๋ฅธ ํ ์ชฝ์์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์์ฑํ๊ฒ ํ๋ฉด, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๊ฐ ์์ฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ ์์ชฝ์์ ๋์์ ๊ฐ๋ฐ์ ์งํํ ์ ์๋ค.
- ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
ํ๋ก์ ํธ์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํ์ ์ธํฐํ์ด์ค๋ก ์์ฑํ ๋ค์, ๊ฐ๋ฐ์๋ค์๊ฒ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋๋ก ํจ์ผ๋ก์จ ๋ณด๋ค ์ผ๊ด๋๊ณ ์ ํํ๋ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ก ๊ด๊ณ์๋ ํด๋์ค๋ค์๊ฒ ๊ด๊ณ๋ฅผ ๋งบ์ด ์ค ์ ์๋ค.
์๋ก ์์๊ด๊ณ์ ์์ง๋ ์๊ณ , ๊ฐ์ ์กฐ์ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์๋ก ์๋ฌด๋ฐ ๊ด๊ณ๋ ์๋ ํด๋์ค๋ค์๊ฒ ํ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ณตํต์ ์ผ๋ก ๊ตฌํํ๋๋ก ํจ์ผ๋ก์จ ๊ด๊ณ๋ฅผ ๋งบ์ด์ค ์ ์๋ค.
- ๋
๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ฉด ํด๋์ค์ ์ ์ธ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ํด๋์ค์ ํด๋์ค๊ฐ์ ์ง์ ์ ์ธ ๊ด๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ๊ฐ์ ์ ์ธ ๊ด๊ณ๋ก ๋ณ๊ฒฝํ๋ฉด, ํ ํด๋์ค์ ๋ณ๊ฒฝ์ด ๊ด๋ จ๋ ๋ค๋ฅธ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๋ ๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
<์ธํฐํ์ด์ค>
๋ ๋์(๊ฐ์ฒด) ๊ฐ์ ์ฐ๊ฒฐ, ๋ํ, ์ํต์ ๋๋ ์ค๊ฐ ์ญํ (๊ธฐ๊ณ ๊ป๋ฐ๊ธฐ)
ex) GUI(graphic user interface)
- ์๋งน์ด๊ฐ ๋ฐ๋์ด๋ ๊ป๋ฐ๊ธฐ๊ฐ ๊ทธ๋๋ก๋ฉด ์ฌ์ฉ์ ์๋ฌด ์ง์ฅ ์๋ค.(๋ณ๊ฒฝ์ ์ ๋ฆฌ)
- ์ ์ธ(์ค๊ณ)์ ๊ตฌํ์ ๋ถ๋ฆฌ์ํฌ ์ ์๋ค.
โ ๋ณ๊ฒฝ์ฌํญ์ด ์์ด๋ ์์ ๋ฒ์๊ฐ ์ ๋ค.(๋์จํ ๊ฒฐํฉ)
<์ธํฐํ์ด์ค์ ์ฅ์ >
- ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ
- ์ ์ธ๊ณผ ๊ตฌํ์ ๋ค๋ฅธ ์์น์์ ํ๊ธฐ ๋๋ฌธ
- ๋ณ๊ฒฝ์ ์ ๋ฆฌํ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ๋ค.
- ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
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๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค. ์ฆ, ์กฐ์ ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๊ฒ๊ณผ ๋์ผํด์ง๋ ๊ฒ์ด๋ค.
๋์ , ์๋ก ์ถ๊ฐ๋ ๋ํดํธ ๋ฉ์๋๊ฐ ๊ธฐ์กด์ ๋ฉ์๋์ ์ด๋ฆ์ด ์ค๋ณต๋์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ์ด ์ถฉ๋์ ํด๊ฒฐํ๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฌ๋ฌ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋ฉ์๋ ๊ฐ์ ์ถฉ๋
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์์ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํ๋ค.
- ๋ํดํธ ๋ฉ์๋์ ์กฐ์ ํด๋์ค์ ๋ฉ์๋ ๊ฐ์ ์ถฉ๋
- ์กฐ์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์์๋๊ณ , ๋ํดํธ ๋ฉ์๋๋ ๋ฌด์๋๋ค.
์์ ๊ท์น์ด ์ธ์ฐ๊ธฐ ๊ท์ฐฎ์ผ๋ฉด, ๊ทธ๋ฅ ํ์ํ ์ชฝ์ ๋ฉ์๋์ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ ํด๋ฒ๋ฆฌ๋ฉด ๊ทธ๋ง์ด๋ค.
// ์์ 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