0. ํ์ต ๋ชฉ์
- ์ธํฐํ์ด์ค์ ๊ตฌ์ฑ์์์ ๋ํด ์ดํดํ๋ค.
- ์ธํฐํ์ด์ค๋ ์ธ์ ์ฐ๋์ง ์ดํดํ๋ค.
1. ์ธํฐํ์ด์ค๋?
์ธํฐํ์ด์ค ๋, '๋ฌด์์ ํ ๊ฒ์ธ๊ฐ' ์ ๋ํ ๋ช
์ธ๋ง ์ ํ์๋ ๊ณ์ฝ ํ ์ถ์ ์๋ฃํ์ด๋ค.
(1) ๊ณ์ฝ์ด๋?
๊ณ์ฝ์ ์ค์ํ์์ ์ํธ ๊ฐ์ ์ง์ผ์ผ ํ๋ ์ฝ์์ ๋งํ๋ค. ์ธํฐํ์ด์ค๋ ์ฌ์ฉ์์, ๋ ๊ทธ๊ฒ์ ๊ตฌํํ๊ณ ์ ํ๋ class์ ๋ ๋ฒ ๊ณ์ฝ์ ํ๊ฒ ๋๋ค.
์ฌ์ฉ์์์ ๊ณ์ฝ
: ์ฌ์ฉ์๊ฐ ์ธํฐํ์ด์ค ๋ด ์ํ๋ ๋งค์๋๋ฅผ ๊ท์น์ ๋ง๊ฒ ํธ์ถํ๋ฉด, ์ฌ์ฉ์๊ฐ ์์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ํด์ค์ผ ํ๋ค.๊ตฌํ์ฒด์์ ๊ณ์ฝ
: ๊ตฌํ์ฒด๋ ์ถ์ ๋งค์๋์ ๊ท์น (์ธ์, ๋ฐํ๊ฐ)์ ์ค์ํ์ฌ ๊ตฌํํ์ฌ์ผ ํ๊ณ , ๊ทธ๊ฒ์ ์ฉ๋์ ๋ง๋ ํ๋์ ํด์ผ ํ๋ค.
(2) ์ธํฐํ์ด์ค ํ์ฉ์ ํจ๊ณผ
๊ตฌํ ๋ถ๋ฆฌ์ ๋์จํ ๊ฒฐํฉ
A. ๊ตฌํ ๋ถ๋ฆฌ = ๋ ผ๋ฆฌ์ ๊ฒฐํฉ๋ ๋ฎ์ถค
์ธํฐํ์ด์ค๊ฐ ์์๋ ์์ ์ ์ฌ์ฉ์์ ๊ตฌํ์ฒด์ ์ํธ ์์ฉ์ ์๊ฐํด๋ณด์. ๋งค์๋์ ๋ํ ๊ณตํต์ ์ธ ๋ช
์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๋ ์ํ๋ ํ๋์ ํ๋ ๋งค์๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ํด๋์ค๋ฅผ ํ๋ฐฉํด์ผ ํ๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ํด๋์ค์ ์ธ๋ถ ๊ตฌํ ๋ด์ฉ์ ์ ๋ถ ์๊ณ ์์ด์ผ ํ๋ค๋ ๋ง์ด ๋๋ค.
๋ฐ๋ฉด ์ธํฐํ์ด์ค๊ฐ ์ฌ์ฉ์์ ๊ตฌํ์ฒด์ ๊ฒฝ๊ณ๋ฉด์ ์๊ฒ ๋๋ฉด, ์ฌ์ฉ์๋ ์ธํฐํ์ด์ค์ ๋ช
์ธ๋ง ์๋ฉด ๋์ง, ๊ตฌํ์ฒด์ ์ธ๋ถ ๊ตฌํ ๋ด์ฉ์ ๋ชฐ๋ผ๋ ๋๋ค. ์ด๋ ๋
ผ๋ฆฌ์ ์ธ ์๋ฏธ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
์ธํฐํ์ด์ค๋ฅผ USB์ ๋์ ํด๋ณด์. ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ํค๋ณด๋, ๋ง์ฐ์ค, ์ธ์ฅ ํ๋ ๋ชจ๋ ๋์ผํ USB๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ง์ฝ USB๊ฐ ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ปดํจํฐ์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ณด์กฐ ์ฅ์น ๋ณ ํฌํธ ๊ตฌ๋ฉ์ ์ธ์ฐ๊ณ ์์ด์ผ ํ๋ค. ํ์ง๋ง USB ๋์ ๊ทธ๋ฌํ ๋ถํ์ํ ์๊ณ ๋ ๋ ์ ์๊ฒ ๋์๋ค.


