[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item23. ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ผ.

2023. 3. 8. 14:21ใ†JAVA/Effective JAVA

728x90

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] 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๋กœ ์„ ์–ธํ•ด์„œ ๋ถˆํ•„์š”ํ•œ ํ•„๋“œ๊นŒ์ง€ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•ด์ค€๋‹ค. ์ฆ‰, ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ, ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ ์—ญ์‹œ ๋ชจ๋‘ ์‚ฌ๋ผ์กŒ๋‹ค! 

ํƒ€์ž…์ด ์˜๋ฏธ๋ณ„๋กœ ๋”ฐ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋ฅผ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ ํŠน์ • ์˜๋ฏธ๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 

 

 

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

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

ํ•œ๋ฒˆ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค..! 

๊ทธ๋ฆฌ๊ณ  ์ƒ์†์„ ์‚ฌ์šฉํ•œ๊ฑฐ๋‹ˆ๊นŒ.. ๋ฌธ์„œํ™”๋ฅผ ์ž˜ ํ•ด๋‘ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๊ธฐ์–ตํ•ด์ฃผ๊ธฐ !! 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90