๐ก ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ์์ง๋๊ฐ ๋ฎ๋ค. ์์ง๋ ๋์ ์ฌ๋ฌ ํด๋์ค๋ก ์ชผ๊ฐ์ผ ํ๋ค. ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ์์์ ์ฌ์ฉํด ์๋ธํ์ ์ผ๋ก ๊ตฌํํ๋ผ.
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค
ํ๊ทธ๋, ๋ ๊ฐ์ง ์ด์์ ์๋ฏธ๋ฅผ ํํํ๋ ํ๋๊ทธ์ด๋ค. ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ํ์ฌ ํํํ๋ ์๋ฏธ๋ฅผ ํ๊ทธ ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ํด๋์ค์ด๋ค. ๋ค์์ ์๊ณผ ์ฌ๊ฐํ์ ํํํ๋ ํด๋์ค์ด๋ค.
// Tagged class - vastly inferior to a class hierarchy! (Page 109)
public class Figure {
enum Shape { RECTANGLE, CIRCLE };
// Tag field - the shape of this figure
final Shape shape;
// These fields are used only if shape is RECTANGLE
double length;
double width;
// This field is used only if shape is CIRCLE
double radius;
// Constructor for circle
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// Constructor for rectangle
Figure(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch(shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}
}
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค์ ํต์ฌ์ ์ธ ๋ฌธ์ ์ ์ ์์ง๋๊ฐ ๋ฎ๋ค๋ ๊ฒ์ด๋ค. Figure ํด๋์ค๋ ์๊ณผ ์ฌ๊ฐํ์ด ๋์์ ๋ ์ ์์ผ๋ฏ๋ก, ์์ผ ๋ ํ์ํ ํ๋์ ๋ฉ์๋, ์ฌ๊ฐํ์ผ ๋ ํ์ํ ํ๋์ ๋ฉ์๋๋ฅผ ๋๋ค ๊ฐ์ง๊ณ ์๋ค. ํ๊ทธ๋ฅผ ๋ํ๋ด๋ ํ๋๊ทธ ํ๋๊ฐ ํด๋์ค ๋ฉค๋ฒ๋ก ํฌํจ๋๋ค๋ ๊ฒ์ ํด๋์ค์ ์์ง๋๊ฐ ๋ฎ์์ง ๊ฒ์์ ์๋ฆฌ๋ ์๊ทธ๋์ด๋ฏ๋ก ๊ฒฝ๊ณํด์ผํ๋ค.
์์ง๋๊ฐ ๋ฎ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด๊ฑฐํ์ ์ ์ธ, ํ๊ทธ ํ๋, switch ๋ฌธ ๋ฑ ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง๋ค.
- ์ฌ๋ฌ ๊ตฌํ์ด ํ ํด๋์ค์ ํผํฉ๋์ด์์ด ๊ฐ๋ ์ฑ์ด ๋์๋ค.
- ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ํ ์ฝ๋๊ฐ ์ธ์ ๋ ํจ๊ป ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ฌ์ฉํ๋ค.
- ํ๋๋ฅผ final๋ก ์ ์ธํ๋ ค๋ฉด ํด๋น ์๋ฏธ์ ์ฐ์ด์ง ์๋ ํ๋๊น์ง ์์ฑ์์์ ์ด๊ธฐํํด์ผํ๋ค. ์๋ฑํ ํ๋๋ฅผ ์ด๊ธฐํํด๋ ๋ฐํ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๋๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ค. switch๋ฌธ์์ ํ๋๋ผ๋ ๋น ๋จ๋ฆฌ๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋๋ค.
์์ง๋๋ฅผ ๋์ด๋ ๋ฐฉ๋ฒ
ํด๋์ค์ ํ๊ทธ๊ฐ ๋ค์ด๊ฐ ์ด์ ๋ ๋์ผํ ํ์ (Figure)์ ์ฌ์ฉํ๋ฉด์๋ ๋ค์ํ ์๋ฏธ์ ๊ฐ์ฒด(Circle, Rectangle ๋ฑ)์ ๋ง๋ค๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค.
๋คํํ ์๋ฐ์ ๊ฐ์ ๊ฐ์ฒด ์งํฅ ์ธ์ด๋ ํ์ ํ๋๋ก ๋ค์ํ ์๋ฏธ์ ๊ฐ์ฒด๋ฅผ ํํํ๋ ์๋จ์ ์ ๊ณตํ๋ค. ๋ฐ๋ก ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ ์๋ธํ์ดํ์ด๋ค.
ํ์ ๊ณ์ธต
13 ์๋ธํด๋์ฑ๊ณผ ์๋ธํ์ดํ (์ค๋ธ์ ํธ์์ ๋ดค๋ ๋ด์ฉ์ด๋ค)
13 ์๋ธํด๋์ฑ๊ณผ ์๋ธํ์ดํ
๋ค์ด๊ฐ๋ฉฐ ํํ ๊ฐ์ฒด์งํฅ ์ปค๋ฎค๋ํฐ์์๋ ์์์ ์ฉ๋๋ฅผ ๋๊ฐ์ง๋ก ๋ฐ๋ผ๋ณด๊ณ ์๋ค. 1. ํ์ ๊ณ์ธต์ ๊ตฌํ (๋ถ๋ชจํด๋์ค๋ ์์ํด๋์ค์ ์ผ๋ฐํ์ด๊ณ ์์ ํด๋์ค๋ ๋ถ๋ชจํด๋์ค์ ํน์ํ๋ค.) 2. ์ฝ๋
hwannny.tistory.com
ํ์ ๊ณ์ธต์ ํด๋์ค๋ค์ ๊ณ์ธต์ ์ธ ๊ด๊ณ๋ฅผ ๋ํ๋ธ๋ค. ํ์ ๊ณ์ธต์ A is-a B ๊ด๊ณ๋ฅผ ํตํด ํํ๋๋ค. ์ํผ ํ์ ์ A, ์๋ธ ํ์ ์ B๋ก ์ ์ํ๊ณ ์ด ๋์ ํ์ ์ด ๊ด๊ณ๋ฅผ ๋งบ๋๋ก ํ๋ ์์ ์ด ์๋ธ ํ์ดํ์ด๋ค.
is-a ๊ด๊ณ๋ฅผ ํ๋จํ ๋, ๋จ์ํ ์ดํ์ ์ผ๋ก ๋ชจ๋ธ๋งํ๋ฉด ์๋๋ค. ์๋ฅผ ๋ค์ด ์์ ํญ๊ท์ is-a ๊ด๊ณ๋ฅผ ๋ง์กฑํ ์ ์๋ค. ํญ๊ท์ ์๋ค. ์๋ ๋ ์ ์๋ค. ํ์ง๋ง ํญ๊ท์ ๋ ์ ์๋ค.
is-a ๊ด๊ณ๋ฅผ ํ๋จํ ๋๋ ํ๋ ํธํ์ฑ๊ณผ ๋์ฒด ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด์ผํ๋ค. ์๋ธํ์ ์ด ์ํผํ์ ์ด ํ๋ ๋ชจ๋ ํ๋์ ๋์ผํ๊ฒ ํ ์ ์๊ณ , ์ํผํ์ ์ ์ด๋ ์๋ธํ์ ์ผ๋ก ๋์ฒดํ๋๋ผ๋ ์์คํ ์ด ๋ฌธ์ ์์ด ๋์ํ ๊ฒ์์ ๋ณด์ฅํด์ผํ๋ค. (๋ฆฌ์ค์ฝํ ์นํ ์์น์ ์์ธํ ๋์์๋ค, ๊ตฌํ๋ฌธ์ ์์ธ ๋ฑ๋ ๊ฒ์ ๋์ฒดํ ์ ์์์ ๋ปํจ)
์์ ์์์์ ํญ๊ท์ ๋ ์ ์์ผ๋ฏ๋ก, ์์ ํญ๊ท์ ์๋ธ ํ์ ์ด ๋ ์ ์๋ค. ์๋ธ ํ์ ์ด ๋๋ ค๋ฉด ๋๋ ํ๋์ ์๊ฐ ์๋ ํญ๊ท๊ณผ ๊ฐ์ ์๋ธํ์ ์ผ๋ก ์ฎ๊ฒจ์ผํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์์ ํญ๊ท์ ์๋ธํ์ ์ด ๋๋ค.
ํน์ ๋๋ ํ๋์ ํ๋ ฅ์ผ๋ก ๊ฐ์ฃผ, ์ธํฐํ์ด์ค๋ก ๊ตฌํํ์ฌ ์์ ํ์ ํ์ ์ด ์ ํ์ ์ผ๋ก ๊ตฌํํ๋๋ก ํ๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์์ ํญ๊ท์ ์๋ธ ํ์ ์ ๊ด๊ณ๊ฐ ์๋๋ค. (๋น๋ํ ์ธํฐํ์ด์ค์ ๋จ์ ์ ํด๊ฒฐํ๋ ISP)
์๋ธ ํ์ดํ์ ๊ตฌํ
์๋ธ ํ์ดํ์ ์์์ผ๋ก ๊ตฌํํ๋ค. ์ํผ ํ์ ์ ๋ถ๋ชจ ํด๋์ค, ์๋ธ ํ์ ์ ์์ ํด๋์ค๊ฐ ๋๋ค.
๋ถ๋ชจ ํด๋์ค
- ๋ชจ๋ ํด๋์ค์์ ์ฌ์ฉํ๋ ๊ณตํต ํ๋
- ๋์ผํ ๊ตฌํ์ ๊ณต์ ํ๋ ์ผ๋ฐ ๋ฉ์๋
- ๋คํ์ ์ผ๋ก ๋์ํ๋ ์ถ์ ๋ฉ์๋
์์ ํด๋์ค
- ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์๋ฐ์ ์ถ์ ๋ฉ์๋ ๊ตฌํ
- ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๋ฐ์ดํฐ ํ๋
Figure์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ถ๋ชจ ํด๋์ค์๋ ๋คํ์ ์ผ๋ก ๋์ํ๋(switch๋ฌธ์ ๊ตฌํ๋๋) area ์ถ์ ๋ฉ์๋๊ฐ ๋จ๋๋ค. ๋๋จธ์ง ํ๋์ area ๊ตฌํ์ Figure์ ์์๋ฐ์ Rectangle๊ณผ Circle์์ ๊ตฌํํ๋ค.
public abstract class Figure {
abstract double area();
}
public class Circle extends Figure {
final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
public class Rectangle extends Figure {
final double length;
final double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
๋ฆฌํฉํฐ๋ง ์ ํ์ ์์ง๋๋ฅผ ๋น๊ตํด๋ณด์. ํ๊ทธ ํ๋๋ฅผ ๊ฐ์ง๋ Figure์ ์๊ณผ ์ฌ๊ฐํ์ด ๋์์ ๋๊ธฐ ์ํด ๋ง์ ๊ตฌํ์ ๊ฐ์ง๊ณ ์์๊ณ , ํ๋ ์์์๋ ๋ถํ์ํ switch๋ฌธ์ด ์์๋ค. ๊ฐ๋ ์ฑ์ด ๋ณ๋ก๊ณ ํ์ ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๊ตฌํ์ด ๋ฐ๋์ด์ผํ๋ค. ํ๋์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋ธ ํ์ดํํด์ ๋ง๋ Rectangle๊ณผ Circle์ ๊ฐ์์ ํ๋๊ณผ ์ฑ ์์๋ง ์ง์คํ๋ฏ๋ก ์์ง๋๊ฐ ๋๋ค. ์๋ธ ํ์ ์ผ๋ก ๋ง๋ค ์ ์์๋ ์ด์ ๋ Rectangle๊ณผ Circle์ด ๋์ผํ ํ๋์ ๊ฐ์ง๋ฉฐ ๋์ฒดํ ์ ์๋ ์ํผ ํ์ ์ ๋์ถํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ๊ฐํ์ ํ์ ํ์ ์ธ ์ ์ฌ๊ฐํ์ ๊ตฌํํ๋ค๋ฉด Rectangle์ ์์ํ๋ค. ์ด๋ ์ ์ฌ๊ฐํ์ด ์ฌ๊ฐํ์ ํ์ ํ์ ์ด๋ผ๋ ๊ฒ์ ์ฌ๊ฐํ๊ณผ ๋์ผํ ํ๋์ธ area๋ฅผ ์ํํ ์ ์๊ณ Rectangle์ด ์ฌ์ฉ๋๋ ๊ณณ์ Square์ ์ฌ์ฉํด๋ ์ ์์ ์ผ๋ก ์ํ๋๋ค๋ ์๋ฏธ์ด๋ค.
public class Square extends Rectangle {
public Square(double side) {
super(side, side);
}
}
๋ฒ์ธ : ์๋ธ ํด๋์ฑ
์๋ธ ํด๋์ฑ์ด๋ ๋ค๋ฅธ ํด๋์ค์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์๋ธ ํด๋์ฑ์ ๊ตฌํ์ด ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ฏ๋ก, ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์์์ ์ฌ์ฉํ๋ฉด ์๋๋ค. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ค๋ฉด ํฉ์ฑ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ด๋ค. ์์์ ์๋ธ ํ์ดํ์ ์ ์ ํ๋ค.
'JAVA > Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Item27. ๋น๊ฒ์ฌ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ๋ผ (0) | 2023.07.11 |
---|---|
Item24. ๋ฉค๋ฒ ํด๋์ค๋ ๋๋๋ก static์ผ๋ก ๋ง๋ค๋ผ (0) | 2023.06.29 |
Item18. ์์๋ณด๋ค๋ ์ปดํฌ์ง์ ์ ์ฌ์ฉํ๋ผ (1) | 2023.05.29 |
Item10. equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ (1) | 2023.05.29 |
Item8. finalizer์ cleaner ์ฌ์ฉ์ ํผํ๋ผ (1) | 2023.05.29 |