1) ๋ณ์ฑ (Variance) - ๊ณต๋ณ์ฑ (Covariance), ๋ฐ๊ณต๋ณ์ฑ (Contravariance), ๋ฌด๊ณต๋ณ์ฑ (InVariance)
- ์ ๋ค๋ฆญ์ ์์ผ๋์นด๋๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์, ์์์ผ ํ ๊ฐ๋ ์ด ์๋๋ฐ ๊ทธ๊ฒ์ ๋ฐ๋ก ๊ณต๋ณ์ฑ, ๋ฐ๊ณต๋ณ์ฑ, ๋ฌด๊ณต๋ณ์ฑ ํฉ์ณ์ ๋ณ์ฑ์ด๋ผ๋ ๊ฐ๋ ์ด๋ค.
- ๋ณ์ฑ์ ํ์ ์ ์์ ๊ณ์ธต ๊ด๊ณ์์ ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ณต๋ณ์ฑ์ ํ์ ์ ์์ ๊ณ์ธต ๊ด๊ณ์์ ์๋ก ๋ค๋ฅธ ํ์ ๊ฐ์ ํจ๊ป ๋ณํ ์ ์๋ค๋ ํน์ง์ ๋งํ๋ฉฐ, ์ด๋ฅผ ๊ฐ์ฒด ์งํฅ ๊ฐ๋ ์ผ๋ก ํํํ๋ฉด SOLID ์์น ์ค Liskov ์นํ ์์น์ ํด๋นํ๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด (Array)๊ณผ ๋ฆฌ์คํธ (List)๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด, Java์์์ ๊ฐ ๋ณ์ฑ์ ํน์ง์ ์๋์ ๊ฐ๋ค.
(1) ๊ณต๋ณ์ฑ
- S๊ฐ T์ ํ์ ํ์ ์ด๋ฉด, S[]๋ T[]์ ํ์ ํ์ ์ด๋ค.
- S๊ฐ T์ ํ์ ํ์ ์ด๋ฉด, List<S>๋ List<T>์ ํ์ ํ์ ์ด๋ค.
(2) ๋ฐ๊ณต๋ณ์ฑ
- S๊ฐ T์ ํ์ ํ์ ์ด๋ฉด, T[]๋ S[]์ ํ์ ํ์ ์ด๋ค. // (๊ณต๋ณ์ ๋ฐ๋)
- S๊ฐ T์ ํ์ ํ์ ์ด๋ฉด, List<T>๋ List<S>์ ํ์ ํ์ ์ด๋ค. // (๊ณต๋ณ์ ๋ฐ๋)
(3) ๋ฌด๊ณต๋ณ์ฑ
- S์ T๋ ์๋ก ๊ด๊ณ๊ฐ ์๋ค, List<S>์ List<T>๋ ์๋ก ๋ค๋ฅธ ํ์ ์ด๋ค.
- ์ ์ดํด๋ณด๋ฉด ๊ฐ์ฒด ์งํฅ์ ํน์ง ์ค ํ๋์ธ ๋คํ์ฑ์์ ๋ฐฐ์ ๋ ์ ์บ์คํ ๊ณผ ๋ค์ด ์บ์คํ ์ ๋ด์ฉ๊ณผ ๋น์ทํ๋ค.
- ๊ทธ๋ ๋ค๋ฉด ํด๋น ๋ด์ฉ์ Java ์ฝ๋๋ก ์ฝ๋ฉํด๋ณด์!
(4) ๋ฐฐ์ด๊ณผ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๊ณต๋ณ์ฑ, ๋ฌด๊ณต๋ณ์ฑ
/* ๋ฐฐ์ด (Array) */
Object[] ๊ณต๋ณ์ฑ = new Integer[10]; // OK
/* ๋ฆฌ์คํธ (List) */
List<Object> ๊ณต๋ณ์ฑ = new ArrayList<Integer>(); // ERROR ๋ฐ์
List<Integer> ๋ฐ๊ณต๋ณ์ฑ = new ArrayList<Object>(); // ERROR ๋ฐ์
- ๋ฐฐ์ด์์๋ ๊ณต๋ณ์ฑ์ ์ฑ์ง์ด ์ ์ฉ๋๋ ๋ฐ๋ฉด ๋ฆฌ์คํธ์์๋ ๊ณต๋ณ์ฑ๊ณผ ๋ฐ๊ณต๋ณ์ฑ์ ์ฑ์ง์ด ์ ์ฉ๋์ง ์๋๋ค.
- ์๋ํ๋ฉด Java๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ๋ํด์๋ ๊ณต๋ณ์ฑ ์ฑ์ง์ด ์ ์ฉ๋์ง๋ง, ์ ๋ค๋ฆญ ํ์ ์ ๋ํด์ ๊ณต๋ณ์ฑ, ๋ฐ๊ณต๋ณ์ฑ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฆ, ๋ค์ ๋งํด Java์์ ์ ๋ค๋ฆญ์ ๋ฌด๊ณต๋ณ์ ์ฑ์ง์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค.
- ํด๋น ๋ด์ฉ์ ์๋ฌด๋๋ ์ง๊ด์ ์ผ๋ก ๋ฐ์๋ค์ด๊ธฐ๊ฐ ํ๋ ๋ถ๋ถ์ผ ์ ์๋๋ฐ ์ธ์ด ์์ฒด์์ ์ ํ ๊ท์น์ด๋ฏ๋ก ๋ฐ๋ผ์ผํ๊ณ ๋ค์์ผ๋ก ๋คํ์ฑ์ ๋ด์ฉ์ ์ ๊น ์๊ธฐํ๊ณ ์ ๋ค๋ฆญ์์ ๊ณต๋ณ์ฑ์ ์ง์ํ์ง ์์์ ์๊ธฐ๋ ๋ฌธ์ ์ ๋ํด ์์๋ณด์!
- ์ผ์ชฝ ๊ทธ๋ฆผ์ Object → Number → Wrapper Class ๊ฐ์ ์์ ๊ณ์ธต๋๋ฅผ ๋ํ๋ธ๋ค.
- ์ ์ฐจ ์งํฅ๊ณผ๋ ๋ฌ๋ฆฌ ๊ฐ์ฒด ์งํฅ์์์ ๊ฐ๋ ฅํ ํน์ง์ ์บก์ํ, ์์, ์ถ์ํ, ๋คํ์ฑ์ด๋ค.
- ๋ํ, ๋คํ์ฑ์ ํน์ง์ ํ์ฉํ์ฌ ๋ถ๋ชจ(์กฐ์) ↔ ์์ ํด๋์ค ๊ฐ ํ๋ณํ์ด ๊ฐ๋ฅํ๋ค.
Object parent = new Object();
Integer child = new Integer(3);
// ๋คํ์ฑ - ์
์บ์คํ
parent = child;
---
Object parent = new Integer(3;
Integer child;
// ๋คํ์ฑ - ๋ค์ด ์บ์คํ
child = (Integer) parent;
- ๋ฌผ๋ก , ์ผ๋ฐ ํด๋์ค๊ฐ ์๋ ์ ๋ค๋ฆญ ํด๋์ค์ฌ๋ ๋๊ฐ์ด ๋คํ์ฑ์ด ์ ์ฉ๋๋ ๊ฑด ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
- ์๋์ ๊ทธ๋ฆผ์ ์ปฌ๋ ์ ํ๋ ์์ํฌ์ Collection๊ณผ ๊ทธ์ ํ์ ํ์ ์ธ ArrayList๋ ์๋ก ์กฐ์ ↔ ์์ ์์ ๊ด๊ณ์ ์๊ธฐ ๋๋ฌธ์ ์บ์คํ ์ด ๊ฐ๋ฅํ๋ค.
Collection<Integer> parent;
ArrayList<Integer> child = new ArrayList<>();
parent = child; // ๋คํ์ฑ - ์
์บ์คํ
Collection<Integer> parent = new ArrayList<>();
ArrayList<Integer> child = (ArrayList<Integer>) parent; // ๋คํ์ฑ - ๋ค์ด์บ์คํ
- ๋ฐ๋ฉด์ ์ ๋ค๋ฆญ์ ํ์ ํ๋ผ๋ฏธํฐ(๊บฝ์ ๊ดํธ) ๋ผ๋ฆฌ๋ ํ์ ์ด ์๋ฌด๋ฆฌ ์์ ๊ด๊ณ์ ๋์ธ๋ค ํ๋ค ์บ์คํ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ์๋ํ๋ฉด ์ ๋ค๋ฆญ์ ๋ฌด๊ณต๋ณ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ์ ์ ๋ฌ๋ฐ์ ๋ฑ ๊ทธ ํ์ ์ผ๋ก๋ง ์๋ก ์บ์คํ ์ด ๊ฐ๋ฅํ๋ค.
ArrayList<Object> parent = new ArrayList<>();
ArrayList<Integer> child = new ArrayList<>();
parent = child; // ! ์
์บ์คํ
๋ถ๊ฐ๋ฅ
child = parent; // ! ๋ค์ด์บ์คํ
๋ถ๊ฐ๋ฅ
→ ArrayList<Object> โฎ ArrayList<Number> โฎ ArrayList<Integer>
- ์ฆ, ๊บฝ์ ๊ดํธ ๋ถ๋ถ์ ์ ์ธํ ์์ ํ์ (Raw Type) ๋ถ๋ถ์ ๊ณต๋ณ์ฑ์ด ์ ์ฉ๋์ง๋ง, ๊บฝ์ ๊ดํธ ์์ ํ์ ํ๋ผ๋ฏธํฐ์ ๋ํด์๋ ์ ์ฉ์ด ๋์ง ์๋ ๋ค๋ ๊ฒ์ด๋ค.
(5) ๊ณต๋ณ์ฑ์ด ์์ผ๋ฉด ์๊ธฐ๋ ๋ฌธ์ ์
- ์ ๋ค๋ฆญ์ด ๊ฐ์ง ๋ฌด๊ณต๋ณ์ ์ฑ์ง์ด ๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ ๋งค๊ฐ๋ณ์๋ก ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ๋, ์ธ๋ถ์์ ๋์ ๋๋ ์ธ์์ ์บ์คํ ๋ฌธ์ ๋ก ์ธํด ์ ๋ก์ฌํญ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ๋ฆฌ์คํธ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ํํด์ ์ถ๋ ฅํด์ฃผ๋ print() ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด๋ฅผ ๋ฐฐ์ด๋ก ๊ตฌํํด๋ณด์!
public static void print(Object[] arr) {
for (Object e : arr) {
System.out.println(e);
}
}
public static void main(String[] args) {
Integer[] integers = {1, 2, 3};
print(integers); // [1, 2, 3]
}
- ๋ฐฐ์ด๋ก ๊ตฌํํ์ ๋๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ์คํ๋๋๋ฐ ๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ ๋ฐฐ์ด์ด ์๋ ์ ๋ค๋ฆญ ํด๋์ค๋ก ๊ตฌํํด๋ณด์!
public static void print(List<Object> arr) {
for (Object e : arr) {
System.out.println(e);
}
}
public static void main(String[] args) {
List<Integer> integers = Arrays.asList(1, 2, 3);
print(integers); // ERROR ๋ฐ์
}
- ์ ๋ค๋ฆญ ํด๋์ค๋ก ๊ตฌํํ์ ๋, ๋ฉ์๋ ํธ์ถ ๋ถ๋ถ์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ ๋ฐฐ์ด ๊ฐ์ ๊ฒฝ์ฐ print() ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก Integer[] ๋ฐฐ์ด ํ์ ์ด Object[] ๋ฐฐ์ด ํ์ ์ผ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ ์บ์คํ ์ด ์ ์ฉ๋์ด ๋ฌธ์ ๊ฐ ์์ง๋ง, List์ ๊ฒฝ์ฐ, ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ค๋ก์ง ๋๊ฐ์ ํ์ ๋ง ๋ฐ๊ธฐ ๋๋ฌธ์ ์บ์คํ ์ด ๋์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
- ์ฆ, ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ ๋ฐ๋ ํ๋ผ๋ฏธํฐ์ ์ ๋ค๋ฆญ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ Integer๋ก ๊ณ ์ ๋ ํ์ ์ผ๋ก ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ธ๋ฐ ํด๋น ๋ฉ์๋์ ๋ฐ๋์ Integer ํ์ ๋ง ๋ค์ด์จ๋ค๋ ๋ณด์ฅ๋ ์์ผ๋ฉฐ ๋ง์ผ Double ํ์ด๋ ์์ ํ์ ์ธ Number ํ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ์ ์ ๊ฐ๋ ๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ฉ ํด์ฃผ์ด์ผ ํ๋ค.
public static void print(List<Integer> arr) { }
public static void print(List<Double> arr) { }
public static void print(List<Number> arr) { }
- ๊ทธ๋ ๋ค๋ฉด ์ ๋ค๋ฆญ์ ์๋ฐ์ ํน์ง์ด๋ผ๊ณ ํ ์ ์๋ ๊ฐ์ฒด ์งํฅ์ ์ ํ ์ด์ฉํ์ง ๋ชปํ๋ ๊ฒ์ด ๋๋ฏ๋ก ์์ ๊ฐ์ด ๋นํจ์จ์ ์ผ๋ก ์ฝ๋ฉํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์ ๋ค๋ฆญ์ ์์ผ๋์นด๋์ด๋ค.
[์ฐธ๊ณ ] ๋ฐฐ์ด์ ์ ๊ณต๋ณ (Covariant)์ด๊ณ ์ ๋ค๋ฆญ์ ๋ฌด๊ณต๋ณ (Invariant)์ธ์ง์ ๋ํ ๊ณ ์ฐฐ
- ๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด ๋ฐฐ์ด์ ์ ๋ค๋ฆญ์ด ๋ง๋ค์ด์ง๊ธฐ ์ ๋ถํฐ ์์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ๋ฐฐ์ด์ ๋ง๋ค ๋น์์๋ ๋คํ์ฑ์ ๊ฐ์ง๊ธฐ ์ํด์ ๊ณต๋ณ์ฑ์ ๊ฐ์ง๋๋ก ๋ง๋ค์๋ค.
- ๋ค๋ง ์ ๋ค๋ฆญ์ ๋ง๋ค ๋น์์๋ Convariant ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด invariant ํ๊ฒ ์ค๊ณ๋์๋ค.
- ์ด์ ๊ด๋ จ๋ ๋ด์ฉ์ด๋ ์ฝ๋๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ด์ ์์ ์์ธํ๊ฒ ์ค๋ช ํ์ผ๋ฏ๋ก ์๋ตํ๋ค.
[Reference]
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%AD-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C-extends-super-T-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4
https://junroot.github.io/programming/Java-%EB%B0%B0%EC%97%B4%EA%B3%BC-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%9D%98-%EA%B3%B5%EB%B3%80%EC%84%B1%EA%B3%BC-%EB%B0%98%EA%B3%B5%EB%B3%80%EC%84%B1,-%EB%AC%B4%EA%B3%B5%EB%B3%80%EC%84%B1/
๋ฐ์ํ
'๐ง Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Optional<T> ํด๋์ค๋ ๋ฌด์์ธ์ง ์์๋ณด์! (0) | 2023.09.03 |
---|---|
IntelliJ ์ธ์ฝ๋ฉ ์ค์ (0) | 2023.08.18 |
์ ๋ค๋ฆญ (4) - ์ ํ๋ ํ์ ํ๋ผ๋ฏธํฐ (0) | 2023.07.23 |
์ ๋ค๋ฆญ (3) - ์ ๋ค๋ฆญ ํด๋์ค์ ์ ๋ค๋ฆญ ๋ฉ์๋ (0) | 2023.07.22 |
์ ๋ค๋ฆญ (2) - ์ ๋ค๋ฆญ & ํ์ ํ๋ผ๋ฏธํฐ (0) | 2023.07.22 |