1๏ธโฃ์ธํฐํ์ด์ค ์ญํ
์ธํฐํ์ด์ค๋ ์ฌ์ ์ ์ธ ์๋ฏธ๋ก '๋ ์ฅ์น๋ฅผ ์ฐ๊ฒฐํ๋ ์ ์๊ธฐ'๋ฅผ ๋งํ๋ค. ์ฌ๊ธฐ์ ๋ ์ฅ์น๋ฅผ ๊ฐ์ฒด๋ก ๋ณด๋ฉด, ์ธํฐํ์ด์ค๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ์ญํ ์ ํ๋ค.
๊ฐ์ฒด A๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด B์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๊ฐ์ฒด A๋ก ์ ๋ฌํด์ค๋ค. ์ ์ด๋ ๊ฒ ์ค๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์น๋๋ก ํ๋๊ฒ์ผ๊น? ๊ฐ์ฒด B๊ฐ ๊ฐ์ฒด C๋ก ๊ต์ฒด๋๋ค๊ณ ๊ฐ์ ํ์.
๊ฐ์ฒด A๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ์ฌ์ฉํ๋ฏ๋ก ๊ฐ์ฒด B๊ฐ ๊ฐ์ฒด C๋ก ๋ณ๊ฒฝ๋ ๊ฒ์๋ ๊ด์ฌ์ด ์๋ค. ๋ง์ฝ ์ธํฐํ์ด์ค ์์ด ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒด B๋ฅผ ์ง์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ฒด A์ ์์ค ์ฝ๋๋ฅผ ๊ฐ์ฒด B์์ ๊ฐ์ฒด C๋ก ๋ณ๊ฒฝํ๋ ์์ ์ด ์ถ๊ฐ๋ก ํ์ํ ๊ฒ์ด๋ค. (์ฆ, ๊ฐ์ด๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๋ ์ผ๋ก์จ, ๊ฐ์ฒด A๋ ๊ฐ์ฒด B๊ฐ ๊ฐ์ฒด C๋ก ๋ณ๊ฒฝ๋๋ , ๊ฐ์ฒด D๋ก ๋ณ๊ฒฝ๋๋ ์๊ด์์ด ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ ๊ทผํ ์ ์๋ค.) ๋, ๊ฐ์ฒด B์ ๊ฐ์ฒด C์ ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค๋ฉด, ๊ฐ์ฒด A๋ ๊ฐ์ฒด ๊ต์ฒด๋ก ์ธํด ์๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค. ์ฆ, ์ธํฐํ์ด์ค๋ก ์ธํด ๋คํ์ฑ์ด ๊ตฌํ๋๋ ๊ฒ์ด๋ค.
2๏ธโฃ์ธํฐํ์ด์ค ์ ์ธํ๊ธฐ
//์ธํฐํ์ด์ค์ ์ ๊ธ ์ ํ์ : default, public ๋ง ๊ฐ๋ฅ
public interface InterfaceA {
//public ์์ ํ๋
//public ์ถ์ ๋ฉ์๋
public void turnOn();
//public ๋ํดํธ ๋ฉ์๋
//public ์ ์ ๋ฉ์๋
//private ๋ฉ์๋
//private ์ ์ ๋ฉ์๋
}
3๏ธโฃ๊ตฌํ ํด๋์ค ์ ์ธ
//implements ํค์๋๋ ํด๋น ํด๋์ค๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค๋ ๋ป,
//์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ฉ์๋๊ฐ ์๋ค๋ ๋ป
public class ImplClassA implements InterfaceA {
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.");
}
}
4๏ธโฃ๋ณ์ ์ ์ธ๊ณผ ๊ตฌํ ๊ฐ์ฒด ๋์
์ธํฐํ์ด์ค๋ ํ๋์ ํ์ ์ด๋ฏ๋ก ๋ณ์์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ธํฐํ์ด์ค๋ ์ฐธ์กฐ ํ์ ์ ์ํ๋ฏ๋ก null ๋์ ๊ฐ๋ฅํ๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ํด์ผ ํ๋ค. (์ ํํ ๋งํ๋ฉด ๊ตฌํ ๊ฐ์ฒด์ ๋ฒ์ง ๋์ ) ์ธํฐํ์ด์ค ๋ณ์์ ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋์ ๋์๋ค๋ฉด ๋ณ์๋ฅผ ํตํด ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋๋ค. ์ธํฐํ์ด์ค ๋ณ์๋ฅผ ํตํด turnOn() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ์ค์ ๋ก ์คํ๋๋ ๊ฒ์ ImplClassA์์ ์ฌ์ ์๋ turnOn() ๋ฉ์๋ ์ด๋ค.
public class InterfaceExample {
public static void main(String[] args) {
InterfaceA a=new ImplClassA();
a.turnOn();//๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.
}
}
public class ImplClassB implements InterfaceA {
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค B๋ฅผ ํต๋๋ค.");
}
}
public class InterfaceExample {
public static void main(String[] args) {
InterfaceA a=new ImplClassA();
a.turnOn();//๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.
a = new ImplClassB();
a.turnOn();//๊ตฌํํด๋์ค B๋ฅผ ํต๋๋ค.
}
}
5๏ธโฃ์์ ํ๋
์ธํฐํ์ด์ค๋ public static final ํน์ฑ์ ๊ฐ๋ ๋ถ๋ณ์ ์์ ํ๋๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์๋ค.
์ธํฐํ์ด์ค์ ์ ์ธ๋ ํ๋๋ ๋ชจ๋ public static final ํน์ฑ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์๋ตํด๋ ์๋์ ์ผ๋ก ์ปดํ์ผ ๊ณผ์ ์ ๋ถ๊ฒ ๋๋ค. ์์๋ช ์ ๋๋ฌธ์๋ก ์์ฑํ๋, ์๋ก ๋ค๋ฅธ ๋จ์ด๋ก ๊ตฌ์ฑ๋์ด ์์ ๊ฒฝ์ฐ _ ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๊ด๋ก
public interface InterfaceA {
//public ์์ ํ๋
int MAX_VALUE = 10;
int MIN_VALUE = 0;
//public ์ถ์ ๋ฉ์๋
public void turnOn();
//public ๋ํดํธ ๋ฉ์๋
//public ์ ์ ๋ฉ์๋
//private ๋ฉ์๋
//private ์ ์ ๋ฉ์๋
}
public class InterfaceExample {
public static void main(String[] args) {
//์์๋ ๊ตฌํ ๊ฐ์ฒด์ ๊ด๋ จ ์๋ ์ธํฐํ์ด์ค ์์ ๋ฉค๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค๋ก ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ
System.out.println(InterfaceA.MIN_VALUE+"~"+InterfaceA.MAX_VALUE);//1~10
}
}
6๏ธโฃ์ถ์ ๋ฉ์๋
์ธํฐํ์ด์ค๋ ๊ตฌํ ํด๋์ค๊ฐ ์ฌ์ ์ํด์ผ ํ๋ public ์ถ์ ๋ฉ์๋๋ฅผ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์๋ค. ์ถ์ ๋ฉ์๋๋ ๋ฆฌํด ํ์ , ๋ฉ์๋๋ช , ๋งค๊ฐ๋ณ์๋ง ๊ธฐ์ ๋๊ณ ์ค๊ดํธ{}๋ฅผ ๋ถ์ด์ง ์๋ ๋ฉ์๋๋ฅผ ๋งํ๋ค.(์คํ๋ถ๊ฐ ์๋) public abstract๋ฅผ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ ์๋์ผ๋ก ๋ถ๊ฒ ๋๋ค.
public interface InterfaceA {
//public ์์ ํ๋
int MAX_VALUE = 10;
int MIN_VALUE = 0;
//์ถ์ ๋ฉ์๋
void turnOn();
void turnOff();
void setVolume(int volume);
//public ๋ํดํธ ๋ฉ์๋
//public ์ ์ ๋ฉ์๋
//private ๋ฉ์๋
//private ์ ์ ๋ฉ์๋
}
public class ImplClassA implements InterfaceA {
private int volume;
//InterfaceA์ ์ ์ธ๋ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.");
}
@Override
public void turnOff() {
// TODO Auto-generated method stub
System.out.println("๊ตฌํํด๋์ค A๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > InterfaceA.MAX_VALUE) {
this.volume = InterfaceA.MAX_VALUE;
} else if (volume < InterfaceA.MIN_VALUE) {
this.volume = InterfaceA.MIN_VALUE;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ ๋ณผ๋ฅจ : "+this.volume);
}
}
public class ImplClassB implements InterfaceA {
private int volume;
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค B๋ฅผ ํต๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("๊ตฌํํด๋์ค B๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > InterfaceA.MAX_VALUE) {
this.volume = InterfaceA.MAX_VALUE;
} else if (volume < InterfaceA.MIN_VALUE) {
this.volume = InterfaceA.MIN_VALUE;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ ๋ณผ๋ฅจ : "+this.volume);
}
}
๊ตฌํ ํด๋์ค์์ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ ์ฃผ์ํ ์ ์ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก public ์ ๊ทผ ์ ํ์ ๊ฐ๊ธฐ ๋๋ฌธ์ public๋ณด๋ค ๋ ๋ฎ์ ์ ๊ทผ ์ ํ์ผ๋ก ์ฌ์ ์ํ ์ ์๋ค. ๊ทธ๋์ ์ฌ์ ์๋๋ ๋ฉ์๋์๋ ๋ชจ๋ public์ด ์ถ๊ฐ๋์ด ์๋ค.
public class InterfaceExample {
public static void main(String[] args) {
InterfaceA a = new ImplClassA();
a.turnOn();//๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.
a.setVolume(20);//ํ์ฌ ๋ณผ๋ฅจ : 10
a.turnOff();//๊ตฌํํด๋์ค A๋ฅผ ๋๋๋ค.
a = new ImplClassB();
a.turnOn();//๊ตฌํํด๋์ค B๋ฅผ ํต๋๋ค.
a.setVolume(-1);//ํ์ฌ ๋ณผ๋ฅจ : 0
a.turnOff();//๊ตฌํํด๋์ค B๋ฅผ ๋๋๋ค
}
}
7๏ธโฃ๋ํดํธ ๋ฉ์๋
์ธํฐํ์ด์ค์๋ ์์ ํ ์คํ ์ฝ๋๋ฅผ ๊ฐ์ง ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค. ์ถ์ ๋ฉ์๋๋ ์คํ๋ถ๊ฐ ์์ง๋ง, ๋ํดํธ ๋ฉ์๋๋ ์คํ๋ถ๊ฐ ์๋ค. ์ ์ธ ๋ฐฉ๋ฒ์ ํด๋์ค ๋ฉ์๋์ ๋์ผํ๋ฐ, ์ฐจ์ด์ ์ default ํค์๋๊ฐ ๋ฆฌํด ํ์ ์์ ๋ถ๋๋ค.
๊ตฌํ ํด๋์ค๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ ์์ ์ ๋ง๊ฒ ์์ ํ ์๋ ์๋ค. ์ฌ์ ์ ์ ์ฃผ์ํ ์ ์ public ์ ๊ทผ ์ ํ์๋ฅผ ๋ฐ๋์ ๋ถ์ฌ์ผ ํ๊ณ , default ํค์๋๋ฅผ ์๋ตํด์ผ ํ๋ค. ImplClassB์ setMute() ๋ฉ์๋๋ฅผ ์ฌ์ ํด ์๋ ๋ณผ๋ฅจ์ผ๋ก ๋ณต์ํด๋ณด์.
public interface InterfaceA {
//public ์์ ํ๋
int MAX_VALUE = 10;
int MIN_VALUE = 0;
//์ถ์ ๋ฉ์๋
void turnOn();
void turnOff();
void setVolume(int volume);
//public ๋ํดํธ ๋ฉ์๋
default void setMute(boolean mute) {
if (mute) {
System.out.print("๋ฌด์์ฒ๋ฆฌ ");
setVolume(MIN_VALUE);
} else {
System.out.print("๋ฌด์ํด์ ");
}
}
//public ์ ์ ๋ฉ์๋
//private ๋ฉ์๋
//private ์ ์ ๋ฉ์๋
}
public class ImplClassA implements InterfaceA {
private int volume;
//InterfaceA์ ์ ์ธ๋ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค A๋ฅผ ํต๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("๊ตฌํํด๋์ค A๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > InterfaceA.MAX_VALUE) {
this.volume = InterfaceA.MAX_VALUE;
} else if (volume < InterfaceA.MIN_VALUE) {
this.volume = InterfaceA.MIN_VALUE;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ ๋ณผ๋ฅจ : "+this.volume);
}
}
public class ImplClassB implements InterfaceA {
private int volume;
@Override
public void turnOn() {
System.out.println("๊ตฌํํด๋์ค B๋ฅผ ํต๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("๊ตฌํํด๋์ค B๋ฅผ ๋๋๋ค.");
}
@Override
public void setVolume(int volume) {
if (volume > InterfaceA.MAX_VALUE) {
this.volume = InterfaceA.MAX_VALUE;
} else if (volume < InterfaceA.MIN_VALUE) {
this.volume = InterfaceA.MIN_VALUE;
} else {
this.volume = volume;
}
System.out.println("ํ์ฌ ๋ณผ๋ฅจ : " + this.volume);
}
//์ถ๊ฐํ ํ๋
private int memoryVolume;
//์ฌ์ ์ํ ๋ํดํธ ๋ฉ์๋
@Override
public void setMute(boolean mute) {
if (mute) {
this.memoryVolume = this.volume;
System.out.print("๋ฌด์์ฒ๋ฆฌ ");
setVolume(InterfaceA.MIN_VALUE);
} else {
System.out.print("๋ฌด์ํด์ ");
setVolume(this.memoryVolume);
}
}
}
8๏ธโฃ์ ์ ๋ฉ์๋
์ถ์ ๋ฉ์๋์ ๋ํดํธ ๋ฉ์๋๋ ๊ตฌํ ๊ฐ์ฒด๊ฐ ํ์ํ์ง๋ง, ์ ์ ๋ฉ์๋๋ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก ํธ์ถํ ์ ์๋ค. public์ ์๋ตํ๋๋ผ๋ ์๋์ผ๋ก ์ปดํ์ผ ๊ณผ์ ์์ ๋ถ์.
public interface InterfaceA {
//public ์์ ํ๋
int MAX_VALUE = 10;
int MIN_VALUE = 0;
//์ถ์ ๋ฉ์๋
void turnOn();
void turnOff();
void setVolume(int volume);
//public ๋ํดํธ ๋ฉ์๋
default void setMute(boolean mute) {
if (mute) {
System.out.print("๋ฌด์์ฒ๋ฆฌ ");
setVolume(MIN_VALUE);
} else {
System.out.print("๋ฌด์ํด์ ");
}
}
//public ์ ์ ๋ฉ์๋
static void changeBattery() {
System.out.println("๊ฑด์ ์ง๋ฅผ ๊ตํํฉ๋๋ค.");
}
//private ๋ฉ์๋
//private ์ ์ ๋ฉ์๋
}
public class InterfaceExample {
public static void main(String[] args) {
InterfaceA.changeBattery();
}
}
์ ์ ๋ฉ์๋ ์คํ๋ถ ์์ฑ์ ์ ์ํ ์ ์, ์์ ํ๋๋ฅผ ์ ์ธํ ์ถ์ ๋ฉ์๋, ๋ํดํธ ๋ฉ์๋, private ๋ฉ์๋ ๋ฑ์ ํธ์ถํ ์ ์๋ค๋ ์ ์ด๋ค.(๊ตฌํ ๊ฐ์ฒด๊ฐ ํ์ํ ์ธ์คํด์ค ๋ฉ์๋์ด๊ธฐ ๋๋ฌธ)
9๏ธโฃprivate ๋ฉ์๋
์ธํฐํ์ด์ค์ ์์ ํ๋, ์ถ์ ๋ฉ์๋, ๋ํดํธ ๋ฉ์๋, ์ ์ ๋ฉ์๋๋ ๋ชจ๋ public ์ ๊ทผ ์ ํ์ ๊ฐ๋๋ค. ์ด ๋ฉค๋ฒ๋ค์ ์ ์ธํ ๋๋ public์ ์๋ตํ๋๋ผ๋ ์ปดํ์ผ ๊ณผ์ ์์ public ์ ๊ทผ ์ ํ์๊ฐ ๋ถ์ด ํญ์ ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
private ๋ฉ์๋๋ ๋ํดํธ ๋ฉ์๋ ์์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฐ๋ฉด, private ์ ์ ๋ฉ์๋๋ ๋ํดํธ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์ ์ ๋ฉ์๋ ์์์๋ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค. private ๋ฉ์๋์ ์ฉ๋๋ ๋ํดํธ์ ์ ์ ๋ฉ์๋๋ค์ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํจ์ด๋ค.
๐๋ค์ค ์ธํฐํ์ด์ค ๊ตฌํ
๊ตฌํ ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ implements ํ ์ ์๋ค. ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ธํฐํ์ด์คA์ ์ธํฐํ์ด์คB๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด, ๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ตฌํ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ธํฐํ์ด์ค A์ ์ธํฐํ์ด์ค B๋ฅผ implements ๋ค์ ์ผํ๋ก ๊ตฌ๋ถํด์ ์์ฑํด, ๋ชจ๋ ์ธํฐํ์ด์ค ๊ฐ์ง ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ค.
public class SmartTelevision implements RemoteControl, Searchable {
@Override
public void turnOn() {
System.out.println("TV๋ฅผ ์ผญ๋๋ค.");
}
@Override
public void turnOff() {
System.out.println("TV๋ฅผ ๋๋๋ค.");
}
@Override
public void search(String url) {
System.out.println(url+"์ ๊ฒ์ํฉ๋๋ค.");
}
}
public interface RemoteControl {
void turnOn();
void turnOff();
}
public interface Searchable {
void search(String url);
}
..์ธํฐํ์ด์ค(2)์์ ๊ณ์..
โ๋ณธ ํฌ์คํ ์ '์ด๊ฒ์ด ์๋ฐ๋ค' ๊ต์ฌ๋ฅผ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
'Java๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐งก์ค์ฒฉ ํด๋์ค,์ธํฐํ์ด์ค & ์ต๋ช ๊ฐ์ฒด (0) | 2023.01.18 |
---|---|
๐์ธํฐํ์ด์ค(2) (0) | 2023.01.16 |
๐๋ณ์์ ํ์ (0) | 2022.11.30 |
์๋ฐ์ ์์(JDK์ ์๋ฐ ํ๋ก๊ทธ๋จ ์คํ ๊ตฌ์กฐ) (0) | 2022.11.22 |
Java - ArrayList, LinkedList (0) | 2022.10.25 |