2023. 3. 8. 14:21ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item23. ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ผ.
๋ ๊ฐ์ง ์ด์์ ์๋ฏธ๋ฅผ ํํํ ์ ์์ผ๋ฉฐ, ๊ทธ์ค ํ์ฌ ํํํ๋ ์๋ฏธ๋ฅผ ํ๊ทธ ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ํด๋์ค๋ฅผ ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ผ๊ณ ํ๋ค.
public class Figure {
enum Shape {RECTANGLE, CIRCLE, SQUARE}
// ํ๊ทธ ํ๋ - ํ์ฌ ๋ชจ์์ ๋ํ๋ธ๋ค.
final Shape shape;
// ๋ค์ ํ๋๋ค์ ๋ชจ์์ด ์ฌ๊ฐํ์ผ ๋๋ง ์ฐ์ธ๋ค.
double length;
double width;
// ๋ค์ ํ๋๋ ๋ชจ์์ด ์์ผ๋๋ง ์ฌ์ฉํ๋ค.
double radius;
// ์์ฉ ์์ฑ์
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// ์ฌ๊ฐํ์ฉ ์์ฑ์
Figure(double length, double width) {
if (this.length == this.length) {
shape = Shape.SQUARE;
}else {
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);
}
}
}
์ด๋ ๊ฒ ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด..
Shape์ด CIRCLE์ธ ๊ฒฝ์ฐ์๋ length, width ๋ ํ์์๋๋ฐ ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํ๊ณ , RECTANGLE ์ธ ๊ฒฝ์ฐ์๋ radius๊ฐ ํ์์์ง๋ง ์ด๊ธฐํ๋ ํด์ผํ๊ณ ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
์ฆ, ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง์์ง๊ณ , ์ง๊ธ์ ์ฝ๋๊ฐ ์งง์ ์ฝ๋ ๋ณด๋๋ฐ ๊ทธ๋ฆฌ ์ค๋ ๊ฑธ๋ฆฌ์ง ์์ง๋ง ์ด๊ฒ ๋ง์์ง๋ค๋ฉด ๊ฐ๋ ์ฑ ์ญ์ ๋๋น ์ ธ ๋์ค์ ์ฝ๋ ํ์ ์ด ํ๋ค์ด์ง๋ค.
๋ํ ํ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด ๋ค๊ณ ์์ด์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์์ ์ฒ๋ผ final๋ก ์ ์ธํ๋ฉด ๋ถํ์ํ ์ฝ๋๊น์ง ์ด๊ธฐํ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ฑฐ๋ก์ ์ง๋ค!!
๊ทธ๋ฆฌ๊ณ ์ธ์คํด์ค๋ง์ผ๋ก๋ ํ์ฌ ๋ํ๋ด๋ ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ์ ์ ๊ธธ์ด ์๊ธฐ๋ ํ๋ค.
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค ๋จ์
- ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง๋ค.
: ์ด๊ฑฐ ํ์ ์ ์ธ, ํ๊ทธ ํ๋, switch๋ฌธ ๋ฑ ์ธ๋ฐ์๋ ์ฝ๋๊ฐ ๋ง๋ค.
- ๊ฐ๋ ์ฑ์ด ๋์๋ค.
: ์ฌ๋ฌ ๊ตฌํ์ด ํ ํด๋์ค์ ํผํฉ๋์ด ์์ด์ ๊ฐ๋ ์์ด ์์ข๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ง๋ค.
: ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ํด์ ์ฝ๋๋ ์ธ์ ๋ ํจ๊ป ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
- ํ๋๋ค์ final ๋ก ์ ์ธํ๋ ค๋ฉด ํด๋น ์๋ฏธ์ ์ฐ์ด์ง ์๋ ํ๋๋ค๊น์ง ์์ฑ์์์ ์ด๊ธฐํ๋ฅผ ํด์ผํ๋๋ฐ ๊ทธ๋ฌ๋ฉด ์ฐ์ง ์๋ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋ถํ์ํ ์ฝ๋๊ฐ ๋์ด๋๋ค.
- ๋ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ฝ๋๋ฅผ ๋ ์์ ํด์ผ ํ๋ค.
: ์์ ์์๋ก ์ค๋ฉด ์๋ก์ด ์๋ฏธ๋ฅผ ์ถ๊ฐํ๋ค๊ณ ํ๋ฉด ๋ชจ๋ switch๋ฌธ์ ์ฐพ์ ์ ์๋ฏธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋๋ฐ, ์ด๋ ํ๋๋ผ๋ ๋น ๋จ๋ฆฌ๋ฉด ์ญ์ ๋ฐํ์๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ ์ฅํฉํ๊ณ , ์ค๋ฅ๋ฅผ ๋ด๊ธฐ ์ฝ๊ณ , ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ณด๋ค๋ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ณํํ๋ฉด ์์ ๋จ์ ์ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ค!!
(๋ฌผ๋ก ์์์ ํ์ง๋ง๋ผ๊ณ ๊ทธ ์ item๋ค์์ ์ฃผ๊ตฌ์ฅ์ฐฝ ์๊ธฐํ์ง๋ง ใ )
public abstract class Figure {
abstract double area();
}
ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ง๋ค๊ธฐ ์ํด์ ์ฐ์ ๊ฐ์ฅ ๋จผ์ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฃจํธ root ๊ฐ ๋ ์ถ์ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ํ๊ทธ ๊ฐ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ก ์ ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๊ทธ ๊ฐ์ ์๊ด์์ด ๋์์ด ์ผ์ ํ ๋ฉ์๋๋ค์ ๋ฃจํธ ํด๋์ค์ ์ผ๋ฐ ๋ฉ์๋๋ก ์ถ๊ฐํด์ค๋ค.
Figure๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ง๋ค๊ณ ๋๋น ๊ตฌํ๋ ๋ฉ์๋๋ง ๋ ๋๋ค.
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;
}
}
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 Square extends Rectangle{
public Square(double side) {
super(side, side);
}
}
๋ฃจํธ ํด๋์ค๋ฅผ ํ์ฅํ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์๋ฏธ๋ณ๋ก ํ๋์ฉ ์ ์ํ๋๋ฐ ์ฌ๊ธฐ์ Figure๋ฅผ ํ์ฅํ Circle ์ ํด๋์ค์ Rectangle ์ฌ๊ฐํ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํ์ ํฌ๋์ค์๋ ๊ฐ์์ ์๋ฏธ์ ํด๋นํ๋ ๋ฐ์ดํฐ ํ๋๋ค์ ๋ฃ๋๋ค.
์ด๋ฐ์์ผ๋ก Figure๋ฅผ ์์ํด์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง๊ณ , final๋ก ์ ์ธํด์ ๋ถํ์ํ ํ๋๊น์ง ์ด๊ธฐํํ์ง ์์๋ ๋๋ค.
ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ ํ๊ทธ ๋ฌ๋ฆฐ ํด๋์ค์ ๋จ์ ์ ๋ชจ๋ ํด๊ฒฐํด์ค๋ค. ์ฆ, ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๋ช ํํ๋ฉฐ, ์ธ๋ฐ์๋ ์ฝ๋ ์ญ์ ๋ชจ๋ ์ฌ๋ผ์ก๋ค!
ํ์ ์ด ์๋ฏธ๋ณ๋ก ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ณ์์ ์๋ฏธ๋ฅผ ๋ช ์ํ๊ฑฐ๋ ์ ํํ ์ ์๊ณ , ๋ ํน์ ์๋ฏธ๋ง ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ค.
๐ฅ ํ์ฌ์์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ ํด๋์ค์ ์ฌ์ฉํ์ง ์๋ ํ๋๋ฅผ ๊ณ์ํด์ ์ ์ ์ถ๊ฐํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ดค๊ณ , ์ ์ ๊ทธ ํด๋์ค๋ฅผ ๋ณด๋ฉด์ ์ด๊ฒ ๋ญ์ง? ํ๋ ๊ฒฝ์ฐ๊ฐ ๋์ด๋๋๊ฑธ ๊ฒฝํํ ์ ์ด ์๋ค.
์ฌ์ค ๋ฆฌํฉํ ๋งํ๊ธฐ์ ์๊ฐ์ ์ผ๋ก ๋ถ์กฑํ๋ค, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ฌ๋ ์ฝ๋๋ฅผ ๊ฑด๋ค๋ฉด ์ข ๊ทธ๋ ์ง ์๋? ์ถ์ด์ ๊ทธ๋ฅ ๋์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ..
ํ๋ฒ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค..!
๊ทธ๋ฆฌ๊ณ ์์์ ์ฌ์ฉํ๊ฑฐ๋๊น.. ๋ฌธ์ํ๋ฅผ ์ ํด๋ฌ์ผ ํ๋ค๋ ๊ฒ๋ ๊ธฐ์ตํด์ฃผ๊ธฐ !!