DevLog ๐ถ
[์ดํฉํฐ๋ธ์๋ฐ] ์์ดํ 04. ์ธ์คํด์คํ๋ฅผ ๋ง์ผ๋ ค๋ฉด private ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ผ ๋ณธ๋ฌธ
[์ดํฉํฐ๋ธ์๋ฐ] ์์ดํ 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๋ฅผ ํตํด ์์ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ด ๊ฐ๋ฅํด์ง๋ค.
์ด๋ฒ ์ฅ์ ๋ด์ฉ์ด ๊ฐ๊ฒฐํด์ ๊ธ๋ฐฉ ๋ณผ ์ ์์๋ค! ๐