15. ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ ๊ถํ์ ์ต์ํ
์ ๊ทผ ์ ํ์๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์ ๋ณด ์๋(์บก์ํ)์ ํต์ฌ
- ๋ชจ๋ ํด๋์ค์ ๋ฉค๋ฒ์ ์ ๊ทผ์ฑ์ ๊ฐ๋ฅํ ํ ์ขํ์ผ ํจ
- ํจํค์ง ์ธ๋ถ์์ ์ธ ์ด์ ๊ฐ ์๋ค๋ฉด package-private์ผ๋ก ์ ์ธ
- ํ ํด๋์ค์์๋ง ์ฌ์ฉํ๋ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค ์์ private static์ผ๋ก ์ค์ฒฉ์ํค๊ธฐ
- โจ public์ผ ํ์๊ฐ ์๋ ํด๋์ค์ ์ ๊ทผ ์์ค์ package-private ํฑ๋ ๋ฒจ ํด๋์ค๋ก ์ขํ๊ธฐ
โณ๏ธ ์ ๊ทผ ์์ค
- private : ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํฑ๋ ๋ฒจ ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- package-private : ๋ฉค๋ฒ๊ฐ ์์๋ ํจํค์ง ์์ ๋ชจ๋ ํด๋์ค์์ ์ ๊ทผ ๊ฐ๋ฅ. ์ ๊ทผ ์ ํ์๋ฅผ ๋ช ์ํ์ง ์์์ ๋ ์ ์ฉ๋๋ ํจํค์ง ์ ๊ทผ ์์ค.
- protected : package-private์ ์ ๊ทผ ๋ฒ์๋ฅผ ํฌํจํ๋ฉฐ, ์ด ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ํด๋์ค์ ํ์ ํด๋์ค์์๋ ์ ๊ทผ ๊ฐ๋ฅ
- public : ๋ชจ๋ ๊ณณ์์ ์ ๊ทผ ๊ฐ๋ฅ
โณ๏ธ ์ ๊ทผ ๊ถํ ์ ํ๊ธฐ
- ํด๋์ค์ ๊ณต๊ฐ API ์ค๊ณ ํ(=public) ๊ทธ ์ธ์ ๋ชจ๋ ๋ฉค๋ฒ๋ private์ผ๋ก ๋ง๋ค๊ธฐ
- ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ๊ทผํด์ผํ๋ ๋ฉค๋ฒ์ ํํ์ฌ package-private์ผ๋ก ํ์ด์ฃผ๊ธฐ
- protected ๋ฉค๋ฒ ์๋ ์ ์์๋ก ์ข์ ๐ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ ๋์ ๋ฒ์๊ฐ ๋์ด์ง๋ฏ๋ก
- ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋๋ ์ ๊ทผ ์์ค์ ์์ ํด๋์ค์์๋ณด๋ค ์ข๊ฒ ์ค์ ๋ถ๊ฐ
- ์์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ก ๋์ฒดํด ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ฏ๋ก
- โจ public ํด๋์ค์ ์ธ์คํด์ค ํ๋๋ ๋๋๋ก public์ด ์๋์ด์ผ ํจ
- ๊ทธ ํ๋์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ ๋ถ๋ณ์ ๋ณด์ฅ X
- ํ๋๊ฐ ์์ ๋ ๋ ๋ค๋ฅธ ์์ ์ ํ ์ ์๊ฒ ๋๋ฏ๋ก public ๊ฐ๋ณ ํ๋๋ฅผ ๊ฐ๋ ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ ๋ ์์ X
- ์์๋ผ๋ฉด public static final ํ๋๋ก ๊ณต๊ฐ ๊ฐ๋ฅ ๐ ๋๋ฌธ์ ์ํ๋ฒณ ๋๋ ๊ฐ ๋จ์ด ์ฌ์ด์ _ ์ฌ์ฉ
- โจ ๊ธธ์ด๊ฐ 0์ด ์๋ ๋ฐฐ์ด์ ๋ชจ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ฏ๋ก ํด๋์ค์์ public static final ๋ฐฐ์ด ํ๋๋ฅผ ๋๊ฑฐ๋ ์ด ํ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์๋ ์๋จ
public static final Thing[] VALUES = { ... }; // ๋ฐฐ์ด์ ๋ด์ฉ ์์ ๊ฐ๋ฅ
๐ ๋ฐฐ์ด ์ฐธ์กฐ๋ ์์ ๋ถ๊ฐ (VALUES ๋ณ์๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ์ฌํ ๋น ๋ถ๊ฐ) / ๋ฐฐ์ด์ ์์๋ ์์ ๊ฐ๋ฅ
์๋์ ๊ฐ์ ์ฝ๋๋ก ํด๊ฒฐ
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
๐ ์์ ์ฝ๋์ public ๋ฐฐ์ด์ private์ผ๋ก ๋ง๋ค๊ณ public ๋ถ๋ณ ๋ฆฌ์คํธ ์ถ๊ฐ
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
๐ private์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค๊ณ ๊ทธ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ public ๋ฉ์๋ ์ถ๊ฐ (๋ฐฉ์ด์ ๋ณต์ฌ)
16. public ํด๋์ค์์๋ public ํ๋๊ฐ ์๋ ์ ๊ทผ์ ๋ฉ์๋ ์ฌ์ฉ
Class Point {
public double x;
public double y;
}
๋ง์ฝ ์์ ๊ฐ์ด public ์ผ๋ก ์์ฑํ๋ค๋ฉด ...
- ๋ฐ์ดํฐ ํ๋์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅ
- ์บก์ํ์ ์ด์ ์ ๊ณต X
- API๋ฅผ ์์ ํ์ง ์๊ณ ์๋ ๋ด๋ถ ํํ ๋ฐ๊ฟ ์ ์์
- ๋ด๋ถ์ ์ผ๋ก ์ขํ๋ฅผ double๋ก ํํํ์ง ์๊ณ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ธ๋ถ์์ ์ด๋ฏธ x, y ํ๋์ ์ง์ ์ ๊ทผํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ์์ ํ๋ ค๋ฉด API ์์ฒด๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ ์ํฉ ๋ฐ์
- ๋ถ๋ณ์ ๋ณด์ฅ X
- ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํ ๋ ๋ถ์ ์์ ์ํ X
๐ private์ผ๋ก ๋ฐ๊พธ๊ณ , public ์ ๊ทผ์ (getter) ์ฌ์ฉ !
package-private ํด๋์ค ํน์ private ์ค์ฒฉ ํด๋์ค๋ผ๋ฉด ๋ฐ์ดํฐ ํ๋๋ฅผ ๋ ธ์ถํด๋ ๊ด์ฐฎ์ !
17. ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํ
โณ๏ธ ๋ถ๋ณ ํด๋์ค๋ ...
๐ ์ธ์คํด์ค์ ๋ด๋ถ ๊ฐ์ ์์ ํ ์ ์๋ ํด๋์ค
โณ๏ธ ํด๋์ค๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ..
- ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋(๋ณ๊ฒฝ์)๋ฅผ ์ ๊ณต X
- ํด๋์ค ํ์ฅํ ์ ์๊ฒ ํจ
- ๋ชจ๋ ํ๋๋ฅผ final๋ก ์ ์ธ
- ๋ชจ๋ ํ๋๋ฅผ private์ผ๋ก ์ ์ธ
- ์์ ์ธ์๋ ๋ด๋ถ์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ํจ
โณ๏ธ ๋ถ๋ณ ํด๋์ค์ ์ฅ๋จ์
- ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋ ๋ ์์ ํ์ฌ ๋ฐ๋ก ๋๊ธฐํํ ํ์ X
- ๋ถ๋ณ ํด๋์ค๋ผ๋ฉด ํ ๋ฒ ๋ง๋ ์ธ์คํด์ค๋ฅผ ์ต๋ํ ์ฌํ์ฉ ๐ public static final
- ์์ฃผ ์ฌ์ฉ๋๋ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ค๋ณต ์์ฑํ์ง ์๊ฒ ํด์ค ๐ ์ ์ ํฉํ ๋ฆฌ
- ๋ถ๋ณ ๊ฐ์ฒด๋ผ๋ฆฌ ๋ด๋ถ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ๋ฅ
- ๊ฐ์ด ๋ค๋ฅด๋ฉด ๋ฐ๋์ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํจ ๐ ๊ฐ์ ๊ฐ์ง์๊ฐ ๋ง์ผ๋ฉด ๋ง๋๋ ๋ฐ ํฐ ๋น์ฉ ๋ฆ
โณ๏ธ ๋ถ๋ณ ํด๋์ค ์ค๊ณ ๋ฐฉ๋ฒ
- ์์ ์ ์์ํ์ง ๋ชปํ๊ฒ ํด์ผ ํจ
- final ํด๋์ค๋ก ์ ์ธ
- ๋ชจ๋ ์์ฑ์๋ฅผ private ํน์ package-private์ผ๋ก ๋ง๋ค๊ณ public ์ ์ ํฉํ ๋ฆฌ ์ ๊ณต
public class Complex{
private final double re;
private final double im;
private Complex(double re, double im){
this.re = re;
this.im = im;
}
public static Complex valueOf(double re, double im){
return new Complex(re, im);
}
... // ์๋ต
}
- setter ๋ง๋ค์ง ๋ง๊ธฐ
- ๋ค๋ฅธ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ํ๋๋ private final
- ์์ฑ์๋ ๋ถ๋ณ์ ์ค์ ์ด ๋ชจ๋ ์๋ฃ๋, ์ด๊ธฐํ๊ฐ ์๋ฒฝํ ๋๋ ์ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํจ
'Java > ๐ Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๐ Effective Java] ํด๋์ค์ ์ธํฐํ์ด์ค ไธ (1) | 2024.10.06 |
---|---|
[๐ Effective Java] ํด๋์ค์ ์ธํฐํ์ด์ค ไธญ (2) | 2024.10.05 |
[๐ Effective Java] ๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋ ไธ (0) | 2024.09.22 |
[Effective Java] ๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋ ไธ (0) | 2024.09.21 |
[๐ Effective Java] ๊ฐ์ฒด ์์ฑ๊ณผ ํ๊ดด ไธ (0) | 2024.09.20 |