-๐ Heap pollution?
์๋ฐ์์ ํ ์ค์ผ์ ๋งค๊ฐ๋ณ์ ์ ํ์ด ์๋ก ๋ค๋ฅธ ํ์ ์ ์ฐธ์กฐํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ๋ฐ, ๋ฌธ์ ๋ ์ปดํ์ผ ์ค์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค. ๋์ค์ ๋ฐํ์ ์์ ์ ํ ์ค์ผ์ผ๋ก ClassCastException์ด ๋ฐ์ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class HeapPollutionDemo
{
public static void main(String[] args)
{
Set s = new TreeSet<Integer>();
Set<String> ss = s; // unchecked warning
s.add(new Integer(42)); // another unchecked warning
Iterator<String> iter = ss.iterator();
while (iter.hasNext())
{
String str = iter.next(); // ClassCastException thrown
System.out.println(str);
}
}
}
|
cs |
[๊ฒฐ๊ณผ]
Exception in thread "main" java.lang.ClassCastException:
class java.lang.Integer cannot be cast to class java.lang.String
(java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
at com.study.ReifiableSample.heapPollution(ReifiableSample.java:22)
at com.study.ReifiableSample.main(ReifiableSample.java:50)
๐ ์ ๋ค๋ฆญ ํ์
์ฐ์ ์ํค ์ ๋ค๋ฆญ์ ๋ํ ์ ์๋ฅผ ๋ณด๋ฉด "์ ๋ค๋ฆญ์ 2004 ๋ J2SE 5.0 ๋ฒ์ ์ Java ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ถ๊ฐ๋ ์ ๋ค๋ฆญ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์ด๋ค. ๊ทธ๊ฒ๋ค์ "์ปดํ์ผ ํ์ ํ์ ์์ ์ ์ ๊ณตํ๋ฉด์ ํ์ ์ด๋ ๋ฉ์๋๊ฐ ๋ค์ํ ํ์ ์ ๊ฐ์ฒด์์ ์๋ํ ์ ์๋๋ก"Java ํ์ ์์คํ ์ ํ์ฅํ๋๋ก ์ค๊ณ๋์๋ค."์ด๋ค. ์ฌ์ฉ๋ฒ์ ๋งํฌ๋ฅผ ํตํด ์ดํด๋ณด๊ธธ ๋ฐ๋๋ค.
์ด๋ ๊ฒ ์ค๊ฐ์ ๋์ค๋ฉด์ ๋ฌธ์ ์ ์ด ์๊ธฐ๋๋ฐ ๊ธฐ์กด Set ํด๋์ค๋ ์ ๋ค๋ฆญ์ด ์๋์๊ธฐ์ ๋ด๋ถ์ ์ผ๋ก๋ ์ ์ฅ ํ์ ์ด Object์๋ค. ํ์ง๋ง Set ํด๋์ค๋ฅผ ์ ๋ค๋ฆญ์ผ๋ก ๋ง๋ค๋ฉด์, ๊ธฐ์กด Set๊ณผ ์ ๋ค๋ฆญ์ด ์ ์ฉ๋ Set์ ํธํ์ฑ์์์ ๋ฌธ์ ๊ฐ ์๊ธด ๊ฒ์ด๋ค. ๋จํธ์ ์ธ ์๋ก Set์ ๋ค์์ง๋ง ์ปฌ๋ ์ ๋ชจ๋ ํด๋น๋๋ค. ์ด๋ฏธ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์์ ์ฌ์ฉ๋์์ผ๋ฏ๋ก ๊ธฐ์กด Set๊ณผ ์๋ก์ด ์ ๋ค๋ฆญ Set์ ์ธํฐํ์ด์ค๊ฐ ๋์ด์ผ๋ง ํ๋ค.
๊ทธ๋์ ์๋ฐ๋ ์ ๋ค๋ฆญ ํด๋์ค์ ํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ปดํ์ผ์ด ๋๋ ์์ ์ ์ ๊ฑฐํ๋๋ก ๋ง๋ค์๋ค.
ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ผ์ง ์๋ฆฌ์๋ Object ๋ฅผ ์ฝ์ ํด์ ์คํ ์์ ์์๋ ๊ธฐ์กด์ ํด๋์ค์ ๋๊ฐ์ ํด๋์ค๊ฐ ๋๋๋ก ํจ์ผ๋ก์จ ํ์ ํธํ์ฑ์ ํด๊ฒฐํ ๊ฒ์ด๋ค.
ex)
public static <T> boolean addAll(Collection<? super T> c, T...elements)
๊ฐ๋ณ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋ด๋ถ์ ์ผ๋ก๋ ์๋์ ๊ฐ์ด ์ฒ๋ฆฌ๋๋ค.
public static <T> boolean addAll(java.util.Collection c, java.lang.Object[] elements)
์ด๋ ๊ฒ Object ๋ฐฐ์ด๋ก ์ฒ๋ฆฌ๋๋ฉด, ์ ์ฌ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์ด๋ฌํ ๊ฒฝ๊ณ ๋ฅผ ์์ ๊ธฐ ์ํด์ @SafeVarargs๋ผ๋ ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํ๋ฉด ๋๋ค. ์์ Collections ํด๋์ค์ addAll() ๋ฉ์๋๋ Java7๋ถํฐ๋ ์ถ๊ฐ๋์ด ์๋ค.
์ฝ๋๋ฅผ ํตํด ์์๋ณด์.
Set s = new TreeSet<Integer>();
Set <String> ss = s;
s.add(42);
Set s ๋ณ์๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ค๋ฆญ์ ์ง์ ๋์ด ์์ง ์๊ณ , TreeSet์ <Integer>๋ก ๋ช ์ํด์ ์์ฑํ์๋ค. ๋น์ฐํ ์ฌ๊ธฐ์ ๊ฐ์ ํ ๋นํ๋ค๋ฉด, s.add(42); ์ด๋ฐ ์์ผ๋ก ๋ฃ์ด์ผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ค์ ์ค์ ๋ณด๋ฉด ์ด๋ฒ์๋ Set์ด <String>์ผ๋ก ๋ช ์๊ฐ ๋์ด ์๋ ss์, Integer s๊ฐ ๋ด๊ธด๋ค. ๊ทธ๋์ ๊ฐ์ ๋ฃ์ ๋ ss.add("42"); ์ด๋ฐ ์์ผ๋ก ๋ฃ์ด์ค์ผ ํ๋ค.
Iterator <String> iter = ss.iterator();
while (iter.hasNext())
{
String str = iter.next(); // ClassCastException thrown
System.out.println(str);
}
ss๊ฐ <String> ์ด์์ผ๋, iter <String> ์์ด ๋น์ฐํ๋ค. ์ฌ๊ธฐ๊น์ง ์ฝ๋๋ฅผ ์ง๋ ์ฌ์ค ์ปดํ์ผ๋ฌ๋ ์ด๋ ํ ์๋ฌ๋ ๊ฒฝ๊ณ ๋ ์ก์ง ์๋๋ค.
ํ์ง๋ง ๋๋ ค๋ณด๋ฉด ์์ธ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์์ ๋ค์ด์๋ ์์๋ ์ ์์ธ๋ฐ ๊ป๋ฐ๊ธฐ๋ String์ด๋ค. ์ด ๋ถ๋ถ์ด heap pollution์ด๋ค. ๋ฌผ๋ก s.add(42);๋ฅผ ์ง์ฐ๊ณ , ss.add("42"); ๋ฅผ ํ๋ฉด ์ ์ ์ถ๋ ฅ์ ๋๋ค. ํ์ง๋ง ์ค์ํ ์ ์ heap pollution์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค.
๐ ํ์ ์บ์คํ ์ฐ์ฐ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ํ๋ ๋ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ํน์ง์ด ์๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์ ์งํํ๋ค๊ฐ ํ์ ์บ์คํ ์ฐ์ฐ์ ๋ง๋ฌ์ ๋ ์บ์คํ ๋์ ๊ฐ์ฒด๋ฅผ ์บ์คํ ํ ์ ์๋๋ ์๋๋๋ ๊ฒ์ฌํ์ง ์๋๋ค. ๋จ์ง ์บ์คํ ํ์ ๋ ๋์ ๋๋ ์ฐธ์กฐ ๋ณ์์ ์ ์ฅํ ์ ์๋๋๋ง ๊ฒ์ฌํ ๋ฟ์ด๋ค. ๊ทธ๋์ ๋์ ๊ฐ์ฒด๊ฐ ์บ์คํ ํ ์ ์๋ ํ์ ์ผ๋ก ์บ์คํ ์ ์๋ํ๋ฉด ์ปดํ์ผ ํ์์ด ์๋๋ผ ๋ฐํ์์ ์ต์ ์ ์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
Set s = new TreeSet <Integer>();
Set <String> ss = s;
์ปดํ์ผ๋ฌ๊ฐ ๋ฐ๋ก ์ฒดํฌ๋ฅผ ํ์ง ์๊ณ ๊ฐ์ ๋จธ์ ์๊ฒ ๋งก๊ธฐ๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ ์๋ฃ
์ํคํผ๋์ : https://en.wikipedia.org/wiki/Heap_pollution
Heap pollution - Wikipedia
In the Java programming language, heap pollution is a situation that arises when a variable of a parameterized type refers to an object that is not of that parameterized type.[1] This situation is normally detected during compilation and indicated with an
en.wikipedia.org
https://velog.io/@adduci/Java-%ED%9E%99-%ED%8E%84%EB%A3%A8%EC%85%98-Heap-pollution
[Java] ํ ํ๋ฃจ์ (Heap pollution)
ํ๋ฃจ์ (pollution)์ ์ฌ์ ์ ์๋ฏธ๋ ์ค์ผ์ด๋ค.๋ฐ๋ผ์ ํ ํ๋ฃจ์ ์ JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ธ heap area ๊ฐ ์ค์ผ๋ ์ํ๋ฅผ ๋ปํ๋ค.์ฆ, ์ด๋ ํ ์ด์ ์์๋ ํ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๊ฒ์ ํ์ด ํ๋ฃจ์ ๋์๋ค๊ณ ํ
velog.io
์ถ๊ฐ๋ก ๋ณด๋ฉด ์ข์ ์๋ฃ
https://medium.com/@joongwon/java-java%EC%9D%98-generics-604b562530b3
[ Java] Java์ Generics
Java ์ธ์ด์์ ์ธ์ด์ ์ผ๋ก ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ์ ๋๋ก ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์ด ๊ฐ๋ ์ด Generics๊ฐ ์๋๊น ์ถ๋ค. ํ์์ ํด๋์ค๋ ์ธํฐํ์ด์ค ์ค๊ณ ์ Generics๋ฅผ ์์ฃผ ์ฌ์ฉํ๊ธด ํ์ง๋ง ์ด๋ ํ ๊ณ๊ธฐ๋ก ์ธ
medium.com
'SKILL > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ : ์ค๋ ๋(1) (0) | 2021.09.07 |
---|---|
์๋ฐ : java 7 - ๋ณด์๋ ์์ธ ์ฒ๋ฆฌ (0) | 2021.09.03 |
์ ๋ค๋ฆญ์ด๋? (0) | 2021.09.01 |
์คํ๋ง ๋ถํธ์ aws๋ก ํผ์ ๊ตฌํํ๋ ์น์๋น์ค : ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ oauth (0) | 2021.07.18 |
@Transactional(readOnly = true) ์ค๋ฅ (0) | 2021.07.17 |