item 23 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค ๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ผ.
์๋ ์ฝ๋๋ ๋ ๊ฐ์ง ์ด์์ ์๋ฏธ๋ฅผ ํํํ ์ ์์ผ๋ฉฐ ํ์ฌ ํํํ๋ ค๋ ์๋ฏธ๋ฅผ ํ๊ทธ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ํด๋์ค์ด๋ค.
class Figure {
enum Shape { RECTANGLE, CIRCLE };
final Shape shape; // ํ๊ทธ ํ๋ - ํ์ฌ ๋ชจ์์ ๋ํ๋ธ๋ค.
// ๋ค์ ํ๋๋ค์ ๋ชจ์์ด ์ฌ๊ฐํ(RECTANGLE)์ผ ๋๋ง ์ฐ์ธ๋ค.
double length;
double width;
// ๋ค์ ํ๋๋ ๋ชจ์์ด ์(CIRCLE)์ผ ๋๋ง ์ฐ์ธ๋ค.
double radius;
// ์์ฉ ์์ฑ์
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// ์ฌ๊ฐํ์ฉ ์์ฑ์
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 ํด๋์ค๋ฅผ ์ฌ์ ์ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
@Override double area() { return Math.PI * (radius * radius); }
}
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override double area() { return length * width; }
}
์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๋ช ํ ํด์ก์ผ๋ฉฐ, ์ธ๋ฐ์๋ ์ฝ๋๋ค์ด ๋ชจ๋ ์ฌ๋ผ์ก๋ค. ๋ํ ํ์ ์ฌ์ด์ ์์ฐ์ค๋ฌ์ด ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ์ ์ฌ๊ฐํ์ ์ ์ํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
}
์ ๋ฆฌ
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ์จ์ผํ๋ ์ํฉ์ ๊ฑฐ์ ์๋ค. ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ํ๊ทธ ํ๋๊ฐ ๋ฑ์ฅํ๋ค๋ฉด
ํ๊ทธ๋ฅผ ์์ ๊ณ ๊ณ์ธต๊ตฌ์กฐ๋ก ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด์.