SKILL/JAVA

์ž๋ฐ” : Heap pollution ์ด๋ž€?

Jedy_Kim 2021. 9. 2. 17:40
728x90

-๐Ÿš€ 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

 

๋ฐ˜์‘ํ˜•