1) ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ด์
(1) ์ ๋ค๋ฆญ์ด ์๋ ์์ ์ Java ์ฝ๋
- ์ ๋ค๋ฆญ์ JDK 1.5 ๋ฒ์ ๋ถํฐ ๋ฑ์ฅํ๊ฒ ๋์๋๋ฐ ์ ๋ค๋ฆญ์ด ์กด์ฌํ์ง ์๋ ์์ ์ Java ์ฝ๋๋ฅผ ์ดํด๋ณด์!
class FruitBox {
public Object fruit;
public Object getFruit() { return fruit; }
public void setFruit(Object content) { this.fruit = fruit; }
}
class Apple { }
class Banana { }
- ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด Apple, Banana ํด๋์ค์ Apple, Banana์ ๊ฐ์ ๊ณผ์ผ์ ๋ด๋ ํด๋์ค์ธ FruitBox๊ฐ ์ ์ธ๋์ด ์๋ค.
- FruitBox ํด๋์ค์ fruit ๋ฉค๋ฒ ๋ณ์๋ ๋ค์ํ ๊ณผ์ผ ํด๋์ค (Apple, Banana, ...)๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ํน์ ํด๋์ค ํ์ ์ผ๋ก ์ ์ธํ ์ ์์ด Object ํ์ ์ผ๋ก ์ ์ธํ์๋ค.
- ๊ทธ๋ผ ์ด์ FruitBox ํด๋์ค์ ๊ณผ์ผ ํด๋์ค๋ฅผ ๋ด์๋ณด๋๋ก ํ์!
public static void main(String[] args) {
FruitBox appleBox = new FruitBox();
FruitBox bananaBox = new FruitBox();
appleBox.setFruit(new Apple());
bananaBox.setFruit(new Banana());
}
- appleBox, bananaBox ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ฐ์์ ๋ฐ์ค์ ๋ง์ถ์ด Apple ๊ณผ์ผ(๊ฐ์ฒด), Banana ๊ณผ์ผ(๊ฐ์ฒด)๋ฅผ ๋ด์์ฃผ์๋ค.
- ๋ชจ๋ ๊ฐ์ฒด๋ ๋ถ๋ชจ ํ์ ์ธ Object ํ์ ์ผ๋ก ์๋ ํ์ ๋ณํ์ด ๋๋ฏ๋ก Box ์์ Object ํ์ ์ธ fruit ๋ณ์์ Apple ๊ฐ์ฒด๋ Banana ๊ฐ์ฒด๋ ์๋์ผ๋ก ํ์ ์ด ๋ณํ๋์ด ์ ์ฅ๋๋ค!
- ๊ทธ๋ ๋ค๋ฉด ๊ฐ๊ฐ์ ๋ฐ์ค ์์ ์๋ ๋ด์ฉ๋ฌผ(๊ฐ์ฒด)์ ๊บผ๋ด๋ณด๋๋ก ํ์!
public static void main(String[] args) {
FruitBox appleBox = new FruitBox();
FruitBox bananaBox = new FruitBox();
appleBox.setFruit(new Apple());
bananaBox.setFruit(new Banana());
Apple apple = (Apple) appleBox.getFruit();
Banana banana = (Banana) bananaBox.getFruit();
}
- Box ์์ ๋ด์ฉ๋ฌผ์ ๊บผ๋ผ ๋, Box ์์ fruit ๋ณ์๋ Object ํ์ ์ด๋ฏ๋ก ์ด๋ค ๊ฐ์ฒด๊ฐ ๋์ ๋์ด ์๋์ง ์ผ๋ฐ์ ์ผ๋ก ์ ์ ์์ง๋ง ์ฐ๋ฆฌ๋ appleBox ์์ Apple ๊ณผ์ผ์ bananaBox ์์ Banana ๊ณผ์ผ์ ๋ด์ ๊ฑธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ณผ์ผ์ ํ์ ์ผ๋ก ๊ฐ์ ํ๋ณํํ์ฌ ๊บผ๋ผ ์ ์๋ค.
- ๊ทธ๋ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ฐ๊พธ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋๋์ง ์ดํด๋ณด์!
public static void main(String[] args) {
FruitBox appleBox = new FruitBox();
FruitBox bananaBox = new FruitBox();
appleBox.setFruit(new Apple());
bananaBox.setFruit(new Banana());
Apple apple = (Apple) appleBox.getFruit();
Banana banana = (Banana) appleBox.getFruit(); // ๋ฐํ์ ์๋ฌ ๋ฐ์
}
- ์ค์๋ก appleBox ์์ ์๋ ๋ด์ฉ๋ฌผ์ Banana๋ก ์ฐฉ๊ฐํ์ฌ banana ๊ฐ์ฒด์ ๊ฐ์ ํ๋ณํํ์ฌ ๋ด์์ฃผ์๋ค.
- ๊ทธ๋ฐ ๋ค์, ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ “๋ฐํ์ ์๋ฌ”๊ฐ ๋ฐ์ํ๋ค.
→ class Apple cannot be cast to class Banana (Apple and Banana are in unnamed module of loader 'app')
- ์ด์ฒ๋ผ ์ ๋ค๋ฆญ์ด ์๋ ์์ ์๋ ์์ ๊ฐ์ด ์๋ชป๋ ํ๋ณํ์ผ๋ก ์ธํ ์๋ฌ๋ฅผ “์ปดํ์ผ ์์ ”์ ์ก์๋ผ ์ ์์๋ค.
- ๋ฌผ๋ก , ๋ฐ์ค ์์ ์ด๋ ํ ๋ด์ฉ๋ฌผ์ด ์ ์ฅ๋์ด ์๋์ง ๋ชจ๋ฅธ๋ค๋ฉด instanceof ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ํ์ ์ ์กฐ์ฌํ ์๋ ์์ง๋ง ๋ชจ๋ ์ข ๋ฅ์ ํด๋์ค๋ฅผ ๋์์ผ๋ก ์กฐ์ฌํ ์๋ ์๋ค!
- ๋ค๋ง ์ฐ๋ฆฌ๋ Box๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ด๋ค ๋ด์ฉ๋ฌผ์ ๋ฃ์์ง ์ด๋ฏธ ์๊ณ ์๊ธฐ์ Box๋ฅผ ์์ฑํ ๋ ์ ์ฅํ ๋ด์ฉ๋ฌผ์ ํ์ ์ ์ปดํ์ผ๋ฌ์๊ฒ “๋ฏธ๋ฆฌ” ์๋ ค์ฃผ๋ฉด Box๋ ์ด๋ค ๊ณผ์ผ์ ์ ์ฅํ ์ ์๋์ง, ๋ ๋ฐ์ค๋ก๋ถํฐ ๊ณผ์ผ์ ๊บผ๋ผ ๋๋ ์ด๋ค ํ์ ์ ๊ณผ์ผ์ธ์ง ์ปดํ์ผ ์์ ์ ์ ์ ์๋ ๊ฒ์ด๋ค
- ๋ฐ๋ผ์, ์์ ์ปจ์ ์ ๋ฐํ์ผ๋ก ํ์ ์ ์ง์ ํ์ฌ ์ปดํ์ผ ์์ ์ ํ์ ์์ ์ฑ์ ๋ณด์ฅ๋ฐ์ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ์ํ๊ฒ ๋์๊ณ ๊ทธ๋ ๊ฒ ์ ๋ค๋ฆญ์ด ํ์ํ๊ฒ ๋์๋ค!
- ๊ทธ๋ ๋ค๋ฉด ์์ Java ์ฝ๋๋ฅผ ์ ๋ค๋ฆญ์ ์ด์ฉํ์ฌ ๋ฐ๊พธ์ด๋ณด๋๋ก ํ์!
(2) ์ ๋ค๋ฆญ์ ์ฌ์ฉํ Java ์ฝ๋
class FruitBox<T> {
public T fruit;
public T getFruit() { return fruit; }
public void setFruit(T content) { this.fruit = fruit; }
}
class Apple { }
class Banana { }
- FruitBox ํด๋์ค ์์ ๊บฝ์ “<>”๊ธฐํธ๋ฅผ ์ ๋ ฅํ๊ณ ๊ทธ ์์ ํ์ ํ๋ผ๋ฏธํฐ์ธ T๋ฅผ ๋ฃ์ด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ fruit ๋ณ์์ ํ์ , getFruit() ๋ฉ์๋์ ๋ฆฌํด ํ์ , setFruit()์ ๋งค๊ฐ๋ณ์ ํ์ ์ ๋ชจ๋ ํ์ ํ๋ผ๋ฏธํฐ์ธ T๋ก ๋ณ๊ฒฝํด์ค๋ค.
- ์ ๋ค๋ฆญ, ํ์ ํ๋ผ๋ฏธํฐ๋ ๋ค์์ ์ค๋ช ํ ์์ ์ด๊ณ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ง ์์ ์ฝ๋์ ์ฌ์ฉํ ์ฝ๋๊ฐ ์ด๋ค ์ ์ด ๋ค๋ฅธ ์ง์ ํฌ์ปค์ฑ์ ๋ง์ถฐ ๋ณด์!
- ๊ทธ๋ผ ์ด์ ๊ณผ ๋๊ฐ์ด appleBox, bananaBox ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ฐ์์ ๋ฐ์ค์ ๋ง์ถ์ด Apple ๊ณผ์ผ(๊ฐ์ฒด), Banana ๊ณผ์ผ(๊ฐ์ฒด)๋ฅผ ๋ด์ ๋ค์ ๊ณผ์ผ์ ๊บผ๋ด๋ณด๋๋ก ํ๋ค.
public static void main(String[] args) {
FruitBox<Apple> appleBox = new FruitBox<Apple>();
FruitBox<Banana> bananaBox = new FruitBox<Banana>();
appleBox.setFruit(new Apple());
bananaBox.setFruit(new Banana());
Apple apple = appleBox.getFruit();
Banana banana = appleBox.getFruit(); // ์ปดํ์ผ ์๋ฌ ๋ฐ์
}
- appleBox, bananaBox ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ฐ์์ ๋ฐ์ค์ ๋ง์ถ์ด Apple ๊ณผ์ผ(๊ฐ์ฒด), Banana ๊ณผ์ผ(๊ฐ์ฒด)๋ฅผ ๋ด์์ฃผ์๋ค.
- ๊ทธ๋ฐ ๋ค์ Box ์์ ๋ด์ฉ๋ฌผ์ ๊บผ๋ด๋๋ฐ, ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํ์ฌ appleBox ์์ ์๋ ๋ด์ฉ๋ฌผ์ Banana๋ก ์ฐฉ๊ฐํ์ฌ banana ๊ฐ์ฒด์ ๋ด๊ฒ ๋์๋ค.
- ํ์ง๋ง ์ ๋ค๋ฆญ์ ํ์ ํ๋ผ๋ฏธํฐ๋ก ์ปดํ์ผ๋ฌ์๊ฒ appleBox ์์ ์ด๋ ํ ํ์ ์ ๊ณผ์ผ์ด ๋ด๊ฒจ์๋์ง “๋ฏธ๋ฆฌ” ์๋ ค์ฃผ์๊ธฐ์ ์ปดํ์ผ ์์ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ์ด์ฒ๋ผ ์ ๋ค๋ฆญ์ ํตํด ๊ฐ๋ฐ์๋ ์๋ชป๋ ํ๋ณํ์ผ๋ก ์ธํ ์ค์๋ฅผ ์ปดํ์ผ ์์ ์ ์์๋ผ ์ ์๋ค.
- ๋ํ, ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฏธ ํ์ ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ Object ํ์ ๊ณผ ๋ค๋ฅด๊ฒ ํ๋ณํ์ ์๋ตํ ์ ์๋ค.
[์ ๋ฆฌ - ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ด์ ]
โ ๊ฐ์ฒด์ ํ์ ์ ์ปดํ์ผ ํ์์ ์ฒดํฌํ์ฌ ๊ฐ์ฒด์ ํ์ ์์ ์ฑ์ ๋์ฌ์ค๋ค.
→ ํ์ ์์ ์ฑ์ ๋์ธ๋ค๋ ๊ฒ์ ์๋ํ์ง ์์ ํ์ ์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ฒ์ ๋ง๊ณ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด์ฌ ๋, ์๋์ ํ์ ๊ณผ ๋ค๋ฅธ ํ์ ์ผ๋ก ์๋ชป ํ๋ณํ๋์ด ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ค์ฌ์ค๋ค๋ ๊ฒ์ด๋ค.
โก ๋ฐํ๊ฐ์ ๋ํ ํ์ ์ฒดํฌ์ ํ๋ณํ์ ์๋ตํ ์ ์์ด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
[Reference]
๋ฐ์ํ
'๐ง Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ค๋ฆญ (3) - ์ ๋ค๋ฆญ ํด๋์ค์ ์ ๋ค๋ฆญ ๋ฉ์๋ (0) | 2023.07.22 |
---|---|
์ ๋ค๋ฆญ (2) - ์ ๋ค๋ฆญ & ํ์ ํ๋ผ๋ฏธํฐ (0) | 2023.07.22 |
์ด๋ ธํ ์ด์ (Annotation) (0) | 2023.07.22 |
๋ฆฌํ๋ ์ (Reflection) (0) | 2023.07.22 |
(Java) JDK ๋ฐ IntelliJ ์ค์นํ๊ธฐ (2) | 2023.04.07 |