Java

[Java] ๊ณต๋ณ€์„ฑ A/S (feat. ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ)

God Korea 2024. 8. 5. 21:45
728x90

๐Ÿคช ์•„์ง๋„ ์–ด๋ ค์šด ๊ณต๋ณ€์„ฑ

22๋…„๋„ 9์›”์ฏค ์“ด ๊ธ€์ด ์žˆ๋‹ค.

๋ฐ”๋กœ Covariant(๊ณต๋ณ€์„ฑ)์— ๊ด€ํ•œ ๊ธ€์ด๋‹ค. ๊ธฐ์กด์— ์ผ๋˜ ๊ธ€์„ ๋ณด๊ฐ•ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ธ€์„ ์“ฐ๊ฒŒ ๋๋‹ค.

๊ธฐ์กด๊ธ€
2022.09.02 - [Java] - [Java] Covariant(๊ณต๋ณ€์„ฑ)์— ๊ด€ํ•œ ๊ฐ„๋‹จํ•œ ์ด์•ผ๊ธฐ

 

[Java] Covariant(๊ณต๋ณ€์„ฑ)์— ๊ด€ํ•œ ๊ฐ„๋‹จํ•œ ์ด์•ผ๊ธฐ

๐Ÿ“ ๊ฐ์ฒด์ง€ํ–ฅ 5์›์น™(SOLID) SOLID๋Š” ๊ฐ์ฒด์ง€ํ–ฅ 5์›์น™์˜ ๋‘์Œ์„ ๋”ฐ์„œ ๋งŒ๋“  ๋ง์ด๋‹ค. ๊ฐ๊ฐ ๋‚˜์—ดํ•˜์ž๋ฉด, SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™) OCP(๊ฐœ๋ฐฉ ํ์‡„ ์›์น™) LSP(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™) ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™) DIP(์˜์กด

codari.tistory.com

 

๊ฐ์ฒด์ง€ํ–ฅ 5์›์น™ ์ค‘ LSP์— ๊ด€ํ•œ ๊ธ€์„ ์“ฐ๋‹ค๊ฐ€ ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

 ๋˜ํ•œ, three๋ฉ”์„œ๋“œ๋ฅผ ๋ณด๋ฉด ๋ถ„๋ช…ํžˆ B ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ์™œ J๊ฐ€ ์•„๋‹Œ I๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ์„ฑ์ž๋ณด๋‹ค ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋” ์ค‘์š”ํ•œ๋ฐ, ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด A์ด๊ธฐ ๋•Œ๋ฌธ์— A์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๊ทธ๋Ÿฐ๋ฐ, ํ”„๋ฆฐํŠธ ๊ฐ’์—๋Š” B๊ฐ€ ์ฐํžˆ๋Š”๋ฐ, ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค. ๋‹ค๋งŒ, ํ˜„์žฌ ๋‚˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’๊ณผ ๋‹จ์ˆœํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ฆฐํŠธ๋ฌธ์€ ์„œ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค.) ps. ํ˜น์‹œ ์ •ํ™•ํ•œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ทจ์†Œ์„ ์ด ๊ทธ์–ด์ง„ ๋ถ€๋ถ„์ด๋‹ค.

์ด ๋‹น์‹œ ๊ธ€์„ ์“ธ ๋•Œ, ๊ณต๋ณ€์„ฑ๊ณผ ์—ญ๊ณต๋ณ€์„ฑ์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋‚ด ๋จธ๋ฆฌ ์†์—์„œ ๋ง‰ ๊ตด๋ ธ๋˜ ์˜ˆ์ œ์˜€๋Š”๋ฐ, ์‹ค์ œ๋กœ ๋ฆฌํ„ด๋ฌธ์ด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์„œ ์˜์•„ํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

์˜ค๋žœ๋งŒ์— ์˜› ๊ธ€์„ ๋ณด๋‹ˆ ์ฐธ ์—ด์‹ฌํžˆ ์‚ด๋ ค๊ณ  ํ–ˆ๊ตฌ๋‚˜ ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค.

๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ ์ทจ์†Œ์„ ์ด ๊ทธ์–ด์ง„ ๋ถ€๋ถ„์ด ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์•Œ์•˜๋‹ค. ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์ธ๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋„ˆ๋ฌด๋‚˜ ๋‹จ์ˆœํ•ด์„œ ํ—ˆํƒˆํ•œ ์›ƒ์Œ์ด ๋‚œ๋‹ค.

๊ธ€์˜ ์ œ๋ชฉ์€ ๊ณต๋ณ€์„ฑ A/S์ด์ง€๋งŒ, ์—ฌ๊ธฐ์„  ๊ณต๋ณ€์„ฑ๊ณผ ์—ญ๊ณต๋ณ€์„ฑ์˜ ๊ฐœ๋…์€ ๋ฐฐ์ œํ•˜๊ฒ ๋‹ค. ์ฆ‰, ๋ณธ ๊ธ€์— ์žˆ๋Š” I์™€ Jํƒ€์ž…์˜ ํด๋ž˜์Šค๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋ง์ด๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด Bํด๋ž˜์Šค๋กœ ์ •์˜๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

public class B extends A{
    J method() {
        System.out.println("B");
        return new J();
    }

	// ์ค‘๋žต ...

    public static J three() {
        A a = new B();
        return a.method(); // return I
    }

	// ์ค‘๋žต ...

    public static void main(String[] args) {
        B.one();
        B.two();
        B.three();
        B.four();
    }
}

์œ„์™€ ๊ฐ™์ด Aํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๊ณ  Bํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ, B ํด๋ž˜์Šค์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๋Š” method() ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด์„œ, ํ”„๋ฆฐํŠธ๋ฌธ์—๋Š” "B"๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์ฆ‰, ํƒ€์ž…์ด ๋ถ€๋ชจ์ธ A๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค ํ•˜๋”๋ผ๋„, ์‹ค์ œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” B์ธ ์ž์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์˜ ๊ธฐ๋ณธ ์ค‘์— ๊ธฐ๋ณธ์ด์—ˆ์„ํ…๋ฐ... ์ด ๊ธ€์„ ์ ์„ ๋‹น์‹œ ๊ธฐ๋ณธ์„ ํ—ท๊ฐˆ๋ ธ๋‹ค๋Š” ๊ฒƒ์ด ์ฐธ ๋ถ€๋„๋Ÿฌ์šธ ๋ฟ์ด๋‹ค. ์—ฌํ•˜ํŠผ ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋‹ค์‹œ๊ธˆ ๋˜์ƒˆ๊ธธ ์ˆ˜ ์žˆ์–ด์„œ ๊ธฐ๋ถ„์ด ์ฐธ ์ข‹๋‹ค.

728x90