B. ์ฝ๋ ์์ผ๋ก๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
์์ ์ฌ์ฉ์ ํํธ๋ฅผ ๊ณ ์์ค ๋ชจ๋๋ก ์นํํ๋ฉด ์ฝ๋ ์์ผ๋ก๋ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง์ ์ดํดํ ์ ์๋ค. ์ธํฐํ์ด์ค๊ฐ ์๋ OOP ํ๊ฒฝ์์ ํน์ ์๋น์ค๋ฅผ ๊ตฌํํ๋ค๊ณ ํด๋ณด์. ์ด๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ ํญ์ ํฌํจํ๋ (has a) ๊ด๊ณ์ผ ์ ๋ฐ์ ์๋ค. ๋ค์ ์์๋ฅผ ๋ณด์.
a. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ง ์์์ ๊ฒฝ์ฐ
public class Notification {
public void sendMessage(String way, String title, String msg)
{
switch (way) {
case "email": {
EmailService email = new EmailService();
email.sending(title, msg);
break;
}
case "kakaotalk": {
KakaoService kakao = new KakaoService();
kakao.sending(title, msg);
break;
}
default: {
throw new CustomException("์์ฒญํ์ ์ ์ก ๋ฐฉ๋ฒ์ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
}
}
public void saveMessage(String title, String msg) {
// ์ ์ฅ ๋ก์ง
}
}
์ฌ๊ธฐ์๋ ์๋ฆฌ ์๋น์ค๊ฐ ๊ณ ์์ค ๋ชจ๋์ด๋ค. ์ดํ ์๋ฆผ ์๋น์ค์ ๋ฉ์์ง ๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด ์ฐ์ด๋ EmailService์ KakaoService๊ฐ ์ ์์ค ๋ชจ๋์ด๋ผ๊ณ ํ ์ ์๋ค. ์ฝ๋๋ฅผ ์ ๋ณด๋ฉด ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ํฌํจํ๊ณ ์๋ค.
์ด๋ฌ๋ฉด ์ ์์ค ๋ชจ๋์์ ์ค๋ฅ๊ฐ ๋๋ฉด, ์ค๋ฅ๊ฐ ๊ณ ์์ค ๋ชจ๋๋ก ์ ํ๋์ด ๊ณ ์์ค ๋ชจ๋์ ๋๋จธ์ง ์๋น์ค ์ ์ฒด๊ฐ ์ค๋จ๋๋ ๊ฒ์ด ๋ฌธ์ ์ด๋ค.

b. ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ ๊ฒฝ์ฐ
public class Notification {
public void sendMessage(MessageSerivce messageService String title, String msg)
{
messageService.sending(title, msg);
}
public void saveMessage(String title, String msg) {
// ์ ์ฅ ๋ก์ง
}
}
// -- ๋ฐ์ 3๊ฐ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ผ --
public interface MessageService {
public void sending(String title, String msg)
}
public class EmailService implements MessageService {
@Override
public void sending(String title, String msg) {
// ์ด๋ฉ์ผ ์ ์ก๋ก์ง
}
}
public class KakaoService implements MessageService {
@Override
public void sending(Stirng title, String msg) {
// ์นด์นด์คํก ์ ์ก ๋ก์ง
}
}

์์ ์ฝ๋๋ EmailService์ KakaoService๋ฅผ MessageService ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ๋๋ก ๋ง๋ค์๋ค. ์ดํ ๊ณ ์์ค ๋ชจ๋์์ ๋ฉ์์ง ์ ์ก ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ, ์ธํฐํ์ด์ค๋ฅผ ํตํด EmailService๋ KakaoService๋ฅผ ์ฃผ์
๋ฐ์ ํ์ฉํ๊ณ ์๋ค.
์ด๋ฐ ์์ผ๋ก ๊ตฌํํ๋ฉด EmailService๋ KakaoService์ ์ค๋ฅ, ๋ณ๊ฒฝ ์ฌํญ์ด ๊ณ ์์ค ๋ชจ๋์ธ Notification์๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ฒ ๋๋ค. ์ด๋ ์๋ก๊ฐ์ ์์กด๋๊ฐ ์ฝํด์ก์ผ๋ฏ๋ก ๊ฒฐํฉ๋๊ฐ ๋ฎ์ถฐ์ก๋ค๊ณ ํ ์ ์๋ค.
[!info] DIP์ ์ธํฐํ์ด์ค
์ธํฐํ์ด์ค์ ๋ ๋ฒ์งธ ํจ๊ณผ๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น ์ค ํ๋์ธ DIP์๋ ์ฐ๊ด์ด ๊น๋ค. (์์์ ๊ตฌํํ ๋ด์ฉ ๋ํ ์ ๋ต ํจํด์ ํ์ฉํด DIP๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.) DIP๋ ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํด์๋ ์๋๋ฉฐ, ๋ ๊ฐ์ ๋ชจ๋ ๋ชจ๋ ์ถ์์ฒด์ ์์กดํ๋๋ก ํ์ฌ ์์กด์ฑ์ ๋ฐฉํฅ์ ์ญ์ ์ํค๋ ์ค๊ณ ์์น์ ๋งํ๋ค.
2. ๊ตฌ์ฑ์์ ๋ฏ์ด๋ณด๊ธฐ
public interface ์ธํฐํ์ด์ค ์ด๋ฆ {
// -- ๋ณ์ ๋ถ๋ถ - ์ต์
public static final ํ์
๋ณ์_์ด๋ฆ = ๊ฐ;
// -- ๋งค์๋ ํํธ
// ์ถ์ ๋งค์๋ - ํ์!
public abstract ํ์
๋งค์๋_์ด๋ฆ (๋งค๊ฐ๋ณ์ ๋ชฉ๋ก);
// ์ ์ ๋งค์๋ - ์ต์
public static ํ์
๋งค์๋_์ด๋ฆ (๋งค๊ฐ๋ณ์ ๋ชฉ๋ก);
// default ๋งค์๋ - ์ต์
public default ํ์
๋งค์๋_์ด๋ฆ (๋งค๊ฐ๋ณ์ ๋ชฉ๋ก) {
// ๊ตฌํ์ฒด
}
// private ๋งค์๋ - ์ต์
private ํ์
๋งค์๋_์ด๋ฆ (๋งค๊ฐ๋ณ์_๋ชฉ๋ก) {
}
}
์ธํฐํ์ด์ค์ ์ํ ์ ์๋ ๋ชจ๋ ๊ตฌ์ฑ์์ ๋ํ๋ด๋ฉด ์์ ๊ฐ๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ธํฐํ์ด์ค๋ ์ด๋ ํ ์๋น์ค์ ๋ํ ๋ช
์ธ๋ผ๋ ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ ๋ช
์ธ๋ฅผ ๋ด๋นํ๋ ์ถ์ ๋งค์๋๋ ์ธํฐํ์ด์ค์ ์ต์ 1๊ฐ๋ ์กด์ฌํด์ผ ํ๋ค. ๋๋จธ์ง๋ ์์ด๋ ๋๊ณ ์์ด๋ ๋๋ ์ต์
๋ค์ด๋ค.
์ด์ ํ๋ํ๋ ์ดํด๋ณด์.
(1) ๋ฉค๋ฒ ๋ณ์๋ ์์๋ง ๊ฐ๋ฅ
์ธํฐํ์ด์ค์ ๋ฉค๋ฒ ๋ณ์๋ ์์๋ง ๊ฐ๋ฅํ๋ค. ๋ง์ฝ์ ๊ฐ๋ฐ์๊ฐ public, static, final์ ์๋ตํ์ด๋, ์ปดํ์ผ ์๊ฐ์ ์ด 3 ํค์๋๊ฐ ์๋์ผ๋ก ์ถ๊ฐ๋๋ค. ์ด๋ ๊ฒ ์ค๊ณ๋ ์ด์ ๋ ๊ฐ๋ณ์ ์ธ ๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ, ์ธํฐํ์ด์ค์ ๋ช
์ธ๊ฐ ๋ฐํ์์ ์์ ๋๋ฉฐ ์ ์ฒด ๊ตฌํ์ฒด์๊ฒ ํผ๋์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- ์์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์๋ ์์๋๋ค.
- ์์๋ฅผ ์ฐธ์กฐ๋ณ์๋ก ์ฐ๋ฉด ์ฌ์ค ๋ณ์์ฒ๋ผ ์ธ ์ ์์.
- ๋น์ฐํ ์์์ด๊ธฐ ๋๋ฌธ์, ์์ํ ๊ตฌํ์ฒด ํด๋์ค๋ค์์ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ์๋จ.
(๊ฐ์ ๋ณ์ ํ์ ๋ฐ ์ด๋ฆ์ผ๋ก ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ์๋ํด๋, ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด ๊ฐ๊ฐ ๊ฐ์ด ๋ฐ๋ก ์กด์ฌํ๊ฒ ๋๋ค.)
A. ์์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์๊ฒ ์์๋๋ค.
interface Outer {
int constant = 77;
}
class Inner implements Outer {
}
public class Main {
public static void main(String[] args) throws IOException {
System.out.println(Inner.constant);
}
}

์์ ๊ฐ์ด Outer ์ธํฐํ์ด์ค์ ์์๋ ๊ทธ๊ฒ์ ๊ตฌํ ํด๋์ค์ธ Inner์์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ค๋ง ํด๋น ์ ์ ๋ณ์๋ฅผ ๊ตฌํ ํด๋์ค์์ ํ์ฉํ๋ ๊ฒ์ ์์์ ์ถ์ฒ๋ฅผ ์์๋ณด๊ธฐ๊ฐ ์ด๋ ค์์ผ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
B. ์์๋ฅผ ์ฐธ์กฐ ๋ณ์๋ก ์ ์ธํด์ ๋ณ์์ฒ๋ผ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
interface Outer {
ArrayList<Integer> list = new ArrayList<>();
}
class Inner implements Outer {
}
public class Main {
public static void main(String[] args) throws IOException {
Inner.list.add(22);
System.out.println(Inner.list);
}
}

C. ์ธํฐํ์ด์ค์ ๋ฉค๋ฒ ๋ณ์๋ ์์๋ผ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ์๋๋ค.
ํด๋์ค ์์์ผ ๊ฒฝ์ฐ ํด๋์ค ํ๋ ๋ฉค๋ฒ๋ผ๋ฆฌ ์์๋์ด ๋ฎ์ด ์์์ง์ง๋ง, ์ธํฐํ์ด์ค์ ํ๋๋ค์ ๋ชจ๋ ์์๋ผ์ ์์์ ํด๋ ์ ๋ถ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ฉ๋๋ค.
interface Iflower {
int ex = 10; // ๊ฐ๊ฐ public static final
}
interface IPlant extends Iflower {
int ex = 20; // ๊ฐ๊ฐ public static final
}
class Tulip implements IPlant {
int ex = 30; // ๊ทธ๋ฅ ์ธ์คํด์ค ๋ณ์
}
public class Main {
public static void main(String[] args) {
// ํด๋์ค ํ์
๊ฐ์ฒด๋ก ex ๋ฉค๋ฒ์ ์ ๊ทผํ๋ฉด, ํด๋์ค ์ธ์คํด์ค ๋ณ์๋ก ์ ๊ทผ
Tulip t = new Tulip();
System.out.println(t.ex); // 30
// ์ธํฐํ์ด์ค ํ์
๊ฐ์ฒด๋ก ๋ฉค๋ฒ์ ์ ๊ทผํ๋ฉด, ์ธํฐํ์ด์ค static ์์๋ก ์ ๊ทผ
Iflower a = new Tulip();
System.out.println(a.ex); // 10 - ์ข์ง์์ ๋ฐฉ๋ฒ
System.out.println(Iflower.ex); // 10 - ํด๋์ค static ์ฒ๋ผ '์ธํฐํ์ด์ค.๋ฉค๋ฒ' ๋ก ์ ๊ทผ
IPlant b = new Tulip();
System.out.println(b.ex); // 20 - ์ข์ง์์ ๋ฐฉ๋ฒ
System.out.println(IPlant.ex); // 20 - ํด๋์ค static ์ฒ๋ผ '์ธํฐํ์ด์ค.๋ฉค๋ฒ' ๋ก ์ ๊ทผ
}
}
(2) ์ถ์ ๋งค์๋
์ธํฐํ์ด์ค๋ ํ์์ ์ผ๋ก 1๊ฐ ์ด์์ ์ถ์ ๋งค์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ๋ํ ํด๋น ์ธํฐํ์ด์ค์ ๊ณ์ฝ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๊ตฌํ ํด๋์ค๋ค์ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ถ์ ๋งค์๋๋ฅผ ๊ตฌํํด์ผํ๋ค.
(3) static ๋งค์๋
๊ตฌํ์ฒด ํด๋์ค ์์ฒด์๋ ๋ฌด๊ดํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์กด์ฌํ๋ ๋งค์๋ ํํ์ด๋ค.
์ฉ๋
: ์ฌ์ฉ์์๊ฒ ํธ์๋ฅผ ์ ๊ณตํ๋์ ํธ๋ฆฌํฐ ํจ์๋ ์ฌ์ฉ์ ์๊ตฌ์ ๋ง๋ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์ฐ๋๋ก ์ ๋ํ๋ํฉํ ๋ฆฌ ํจํด ๋งค์๋๋ฑ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.ํน์ง
- ์์ ์ฃผ์ฒด๋ '์ธํฐํ์ด์ค' ์ด๋ค. (ํธ์ถ:
์ธํฐํ์ด์ค_์ด๋ฆ.์ ์ _ํจ์_์ด๋ฆ()) - ๊ตฌํ์ฒด ํด๋์ค์์
Overriding์ด ๋ถ๊ฐ๋ฅํ๋ค. (๋ง์ฝ ๊ฐ์ ๋งค์๋ ์๊ทธ๋์ฒ๋ฅผ ์ ์ธํด๋ ๋ณ๋์ ์ ์ ๋งค์๋ ์ทจ๊ธ์ ๋ฐ๊ณ ์คํ๋๋ค.) - ์ ๊ทผ ์ ์ด์๋
public๋ง ๊ฐ๋ฅํ๋ค.
A. Overriding ๋ถ๊ฐ

์์ ๊ฐ์ด ์ธํฐํ์ด์ค Outer์ static Method๋ฅผ ๊ตฌํ ํด๋์ค์์ Overridingํ๋ฉด ์๋ฌ๊ฐ ๋๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ด๋
ธํ
์ด์
์ ์ ๊ฑฐํ๋ฉด ์๋ง ๋์๊ฐ๋ค.
์ด ํ์์ Overhidding์ด๋ผ๊ณ ํ๋ค. ๋ถ๋ชจ ๋ชจ๋์ ์ ์ ๋งค์๋์ ๋๊ฐ์ ์๊ทธ๋์ฒ์ ์ ์ ๋งค์๋๋ฅผ ์์ ๋ชจ๋์์ ๋ง๋ค๋ฉด, ๋ถ๋ชจ ๋ชจ๋์ ๋งค์๋๋ฅผ ์์ ๋ฐ์์ ์ฌ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ๋ฅ ๋๊ฐ์ ์ด๋ฆ์ ๋ค๋ฅธ ๋งค์๋๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ์์ ์์์์๋ Outer.print()์ Inner.print()๋ ์๋ฌด๋ฐ ๊ด๊ณ๊ฐ ์๋ค.
(4) default ๋งค์๋
์ธํฐํ์ด์ค ๋ด์์ ์ ์ธ๋์ง๋ง ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ง๋ ๋งค์๋๋ฅผ ๋งํ๋ค. ๋ป์ '๊ฐ๋งํ ๋๋๋ฉด ์ธํฐํ์ด์ค์ ์ ํ๋๋ก ๋์๊ฐ๋๋ฐ, ๋ฐ๊พธ๊ณ ์ถ์ผ๋ฉด ๊ฐ์ ธ๋ค ์ด ๋ํฌ๋ค์ด ๊ตฌํํด~' ์ด๋ค.
- ์๊ธด ์ด์
: ์ด์ ๋ฒ์ ์ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด์ ์ ๊ท ์ธํฐํ์ด์ค์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์ ์์ฑ๋์๋ค. - ํน์ง
- ์์ ์ฃผ์ฒด๋ '์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด' ์ด๋ค. (ํธ์ถ:
๊ตฌํ_๊ฐ์ฒด.default_method) - Interface์์ default ๋งค์๋ ๊ตฌํ ์ ์ธ์คํด์ค ์ปจํ
์คํธ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค. (
this.) Overriding์ด ๊ฐ๋ฅํ๋ค.
- ์์ ์ฃผ์ฒด๋ '์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด' ์ด๋ค. (ํธ์ถ:
A. default ๋งค์๋๊ฐ ์ด๋ป๊ฒ ํธํ์ฑ์ ๋ณด์ฅํ๋ค๋ ๊ฑฐ์ง?
a. java7 ์ด์ ์ ํธํ์ฑ ๋ฌธ์
default ๋งค์๋๋ java8๋ถํฐ ๋ฑ์ฅํ์๋๋ฐ, ์ด๊ฒ์ด ์์๋ java7 ์ด์ ๋ฒ์ ์์ ์๊ฒผ๋ ๋ฌธ์ ๋ฅผ ๋ณด์. ๋ง์ฝ ์์์ ์ธํฐํ์ด์ค์ ์๋ก์ด ์ถ์ ๋งค์๋๋ฅผ ๋ถ์ธ ๊ฒฝ์ฐ ์ด๋จ๊น? ๊ทธ๊ฒ๊ณผ ๊ณ์ฝ ๊ด๊ณ์ ์๋ ๋ชจ๋ ํด๋์ค๋ค์์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํด๋น ์ธํฐํ์ด์ค์ ๊ณ์ฝํ ๋ชจ๋ ํด๋์ค๋ฅผ ์ฐพ์์ ์ถ์ ๋งค์๋๋ฅผ ๊ตฌํํ๊ณ ์ฌ์ปดํ์ผ ํด์ผํ๋ค.
๋ํด์, ๋ง์ฝ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ ์ฃผ์ฒด๊ฐ ํต์ ํ ์ ์๋ ๊ณ์ฝ ํด๋์ค๋ค์ ๊ฒฝ์ฐ, (ex - ์ 3์๊ฐ ๋ด๊ฐ ๋ง๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๋ฐฐํฌํจ) ์ด๋ฌํ ์ถํ ์์ ์กฐ์ฐจ ๋ถ๊ฐ๋ฅํ์ฌ ์ค๋ฅ์ ์ฐ์์์ฉ์ด ์ผ์๋ค.
์ด๋ฌํ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, JDK ํ์์๋ interface์ default ๋งค์๋๋ฅผ ๋ง๋ค์๋ค.
b. default ๋งค์๋์ ํจ๊ณผ
์ด์ ๋ฒ์ ์ธํฐํ์ด์ค์ ๊ณ์ฝํ ํด๋์ค๋ค์๊ฒ ์๋ก์ด ๋งค์๋์ ๊ตฌํ์ ๊ฐ์ ํ์ง ์๊ฒ ๋๋ค.
์ด๋ฏธ ๊ตฌํ ์๋ฃ๋ ๋งค์๋๊ฐ ์ธํฐํ์ด์ค์ ์์ผ๋ฏ๋ก ๊ณ์ฝ ํด๋์ค๋ค์๊ฒ ์ฌ์ ์ ์ฑ
์์ด ์๋ค. ๋ํ default ๋งค์๋๋ ์๋ ์์ ๋ฐ์ผ๋ฏ๋ก, ์ดํ ํ์ํ๊ฒ ๋๋ค๋ฉด . ํธ์ถ๋ก ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
public interface MyInterface {
// ์ถ์ ๋ฉ์๋ (๋ฐ๋์ ๊ตฌํํด์ผ ํจ)
void abstractMethod();
// Default ๋ฉ์๋ (๊ตฌํ ์ ํ์ฌํญ)
default void defaultMethod() {
System.out.println("์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ");
}
}
public class MyClass implements MyInterface {
// ์ถ์ ๋ฉ์๋๋ง ๊ตฌํํ๋ฉด ๋จ
@Override
public void abstractMethod() {
System.out.println("์ถ์ ๋ฉ์๋ ๊ตฌํ");
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.abstractMethod(); // "์ถ์ ๋ฉ์๋ ๊ตฌํ"
obj.defaultMethod(); // "์ธํฐํ์ด์ค์ ๊ธฐ๋ณธ ๊ตฌํ" - ์๋ ์์!
}
}
B. ์์ ์ฃผ์ฒด๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ณ์ฝ ํด๋์ค์ ๊ตฌํ์ฒด!
๋ง์ ์ฌ๋๋ค์ด static ๋งค์๋์ ํท๊ฐ๋ ค ํ๋ ๋ถ๋ถ์ด ์ด๊ฒ์ด๋ค. default ๋งค์๋๋ฅผ ํธ์ถํ๋ ค๋ฉด ๋ช ํํ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํด์ผ ํ๋ค.
C. default ๋งค์๋ ๊ตฌํ์ ์ธ์คํด์ค ์ปจํ ์คํธ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
default ๋งค์๋ ๊ตฌํํ ๋ ๋ด๋ถ์ ๋ณ์๋ฅผ ์ ์ธ ํ ์ฌ์ฉํ๊ฑฐ๋ ํน์ static ๋งค์๋๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์์ฃผ ๋ณผ ์ ์๋ค. ์ด๊ฒ ์ด์ธ์๋ ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ ๊ฐ์ฒด์ ์ปจํ ์คํธ๋ ํ์ฉํ ์ ์๋ค.
interface Color {
ArrayList<String> colors = new ArrayList<>();
void addRed();
void addBlue();
void addGreen();
default void makeRGBAndPrint(){
this.addRed();
this.addBlue();
this.addGreen();
System.out.println(colors);
}
}
์์ฒ๋ผ this. ํค์๋๋ฅผ ํ์ฉํด ์์ ์ ์ถ์ ๋งค์๋๋ค์ ํ์ฉํ์ฌ default ๋งค์๋๋ฅผ ๊ตฌํํ ์ ์๋ค. ์ด๋ ๊ฒ ์ธ์คํด์ค ์ปจํ
์คํธ๋ฅผ ํ์ฉํด ๊ตฌํํ๋ฉด, ๊ฐ์ฒด์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํ๋ํ๋ ๋งค์๋๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
class RGB implements Color {
@Override
public void addRed() {
colors.add("RED");
}
@Override
public void addBlue() {
colors.add("BLUE");
}
@Override
public void addGreen() {
colors.add("GREEN");
}
}
public class Main {
public static void main(String[] args) throws IOException {
Color c = new RGB();
c.makeRGBAndPrint();
}
}
์ดํ ์์ ๊ฐ์ด default ๋งค์๋์ ๋ํ ์ฌ์ ์ ์์ด ๊ณ์ฝ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ , main์์ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํ๋ฉด ์ ๋๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
C. Overriding์ด ๊ฐ๋ฅํ๋ค.
default ๋งค์๋๋ ์ธ์คํด์ค ๋งค์๋ ์ทจ๊ธ์ด๊ธฐ ๋๋ฌธ์, ์ธํฐํ์ด์ค์ ๊ณ์ฝํ ํด๋์ค์์ ์ถฉ๋ถํ ์ฌ์ ์๊ฐ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ๋ค์ค ์์์ด ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์์๋ ์ฃฝ์์ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ๊ฒ ๋๋ค.
a. ๋ค์ด์๋ชฌ๋ ๋ฌธ์

๋ค์๊ณผ ๊ฐ์ด MyMailService๊ฐ Gmail๊ณผ ๋ค์ด๋ฒ ๋ฉ์ผ์ ๋ค์ค ์์ํ๋ค๊ณ ํ์. ๋ง์นจ ๋ ์๋น์ค ๋ชจ๋ sending์ด๋ผ๋ default ๋งค์๋๊ฐ ์กด์ฌํ๋ค. ์ด๋, MyMailService์์ super ํค์๋๋ฅผ ์จ์ ๋ถ๋ชจ์ ๊ตฌํ ๋งค์๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด ๋ ์ค ์ด๋ ๊ฒ์ด ์ฌ์ฉ๋ ๊น?
์์ ๊ฐ์ด ์์ ํด๋์ค๊ฐ ๋ค์ค ์์ํ ๋ถ๋ชจ ํด๋์ค(ํน์ ์ธํฐํ์ด์ค) ๋งค์๋ ์ค ์ด๋ ๊ฒ์ ์์ ๋ฐ๋์ง ๋ชจํธํด์ง๋ ๋ฌธ์ ์ํฉ์ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
b. ํด๋์ค์ ์ธํฐํ์ด์ค ๊ฐ๊ฐ ์์ ์, ์ถฉ๋ ๋๋ ์ํฉ
์์ ํด๋์ค๊ฐ ์ธํฐํ์ด์ค์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ๋ชจ๋ ์์ํ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์. ์ด๋ ๋ถ๋ชจ ํด๋์ค์ ์ธํฐํ์ด์ค์ ํน์ ๋งค์๋์ ์๊ทธ๋์ฒ๊ฐ ์ถฉ๋ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด Java๋ ๋ฌด์กฐ๊ฑด ๋ชจ๋ ๊ฒฝ์ฐ์์ ๋ถ๋ชจ ํด๋์ค์ ๋งค์๋๊ฐ ์์๋๊ณ ์ธํฐํ์ด์ค์ ๋ํดํธ ๋งค์๋๋ ๋ฌด์๋๋ค.
์ฌ์ ์ค์ ์ด ๋ค์๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ ํ์.
์ธํฐํ์ด์ค I1๊ณผ ๊ทธ๋ฅ ํด๋์ค C1์ด ์๊ณ , Child ํด๋์ค๊ฐ ๋๋ค ์์ํ๋ค.
interface I1 {
public void func1();
default public void print(){
System.out.println("๋๋ ์ธํฐํ์ด์ค 'I1'์ ๋ํดํธ ๋งค์๋ ์
๋๋ค.");
}
}
class C1 {
public void print() {
System.out.println("๋๋ ํด๋์ค C1์ ์ผ๋ฐ ๋งค์๋ ์
๋๋ค.");
}
}
class Child extends C1 implements I1 {
@Override
public void func1() {}
}
์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์คํํด๋ณด์.
- ์์ ํด๋์ค ์ฐธ์กฐ ๋ณ์๋ก ํ ๋น ๋ฐ์์ ์์ ์ถฉ๋๋๋ ๋งค์๋ ์คํ
- ์์ ํด๋์ค๋ฅผ '๋ถ๋ชจ ์ธํฐํ์ด์ค' ๋ก ์บ์คํ
์ดํ ๋งค์๋ ์ฌ์คํ
public class Main { public static void main(String[] args) throws IOException { Child child = new Child(); child.print(); ((I1) child).print(); } }
๋ ๊ฒฝ์ฐ ๋ค ๋ฌด์กฐ๊ฑด ํด๋์ค์ ๋งค์๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
c. ์ธํฐํ์ด์ค ๋ ๊ฐ๋ฅผ ๋ค์ค ์์ ๋ฐ์์ ์ถฉ๋๋๋ ์ํฉ
์ด๋๋ ๋ฌด์กฐ๊ฑด ์ถฉ๋๋๋ default ๋งค์๋๋ฅผ ์์ ํด๋์ค์์ ์ฌ์ ์ ํด์ค์ผ ํ๋ค.
D. default ๋งค์๋์ static ๋งค์๋ ๋น๊ต
๋์ ์ฐจ์ด๋ฅผ ๊ฐ๋จํ ํ๋ก ๋ํ๋ด๋ณด์๋ค.
| ๊ตฌ๋ถ | default ๋ฉ์๋ |
static ๋ฉ์๋ |
|---|---|---|
| ์ ์ธ ํค์๋ | default |
static |
| ์์ ์ฃผ์ฒด | ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ธ์คํด์ค | ์ธํฐํ์ด์ค ์์ฒด |
| ํธ์ถ ๋ฐฉ์ | obj.method() |
InterfaceName.method() |
| ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ ์ฌ๋ถ | ๊ฐ๋ฅ โ ๊ตฌํ ํด๋์ค๊ฐ ์ฌ์ ์ํด ํนํ ๋ก์ง ๊ตฌํ | ๋ถ๊ฐ โ ๊ตฌํ์ฒด๊ฐ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ์ ์ธํด๋ ๋ณ๋ ์ ์ ๋ฉ์๋๋ก ์ทจ๊ธ |
this ์ฌ์ฉ |
๊ฐ๋ฅ(์ธ์คํด์ค ์ปจํ ์คํธ) | ๋ถ๊ฐ(์ ์ ์ปจํ ์คํธ) |
| ์ฃผ์ ์ฉ๋ | ๊ณตํต ๋ก์ง ์ ๊ณต, API ํ์ฅ ์ ํธํ์ฑ ์ ์ง | ์ ํธ๋ฆฌํฐยทํฉํ ๋ฆฌ ๋ฉ์๋ ์ ๊ณต, ์์ง๋ ํฅ์ |
| ๋ค์ด์๋ชฌ๋ ๋ฌธ์ | ๋ค์ค ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ ์๊ทธ๋์ฒ ๋ณด์ ์ **์ปดํ์ผ ์ค๋ฅ โ ๊ตฌํ์ฒด๊ฐ ํด๊ฒฐ | ํด๋น ์์ |
(5) Private ๋งค์๋
java 9 ์ดํ๋ถํฐ๋ ์ธํฐํ์ด์ค์์๋ private ๋งค์๋๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ก๋ค.
- ์ฉ๋
: default ๋งค์๋๋ผ๋ฆฌ์ ํน์ static ๋งค์๋ ๋ผ๋ฆฌ์ ๊ณตํต ๋ก์ง ๋ฌถ๊ธฐ.private: default ๋งค์๋๋ผ๋ฆฌ์ ๊ณตํต ๋ก์ง์ ๋ฌถ์ด ์ ์ฅprivate static: static ๋งค์๋๋ผ๋ฆฌ์ ๊ณตํต ๋ก์ง์ ๋ฌถ์ด ์ ์ฅ
3. ์ธํฐํ์ด์ค๋ ์ธ์ ์ฌ์ฉํ ๊น?
ํด๋์ค์ ์ ์ฒด์ฑ๋ณด๋ค ํด๋์ค์ ํ๋์ด๋ ๋ฅ๋ ฅ ํํ์ ์ค์ํด์ผํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
ํด๋์ค ๊ฐ์ ์์ ๊ด๊ณ๊ฐ A is a B ๋ผ๋ฉด, ํด๋์ค(A)์ ์ธํฐํ์ด์ค(B)๊ฐ์ ๊ด๊ณ๋ A is capable of B (A๋ B๋ฅผ ํ ์ ์๋ค.) ์ด๋ค.
๋ํ์ ์ธ ์ธํฐํ์ด์ค ์ฌ์ฉ์ ๊ฒฝ์ฐ 2๊ฐ์ง๋ฅผ ์๊ฐํ๊ฒ ๋ค.
- ์๋ก ์ฐ๊ด์ด ์๋ ํด๋์ค๋ค์๊ฒ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ ๋,
- ํ๋์ ๋ํ ๋ช ์ธ๋ง ํ์ํ ๋ฟ ๋๊ฐ ๊ทธ๊ฑธ ํ๋ํ๋์ง ์ ํ์๊ฐ ์์ ๋
(1) ์๋ก ์ฐ๊ด ์๋ ํด๋์ค๋ค์๊ฒ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ ๋ถ์ฌ
์๋ก ์์ ์ฐ๊ด์ด ์๋ ํด๋์ค๋ค ์ฌ์ด์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ๋ถ์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ ์ค๋ก์ง ๊ณตํต ๊ธฐ๋ฅ ๋ช ์ธ๋ฅผ ์ํด ํด๋์ค ๊ฐ์ ์์ ๊ด๊ฒ๋ฅผ ๋ง๋ ๋ค๋ฉด ์คํ๋ ค ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์ก๋๋ฅผ ๋์ธ๋ค.
๋ํ์ ์ธ ์๋ก๋ Comparable<T> ์ธํฐํ์ด์ค๊ฐ ์๋ค. ํด๋น ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด ๊ฐ์ ๋์ ๊ด๊ณ ๋น๊ต ๊ธฐ๋ฅ์ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์ด๋ค. ์ด๋ ๋ด๊ฐ ๋ง๋ Student ํด๋์ค์ด๊ฑด, ์๋ ํํฐ ํด๋์ค ์ด๊ฑด ์๊ด์์ด ํ์ํ ์ ์๋ค. ๋ง์ฝ ๋์ ๊ด๊ณ ๋น๊ต๊ฐ ํ์ํ ๋ชจ๋ ํด๋์ค๋ฅผ ์๋ก ์์ ๊ด๊ณ๋ก ์๋๋ค๋ฉด, ํ์์๋ ์ฐ๊ด ๊ด๊ณ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ ๊ฒ์ด๋ค.
(2) ์ด๋ค ํด๋์ค๊ฐ ๊ตฌํ ๋ฐ ํ๋ํ๋์ง ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ ๋.
ํด๋์ค๊ฐ ๋๊ตฌ์ธ์ง์ ๋ํ ์ ์ฒด์ฑ์ ํ์์์ด ๋๊ตฌ๋ ๊ทธ ํ๋์ ํ๊ธฐ๋ง ํ๋ฉด๋ ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ค.
๋ํ์ ์ธ ์๋ก ๊ฒฐ์ ๊ธฐ๋ฅ์ ๋ค ์ ์๋ค.
// ๊ฒฐ์ ๊ธฐ๋ฅ ๊ณ์ฝ๋ง ์ ์
public interface PaymentGateway {
PaymentResult processPayment(PaymentRequest request);
void refund(String transactionId);
}
// ๋ค์ํ ์ 3์๊ฐ ๊ตฌํ
class KakaoPayGateway implements PaymentGateway { /* ์นด์นด์คํ์ด ๊ตฌํ */ }
class NaverPayGateway implements PaymentGateway { /* ๋ค์ด๋ฒํ์ด ๊ตฌํ */ }
class TossPayGateway implements PaymentGateway { /* ํ ์คํ์ด ๊ตฌํ */ }
๊ฒฐ์ ๊ธฐ๋ฅ์ ๋๊ตฐ๊ฐ ๊ทธ ์ญํ ์ ์ํํ๋ฉด ๋์ง ๋๊ฐ ์ํํ๋์ง๋ ์ ํ์๊ฐ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์์ ๊ด๊ณ์ธ class๋ณด๋ค interface๊ฐ ๋ ์ ํฉํ๋ค.
4. ํต์ฌ ์์ฝ
์ธํฐํ์ด์ค๋ ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋ช ์ธ๋ง ์ ํ ๊ณ์ฝํ ์ถ์ ์๋ฃํ์ด๋ค.
๊ณ์ฝํ์ด๋ผ ํํํ ์ด์ ๋ ์ฌ์ฉ์์๋ ์ํ๋ ๋งค์๋ ํธ์ถ ์, ๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ๊ณ์ฝ์ ๋งบ๊ณ , ๊ตฌํ ํด๋์ค์๋ ์ธ์๋ฅผ ๋ฐ์ ํน์ ํ๋์ ์ํํ๊ณ ์ฝ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ๊ณ์ฝ์ ๋งบ๊ธฐ ๋๋ฌธ์ด๋ค.- ์ธํฐํ์ด์ค ํ์ฉ ์ ๋
ผ๋ฆฌ์ ์ผ๋ก๋ ์ฝ๋ ์์ผ๋ก๋ ๊ฒฐํฉ๋๊ฐ ์ค์ด๋ ๋ค.
๋ ผ๋ฆฌ์ ๊ฒฐํฉ๋ ๊ฐ์: ์ฌ์ฉ์๊ฐ ์์ ์ด ์ฌ์ฉํ๊ณ ํ ๊ตฌํ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ๊ตฌํ์ฒด์ ์๋ ๋ฐฉ์๊ณผ ๋ฐํ ๊ฐ์ ์๊ณ ์์ด์ผ ํ ์ด์ ๊ฐ ์์ด์ง๋ค.์ฝ๋ ์ ๊ฒฐํฉ๋ ๊ฐ์: ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ๊ณ ์๋ ์์กด ํ๋ฆ์, ๋ ๋ชจ๋ ๋ชจ๋ ์ถ์์ฒด์ ์์กดํ๋๋ก ํ์ฌ ๊ทธ ๋ฐฉํฅ์ ์ญ์ ์ํจ๋ค. ์ด๋ ์ ์์ค์ ์ค๋ฅ ์ ํ์ ๋ฐ๋ฅธ ๊ณ ์์ค ์๋น์ค ์ค๋จ์ ์๋ฐฉํ๊ณ , ๋จ์ ๋ณ ์ ์ง ๋ณด์๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ์ ๊ฒฐํฉ๋๊ฐ ๊ฐ์ํ๋ค.
- ๊ตฌ์ฑ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฉค๋ฒ ๋ณ์๋ ์์๋ง ๊ฐ๋ฅํ๋ค. -> ์์๋ ์์์ด ๊ฐ๋ฅํจ.
- static ๋งค์๋๋ ์ธํฐํ์ด์ค์ ์ ํธ๋ฆฌํฐ ํจ์, ํฉํ ๋ฆฌ ๋งค์๋๋ก ํ์ฉ๋๋ฉฐ ์์์ด ์๋๋ค.
- default ๋งค์๋๋ ์ธํฐํ์ด์ค์ ์ด์ ๋ฒ์ ๊ตฌํ์ฒด์์ ํธํ์ฑ์ ์ํด ์ถ์๋์๊ณ , ์ธํฐํ์ด์ค ๋ ๋ฒจ์์๋ ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ง๋ค. ์ค๋ฒ๋ผ์ด๋ฉ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ฃฝ์์ ๋ค์ด์๋ชฌ๋ ๋ฌธ์ ๋ฅผ ์กฐ์ฌํด์ผ ํ๋ค.
- private๋ static์ด๋ default ํจ์์ ๊ณตํต ๋ก์ง ๋ถ๋ฆฌ๋ฅผ ์ํด์๋ง ์ฐ์ธ๋ค.
- ์ธํฐํ์ด์ค์ ์ฌ์ฉ ์์ ์ ํด๋์ค์ ์ ์ฒด์ฑ๋ณด๋ค ํด๋์ค์ ๊ธฐ๋ฅ์ด๋ ํ๋์ด ์ค์๋์ด์ผ ํ๋ ๊ฒฝ์ฐ์ด๋ค.