4-1 ์์, ์ธํฐํ์ด์ค, ํด๋์ค์ ๊ถํ ์ต์ํ(+Java9 ๋ชจ๋)
by JiwonDev์ ๊ทผ์ ์ด์๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ผ. (์ ๋ถ๋ค Public์ผ๋ก ๋ง๋ค์ง ๋ง๋ผ)
์ ์ค๊ณ๋ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๋ด๋ถ ๊ตฌํ์ ์๋ฒฝํ ์จ๊ฒจ, ๊ตฌํ๊ณผ API๋ฅผ ๊น๋ํ ๋ถ๋ฆฌํ๋ค. ์ค์ง API๋ฅผ ํตํด์๋ง ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํตํ๋ฉฐ ์๋ก์ ๋ด๋ถ ๋์ ๋ฐฉ์ ์๋ ์ ํ ๊ฐ์์น ์๋๋ค. ์ ๋ณด ์๋, ํน์ ์บก์ํ๋ผ๊ณ ํ๋ ์ด ๊ฐ๋ ์ ์ํํธ ์จ์ด ์ค๊ณ์ ๊ทผ๊ฐ์ด ๋๋ ์๋ฆฌ๋ค.
# public ํด๋์ค์๋ ํ๋ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ.
getter setter๋ฅผ ์ฌ์ฉํ๋ผ๋ ๋ง์ ๋๋ค. ๋ถ๋ณ ํ๋๋ผ๊ณ ํด๋ ๊ตณ์ด ๋ ธ์ถ์์ผ์ ์บก์ํ๋ฅผ ๊บจ ํ์๋ ์์ต๋๋ค.
๋ฌผ๋ก inner private ํด๋์ค์ ๊ฒฝ์ฐ๋ ํ์ํ๋ค๋ฉด ๊ตณ์ด getter๋ก ์ ๊ทผํ๋ ๊ฒ ๋ณด๋ค, ํ๋๋ก ๋ฐ๋ก ์ ๊ทผํด๋ ๋ฉ๋๋ค.
# ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ(side-effect)๋ฅผ ์ต์ํํ๋ผ
- ํ์์๋ setter ๋ฉ์๋๋ ์ ๊ณตํ์ง ๋ง์ญ์์ค.
- ์์๋ฐ์ ์ผ์ด ์๋ ํด๋์ค๋ฅผ ํ์ฅํ ์ ์๋๋ก ์ ํํ์ญ์์ค. (final ํด๋์ค, private ์์ฑ์)
- ๊ฐ๋ฅํ ๋ชจ๋ ํ๋๋ฅผ final๊ณผ private๋ก ์ ์ธํ์ญ์์ค.
# ์์๋ณด๋ค๋ ์ปดํฌ์ง์ (ํ๋๋ก ๋ฐ์์ค๊ธฐ)๋ฅผ ์ฌ์ฉํ๋ผ.
์์์ ํ์ ํด๋์ค๊ฐ is-a ๊ด๊ณ์ผ ๋, ์ฆ ์ฒ์ ์ค๊ณ๋ถํฐ ์์์ผ๋ก ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์ ํ ๋ ์ฌ์ฉํ์ธ์.
๊ตณ์ด ํ์์๋ ํด๋์ค๋ค์ ์์๊ด๊ณ๋ก ๋ง๋ค์ง ๋ง๊ณ , ํ๋๋ก ๊ฐ์ง๊ณ ์์ผ์ธ์. ์์ ํด๋์ค๊ฐ ํ์ฅ์ ๊ณ ๋ คํ์ง ์์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์๊ณ ํ์์๋ ์์์ ์บก์ํ๋ฅผ ํด์นฉ๋๋ค.
- ์์ํ ํด๋์ค์ API์ ๊ฒฐํจ์ด ์๋๊ฐ?
- ๊ฒฐํจ์ด ์๋ค๋ฉด, ์์ ํด๋์ค์ API๊น์ง ์ ํ๋ผ๋ ๊ด์ฐฎ์๊ฐ?
- is-a ๊ด๊ณ๋ผ๊ณ ํด๋ ๋ฌธ์ํ ๋์ง ์์๊ฑฐ๋ ํ์ฅ์ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ง ์์๋ค๋ฉด ์ปดํฌ์ง(๋ฐ์ฝ๋ ์ดํฐ) ํจํด์ ์ฌ์ฉํ์
# ์์์ ๊ณ ๋ คํด ์ค๊ณํ๊ณ , ๋ฌธ์ํํ๋ผ. (๊ทธ๋ฌ์ง ์์๋ค๋ฉด ์์์ ํ์ง๋ง๋ผ)
์์์ฉ ํด๋์ค๋ฅผ ์ค๊ณํ๋๊ฑด ์ด๋ ค์ด ์ผ์ ๋๋ค. ํ์์๋ค๋ฉด ๋ฐ๋์ final class๋ก ์์์ ๋ฐฉ์งํ์ธ์.
๋ฌธ์ํํ์ง ์๊ณ ๋์ถฉ ๋ง๋ค์๋ค๊ฐ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋ฏฟ๊ณ ํ์ฉํ๋ ํ์ ํด๋์ค๋ฅผ ์ค์๋ ํ ์ ์์ต๋๋ค. ๋ณต์กํ ์์๊ด๊ณ์์ ํ์ ํด๋์ค์์ ์์ ํด๋์ค์ ๋ฌธ์ ๋ฅผ ์ฐพ๋๊ฑด ๊ฒฐ์ฝ ์ฌ์ด์ผ์ด ์๋๋๋ค.
- ์์์ฉ ํด๋์ค๋ ์ฌ์ ์ํ ์ ์๋ ๋ฉ์๋๋ค์ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ด์ฉํ๋์ง ๋ฌธ์๋ก ๋จ๊ฒจ์ผ ํ๋ค.
(@implSpec : ์๋ฐ ๊ฐ๋ฐํ์ด ๋ด๋ถ์ ์ผ๋ก ์๋ฐ๋ ์ ์ปค์คํ ํ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ท์ฝ) - ํด๋์ค์ ๋ด๋ถ ๋์ ๊ณผ์ ์ค๊ฐ์ ๋ผ์ด๋ค ์ ์๋ ํ ์ ์ ์ ๋ณํ์ฌ protected๋ฉ์๋ ํํ๋ก ๊ณต๊ฐํด์ผ ํ ์๋ ์๋ค.
- ์์์ฉ์ผ๋ก ์ค๊ณํ ํด๋์ค๋ ๋ฐฐํฌ ์ ์ ๋ฐ๋์ ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๊ฒ์ฆํด์ผ ํ๋ค.
- ์์์ฉ ํด๋์ค์ ์์ฑ์๋ ์ง์ ์ ์ผ๋ก๋ ๊ฐ์ ์ ์ผ๋ก๋ ์ฌ์ ์ ๊ฐ๋ฅ ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์๋๋ค.
# ์ถ์ ํด๋์ค๋ณด๋ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ ํ๋ผ.
์์๋ณด๋ค ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ ์ข์ต๋๋ค. ๊ณ์ธต๊ตฌ์กฐ๊ฐ ์๊ณ , ๋ค์ค ์์์ ์์ ํ ํ๋๊น์.
๊ฑฐ๊ธฐ์ ์ถ๊ฐ๋ก ๊ฐ๋ฅํ๋ฉด ํด๋์ค์ ๊ณจ๊ฒฉ ๊ตฌ์กฐ ๊ตฌํ์ ์ธํฐํ์ด์ค์ default, private(java9์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฐฉ์ง ๋ฉ์๋)๋ฅผ ์ด์ฉํ๋๊ฒ ์ข์ต๋๋ค.
๊ฐ๋ฅํ๋ฉด ์ด๋ผ๋ ๋ง์ ๋ถ์ธ ์ด์ ๋, ๊ตฌํ์ ์ธํฐํ์ด์ค ์ ์ฝ ๋๋ฌธ์ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
public class VendingMachine extends AbstractVending {
@Override
public void chooseProduct() {
System.out.println("์๋ฃ์๋ฅผ ์ ํ ํ๋ค.");
}
}
public interface VendingService {
void start();
void chooseProduct();
void stop();
void process();
}
public abstract class AbstractVending implements VendingService{
@Override
public void process() { // default ๋ฉ์๋๋ฅผ ์ด๋ ๊ฒ ์ฌ์ฉํ ์๋ ์์ผ๋๊น์.
start();
chooseProduct();
start();
}
@Override
public void start() {
System.out.println("์๋ฃ์ ์ ํ ์์");
}
@Override
public void stop() {
System.out.println("์๋ฃ์ ์ ํ ๋");
}
}
# ์ธํฐํ์ด์ค๋ ๊ตฌํํ๋ ์ ์ฅ์ ๊ณ ๋ คํด์ ์ค๊ณํ๋ผ.
default ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ, ๊ธฐ์กด์ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ตฌํ์ฒด์์ ์ ๋์ํ ์ง๋ ๋ณด์ฅํ ์ ์์ต๋๋ค. ํญ์ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ ๋์๋ `์ด๋ฏธ ๊ตฌํ๋์๊ฑฐ๋, ๊ตฌํํ๊ณ ์ํ๋ ๊ฐ์ฒด`์ ์ ์ฅ์ ๊ณ ๋ คํด์ ์ค๊ณํ์ธ์.
๋ง์ฝ default๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด Java9์ private ์ธํฐํ์ด์ค ๋ฉ์๋๋ ์์ต๋๋ค.
# ์ธํฐํ์ด์ค๋ฅผ ์์์ฉ์ผ๋ก ์ฌ์ฉํ์ง ๋ง๋ผ. (ํ์ ์ ์ ์ํ๋ ์ฉ๋๋ก ์ฌ์ฉ)
์ธํฐํ์ด์ค์ ์์๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํด์, ์์์ฉ ์ ํธ ๊ฐ์ฒด๋ฅผ interface๋ก ๋ง๋๋๊ฑด ์ข์ง์์ต๋๋ค. ์ ์ด์ ์ธํฐํ์ด์ค๋ ๋ด๋ถ๊ตฌํ์ ๋๋ค. ๋ด๋ถ ๊ตฌํ์ ๊ตณ์ด ํด๋์ค์ ๊ณต์ฉ API (์์)๋ก ๋ ธ์ถ์ํค๋๊ฑด ๋์ ๋ฐฉ๋ฒ์ ๋๋ค.
public interface Constants { // NOPE!! ์ ํธ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋์ญ์์ค.
static final double AVG = 6.2345235123;
static final double AVG = 9.11111115222;
static final double AVG = 1.3542345235;
}
# ํ๊ทธ(์ฃผ์)๊ฐ ๋ฌ๋ฆฐ ๋ฒ์ฉ ํด๋์ค๋ฅผ ์ค๊ณํ์ง ๋ง๋ผ. ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ผ
์๋์ ๊ฐ์ด ํ๊ทธ๊ฐ ๋ฌ๋ฆฐ ํด๋์ค๋ฅผ ์จ์ผํ๋ ์ํฉ์ ๊ฑฐ์ ์์ต๋๋ค.
๋ง์ฝ ์ด๋ ๊ฒ ์ฐ๊ณ ์๋ค๋ฉด ๋ฆฌํฉํ ๋ง์ ํตํด ํ๊ทธ๋ฅผ ์์ ๊ณ ์์์ ์ด์ฉํด ๊ณ์ธต๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค.
// ์์์ ์ด์ฉํ ๊ณ์ธต๊ตฌ์กฐ๋ก ๋ถ๋ฆฌํด์ผํ๋ ํด๋์ค.
// ํ๊ทธ๋ฅผ ์ด์ฉํด์ ์์์์ด ๋์ถฉ ๊ตฌํํ์๋ค. ๋ฆฌํํ ๋ง์ด ํ์ํ๋ค.
public class Animal {
enum Type{ DOG, CAT }// ??? ๋ญ์ผ ์ด๊ฑด?
final Type type;
//dog์์๋ง ์ฐ๋ ํ๋..?
final String name;
//cat์์๋ง ์ฐ๋ ํ๋...???
final int age;
//dog์ฉ ์์ฑ์
public Animal(String name){
this.name = name;
}
//cat์ฉ ์์ฑ์
public Animal(int age){
this.age = age;
}
}
# ๋ฉค๋ฒ ํด๋์ค (inner ํด๋์ค)๋ static์ผ๋ก ๋ง๋ค์ด๋ผ.
๋ฉค๋ฒ ํด๋์ค์ ์ธ์คํด์ค๊ฐ outer ํด๋์ค์ ํ๋(์ธ์คํด์ค)๋ฅผ ์ฐธ๊ณ ํ๋ค๋ฉด non-static์ผ๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๋ค๋ง ๊ฐ๋ฅํ๋ฉด static์ผ๋ก๋ง ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค. static์ ๊ฐ์ง๋ฉด outer ํด๋์ค์ ์ฐธ์กฐ๊ฐ ํ์์์ด์ง๋๋ค.
- ๋น์ ์ ๋ฉค๋ฒ ํด๋์ค๋ ์จ์ ์ฐธ์กฐ (outer ์ธ์คํด์ค)๋ฅผ ๊ฐ์ง๊ฒ๋๊ณ ์ด๋ ๋ ๋ง์ ๋น์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- GC๊ฐ outer ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๊ฑฐ ๋ชปํด์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. (์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ฐพ๊ธฐ๋ ์ด๋ ต์ต๋๋ค.)
# ํ ํ์ผ (.java)ํ์ผ์๋ ํ ํด๋์ค๋ง ๋ด์ผ์ธ์.
inner ํด๋์ค๋ฅผ ๋งํ๋๊ฒ ์๋๋๋ค. Top level ํด๋์ค์์๋ ํ ํ์ผ์ ํ ํด๋์ค๋ง ๋ด์ผ์ธ์.
์ ์ด์ ์๋ฐ ์ปดํ์ผ๋ฌ๋ ํ์ผ ๋จ์(.java)๊ฐ ์๋ ํด๋์ค ๋จ์(CLASS)๋ก ๋ฐ์ดํธ์ฝ๋ ํ์ผ(.class)๋ฅผ ์์ฑํฉ๋๋ค. ํ ์๋ฐ์ฝ๋์ ์ฌ๋ฌ ํด๋์ค๋ฅผ ๋ด๊ฒ๋๋ฉด ์์ ํ์ง๋ ์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๊ฐ์ด ์ปดํ์ผ ํด์ผํฉ๋๋ค.
# Java 9์ ๋ชจ๋ ์์คํ
์์ง ์ฌ์ฉํ๊ธฐ ์ด๋ฅด๊ธดํ์ง๋ง, Java9 ๋ถํฐ ํ๋ ์ด์์ ํจํค์ง๋ฅผ ๊ฐ์ง `๋ชจ๋`์ด๋ผ๋ ๊ฐ๋
์ด ์ถ๊ฐ๋์๋ค. Java9 ์ดํ๋ถํฐ ์๋ฐ ์ฑ์ ๋ฐ๋์ ์๋ฐ ๋ชจ๋๋ก ํจํค์ง ๋๋๋ก ๋ณ๊ฒฝํ ์์ ์ด๋ผ๊ณ ํฉ๋๋ค.
(Gradle ๊ณผ ๋น์ทํ ์๋ฐ ์์ฒด์ ๋ชจ๋์์คํ
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.)
- ์ด๋ฆ์ด ๋ฌด์์ธ๊ฐ? (module name)
- ์ด ๋ชจ๋์ ์ด๋ค๊ฒ์ ์ ๊ณตํ๋๊ฐ? (export)
- ์ด ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ค๊ฒ๋ค์ด ํ์ํ๊ฐ ? (require)
- ์ด ๋ชจ๋์ด ์ฐธ์กฐํ๊ณ ์๋ ๋ชจ๋๋ค์ ์ธ๋ถ์ ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฐ? (opens)
// ๋ชจ๋์ ํจํค์ง์ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๊ฐ๋ค. ํด๋์ฒ๋ผ ๊ตฌ์ฑํ๋ฉด ๋๋ค.
// ๋ค๋ง ๋ชจ๋ ๋ฃจํธ ๋๋ ํ ๋ฆฌ ์์๋ ์๋์ ๊ฐ์ ์๋ฐ์ฝ๋๋ฅผ ๋ฐ๋์ ์์ฑํด์ผ ํ๋ค.
module com.modules.example {
// ์ฌ์ฉํ๋ ํ์ํ ๋ชจ๋ ์ ์
requires com.other.modules;
// ์ธ๋ถ์ ๋
ธ์ถํ ๋ชจ๋ ์ ์.
exports com.modules.example; // ํ์ ํจํค์ง ํฌํจ ์๋๊ณ example ๋ฐ๋ก ํ์์ ์๋ ๊ฒ๋ง
exports com.modules.example.a.b; // ๋ถ๋ชจ ํจํค์ง(a) export ์ ํ๊ณ (b)๋ง export ๊ฐ๋ฅ
}
ํจํค์ง ๋จ์๋ก ์บก์ํํ๊ณ , ํ์ํ ๋ชจ๋์ JVM start-up ํ์์ ๊ฒ์ฌํ๋ค. ์ด์ ์๋ missing classes (์กด์ฌํ์ง ์๋ ํด๋์ค)๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐ์์์ผฐ์ง๋ง, ์ด์ JVM์ด ์์ํ๋ ์์ ์ ์ด๋ฅผ ๋ชจ๋์ ์ ๋ณด๋ก ํ์ธํด์ค๋๋ค.
Java 8์ ๊ฒฝ์ฐ, ๋ชจ๋ ํจํค์ง๋ค์ด ์ฌ์ฉ ๊ฐ๋ฅํด์ ๋ณด์์ ๋ ธ์ถ์ด ๋์ง๋ง์์ผํ ํจํค์ง๋ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ์ต๋๋ค. ๊ทธ๋์ Java9๋ถํฐ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ์ง๋ง์์ผํ ํจํค์ง๋ฅผ ๋ชจ๋ ๋ด๋ถ์ ์จ๊ธธ ์ ์์ต๋๋ค.
์ฆ ๋ชจ๋ ์์คํ ์ ํตํด Java9์์๋ ์ ๊ทผ์ ์ด์๊ฐ ์๋์ ๊ฐ์ด ์ธ๋ถํ ๋ฉ๋๋ค.
- ์ธ๋ถ์ ๋ชจ๋ Public (public to everyone who reads this module (exports))
- ํน์ ๋ชจ๋์๋ง Public (public to some modules that read this module (exports to))
- ๋ชจ๋ ๋ด๋ถ๋ง Public (public to every other class within the module itself)
- private
- default
- protected
์์ง์ Java8์ด ๋์ธ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง๋ ์์ง๋ง, ๊ถ๊ธํ๋ค๋ฉด Project Jigsaw๋ฅผ ์ฐธ๊ณ ํ์.
'๐ฑBackend > Effective-Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
5-2 ์ ๋ค๋ฆญ, ๋ฐฐ์ด๋ณด๋ค๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ผ, (+์ํผํ์ ๊ตฌํ๋ฐฉ๋ฒ) (0) | 2021.09.15 |
---|---|
5-1 ์ ๋ค๋ฆญ์ ๊ทธ๋ฅ Raw ๋ก ์ฌ์ฉํ์ง ๋ง๋ผ(+ ๋น๊ฒ์ฌ ๊ฒฝ๊ณ ์ ๊ฑฐ) (0) | 2021.09.15 |
3-4 Cloneable์ ์ฌ์ฉํ์ง ๋ง๋ผ & Comparable์ ์ฌ์ฉ (0) | 2021.09.15 |
3-1 Equals์ toString์ ์ฌ์ ์ (0) | 2021.09.15 |
2-2 ๋ค ์ด ๊ฐ์ฒด์ฐธ์กฐ๋ฅผ ํด์ ํ๋ผ. (0) | 2021.09.15 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev