DevLog ๐Ÿ˜ถ

[์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ”] ์•„์ดํ…œ 04. ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๋ฉด private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ ๋ณธ๋ฌธ

๐Ÿ“–/Effective Java

[์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ”] ์•„์ดํ…œ 04. ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ ค๋ฉด private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

dolmeng2 2023. 4. 6. 12:08

๐Ÿ’ฌ ์ดํŒฉํ‹ฐ๋ธŒ์ž๋ฐ” ์•„์ดํ…œ 4์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.


โœ”๏ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค

์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๊ฐ€ ์—†์ด, ์ •์  ๋ฉ”์„œ๋“œ์™€ ์ •์  ๋ณ€์ˆ˜๋งŒ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ด์ง€๋งŒ, ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์  ๊ด€์ ์—์„œ ๋ดค์„ ๋•Œ ์ข‹๋‹ค๊ณ ๋Š” ๋ณด๊ธฐ ํž˜๋“ค ๊ฒƒ ๊ฐ™๋‹ค.

 

์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์ค‘์— ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ๋“ค์„ ๋ช‡ ๊ฐ€์ง€ ์‚ดํŽด๋ณด์ž.

public class Arrays {
    private Arrays() {}
    ...
}

์œ„ ์ฝ”๋“œ๋Š” java.util์— ์กด์žฌํ•˜๋Š” Arrays ํด๋ž˜์Šค์ด๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋ฐฐ์—ด์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ ฌ์ด๋‚˜ ๊ฒ€์ƒ‰ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. (๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋กœ๋”ฉ๋˜์–ด ์žˆ์–ด์„œ ์‹ค์ œ๋กœ ํ•˜๋Š” ์—ญํ• ์€ ๊ฒ€์ƒ‰, ๋ณต์‚ฌ, ์ฑ„์šฐ๊ธฐ, ์ •๋ ฌ... ๋“ฑ๋“ฑ์ด ์žˆ๋‹ค)

 

์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋งŒํผ, ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑ์ž๋ฅผ private๋กœ ๋ง‰์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ์ž๋ฐ”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— public์œผ๋กœ ์—ด์–ด๋‘๋ฉด ์˜๋„์น˜ ์•Š๊ฒŒ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ, ๋‚ด๋ถ€์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ static ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ด๋‹ค!

 

public final class Math {

    private Math() {}
    ...
}

๋˜ํ•œ, ์œ ๋ช…ํ•œ ํด๋ž˜์Šค ์ค‘์—์„œ java.lang์— ์กด์žฌํ•˜๋Š” Math ํด๋ž˜์Šค๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ˆซ์ž์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์กฐ์ž‘ํ•˜๋ฉฐ, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์  ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ private๋กœ ๋ง‰์•„๋‘์—ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด๋ถ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์—๋Š” ๋‹ค static ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

์ž๋ฐ” api์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ private๋กœ ์ƒ์„ฑ์ž๋ฅผ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ, ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ๋„ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

public abstract class Sample {
    abstract void test();
}

์œ„์™€ ๊ฐ™์€ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

์ถ”์ƒ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

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

public static void main(String[] args) {
    Sample sample = new Sample();
}

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋‚˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์„œ๋“œ ์—ญ์‹œ ์ƒ๋‹นํžˆ ์นœ์ ˆํ•˜๋‹ค. abstract์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.

 

๐Ÿ’ก ํ•œ ๊ฐ€์ง€ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค์— ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„์˜ˆ ์—†์–ด๋„ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ?

public abstract class Sample {
}

์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ์— ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‹œ์ผฐ๋Š”๋ฐ, ์œ„๋ž‘ ๋˜‘๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์• ์ดˆ์— ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์„ ์–ธ์ด ๋˜์–ด ์žˆ๋Š” ์ด์ƒ, ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋ง๋ถ™์ด๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‹œํ‚ค๋Š” ๊ฒŒ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋งž์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. (์„œ๋ธŒ๋ฅผ ํ†ตํ•ด์„œ ๊ตฌํ˜„์ด ๋˜์–ด์„œ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋˜๋Š” ๊ฒŒ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๋ชฉ์ ์ด๋ผ์„œ)

public static void main(String[] args) {
    Sample sample = new Sample() {};
}

์ž๋ฐ”๋ฅผ ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด๊ฒƒ๋„ ์ธ์Šคํ„ด์Šคํ™” ํ•œ ๊ฑฐ ์•„๋‹ˆ์•ผ? ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ Sample ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ต๋ช… ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ฑฐ๋‚˜, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์ด ์—†๋Š” ํด๋ž˜์Šค์ด๋‹ค.

 

์•„๋ฌดํŠผ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์œ„์™€ ๊ฐ™์ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ๋ณ„๋„์˜ ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

// ์„œ๋ธŒ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ์˜ˆ์‹œ
public class SubSample extends Sample{
}

Sample sample = new SubSample();

SubSample ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ Sample ํด๋ž˜์Šค์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜์ธ sample์—๊ฒŒ ๋Œ€์ž…ํ•˜์˜€๋‹ค.

์ด๋Ÿฌ๋ฉด 'sample'์ด๋ผ๋Š” ๋ณ€์ˆ˜๋Š” 'Sample' ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ฉด์„œ SubSample ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

 

๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ๋ณด๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋กœ ์ •์˜ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ƒ์†์„ ํ†ตํ•ด์„œ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค! 

 

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋”ฐ์ ธ๋ณด์•˜์„ ๋•Œ, private ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ˜„๋ช…ํ•˜๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ throw๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋„ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ๋ง‰๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋ฒ ์ŠคํŠธ์ด๋‹ค.

public class Sample {
    private Sample() {
        throw new AssertionError();
    }
}

๋˜ํ•œ, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋ง‰์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์† ์—ญ์‹œ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. 

public class SubSample extends Sample {
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ’ก ์—ฌ๊ธฐ์„œ, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋ง‰์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. 

์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์ž๋ฐ”์—์„œ ์ƒ์†์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 'ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ'ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋ณดํ†ต ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—ด๋ ค ์žˆ์„ ๊ฒฝ์šฐ, ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด InvokeSpecial์„ ํ†ตํ•ด Sample์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค ใ…Žใ…Ž

 

public class Sample {
    private Sample() {
        throw new AssertionError();
    }

    public Sample(int num) {
    }
}

์•„๋ฌดํŠผ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด!

public class SubSample extends Sample {
    public SubSample(final int num) {
        super(num);
    }
}

์ด๋Ÿฐ ์‹์œผ๋กœ super๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์†์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 


์ด๋ฒˆ ์žฅ์€ ๋‚ด์šฉ์ด ๊ฐ„๊ฒฐํ•ด์„œ ๊ธˆ๋ฐฉ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค! ๐Ÿ˜Ž

Comments