์ ๋ฒ ์๊ฐ์๋ ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด์ ์ดํด๋ณด์์ต๋๋ค!
JVM์ ๋ํด ์์ธํ ๋ด์ฉ์ ํด๋น ๊ฒ์๋ฌผ์ ์ฐธ๊ณ ํ์ธ์!
์๋ฐ๋ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ๋๊ฐ?
์ค๋์ stack๊ณผ heap ์์ญ ๊ฐ ์ญํ ๊ณผ ์ฝ๋์์ ์ ํจ๊ป stack๊ณผ heap์ด ์ด๋ค์์ผ๋ก ๋ฐ๋๋์ง ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์์๋ณผ ๊ฒ์
๋๋ค!
๊ทธ๋ฆผ์์ ๋ณด๋ฉด ์ผ์ชฝ์ด stack memory์์ญ์
๋๋ค.
public class Method3 {//Day5
public static int method2(){
int num = (int)(Math.random()*6+1);
//๋ณ์์ Scope: ๋ฉ์๋์์์ ๋ง๋ค๋ฉด ๋ฉ์๋๊ฐ ๋๋ ๋ ์ฌ๋ผ์ง: {}์ฌ์ด
return num;
}
public static int[] method3(){
int[] jumsu = {90, 80, 100, 40, 70};
return jumsu;
}
public static int method4(int[] values){
int sum = 0;
for(int val: values) sum += val;
return sum;
}
public static void main(String[] args) {
System.out.println(method2());
int num = method2();
System.out.println("์ฃผ์ฌ์ ์ซ์: "+ num);
System.out.println(method3()); //[I@3498ed method3์ ์ฃผ์๊ฐ
int[] jumsu = method3();
for(int i : jumsu){
System.out.print(i + " ");
}
System.out.println();
int[] values = {10, 30, 20, 50};
int result=method4(values);
System.out.println(result);
}
์ง๊ธ stack์์๋ method2์์ ์ ์ธ๋ num์
๋๋ค. ์ด ๊ฐ์ return๋ ๋ pop๋์ด ์ฌ๋ผ์ง๋๋ค.
๋งจ ์๋ num์ main์์ ์ ์ธํด์ ๋์จ 1~6๊น์ง ๋๋ค๊ฐ์
๋๋ค! jumsu๋ 2๊ฐ๋ก ์๋๋ main์์ ์ ์ธ๋ ๋ณ์์ด๊ณ , ์๋ method3์์ ์ ์ธ๋ jumsu์
๋๋ค. ์์์๋ jumsu๋ return๋ ๋ pop๋์ด ์ฌ๋ผ์ง๋๋ค.
return๋ ๋ jumsu๊ฐ return๋ array์ ์์น๋ฅผ ์ ์ฅํ๊ฒ ๋๊ณ ํฌ์ธํฐ๋ก ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
๊ทธ์ํ๋ก main์์ values๋ฅผ ์ ์ธํ๋ฉด์ ๊ฐ์ ํ ๋นํด์ค๋๋ค. ๋ฐฐ์ด์ heap์ ์ ์ฅ๋๊ณ , ๊ทธ ์ฃผ์๊ฐ์ values์ ์ ์ฅ๋ฉ๋๋ค. main์์ ์ ์ธ๋ result๋ method4๊ฐ returnํด์ค ๊ฐ์ด ์ ์ฅ๋ ๊ฒ์
๋๋ค. method4์์ ์ ์ธ๋ sum์ for๋ฌธ์์ ์ฐ์ฐ๋์ด return๋ ๋ pop๋์ด ์ฌ๋ผ์ง๋๋ค.
method4๊ฐ ๋ฆฌํดํด์ค๊ฐ์ result์ ๋์
๋์ด ๋ณ์์ ๊ฐ์ด ํจ๊ป stack์ ์ ์ฅ๋ฉ๋๋ค.
๋ฉ์ธ์ด ๋๋๋ฉด main์ stack์ ์ ๋ณด๋ ์ฌ๋ผ์ง๋๋ค. heap์ ์ ์ฅ๋ ๊ฐ๋ค์ ๋ฐ๋ก ์ง์์ง์ง ์์ต๋๋ค. ํฌ์ธํฐ๊ฐ ์๋ ๊ฐ๋ค์ ์๊ฐ์ด ์ง๋๋ฉด ๊ฐ๋น์ง์ปฌ๋ ํฐ๊ฐ ์ง์๋๋ค.
์๋ฐ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ผ๊ธฐ ์ํด ๊ฐ์ ๋ฌธ์ฅ์ด๋ผ๋ฉด ์ฌ์ฌ์ฉ ํ๋ ๋ชฉ์ ์ผ๋ก String์ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. String์ immutable์ด๋ผ ์ ์ธํ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ํ ์์ญ์ ์์ฑ๋ ๊ฒ์ฒ๋ผ ์๊ฐ์ด ๋์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์๋ฐ์์๋ ๋ฉ๋ชจ๋ฆฌ์ string pool
์ ์ ์ฅํ๊ณ ์์ต๋๋ค.
string pool์ ํ ์์ญ ๋ด์ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์
๋๋ค.
public class String1 {//Day4
public static void main(String[] args) {
String str1 = new String("apple"); //new : string ๊ฐ์ฒด ์์ฑ
String str2 = new String("apple");
String str3 = "apple"; //๋ฆฌํฐ๋ด ํ๊ธฐ๋ก ๊ฐ์ฒด ์์ฑ
String str4 = "apple"; //heap ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ฒ์ ๋์ผ.
// ๋ฉ๋ชจ๋ฆฌ ๋น๊ต
System.out.println(str1 == str2); //false: new๋ฅผ ์ฐ๋ฉด ์๋ก ๋ค๋ฅธ ์ฃผ์
System.out.println(str3 == str4); //true
// ๊ฐ์ ๋น๊ต
System.out.println(str1.equals(str2));//true
System.out.println(str3.equals(str4));//true
System.out.println(str2.equals(str3));//true
}
}
๋ฆฌํฐ๋ด ํ๊ธฐ"๋ผ๋ฆฌ" ๊ฐ์ ๊ฐ์ด ์๋์ง heap์์ ํ์ธํ ๊ฐ์๊ฒ์ด ์์๋ ๊ฐ์ ์ฃผ์ ์ฌ์ฉํฉ๋๋ค.์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์๋ผ๋ ค๊ณ ํ๋๊ฒ์ธ๋ฐ, String ํด๋์ค๋ ๋ถ๋ณ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ด์ฃ !
๋ถ๋ณ๊ฐ์ฒด: ์์ฑ ํ ๊ทธ ์ํ๋ฅผ ๋ฐ๊ฟ ์ ์๋ ๊ฐ์ฒด
์๋ฅผ๋ค์ด๋ณด๊ฒ ์ต๋๋ค!
str3= "banana"; ์ด๋ผ๊ณ ํ๋ฉด str4๋ apple ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ณ , str3๋ ์๋ก์ด ์ฃผ์๋ฅผ ์ป๊ฒ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก str3= "orange"; ํ๋ฉด ๋ str3๋์๋ก์ด ์ฃผ์๋ฅผ ์ป๊ฒ๋๊ณ , banana๋ ๊ทธ์๋ฆฌ์ ๋ฒ๋ ค์ ธ์์ต๋๋ค.
๊ฐ๋น์ง ์ฝ๋ ํฐ๊ฐ ๋์๋ค๋๋ฉด์ null(ํฌ์ธํฐ๊ฐ ์๋๊ฐ,๋์ด์ง์์ด๋ค) ์ง์์ฃผ์ง๋ง ๊ทธ์์ ์ด ์ธ์ ์ง๋ ๋ชจ๋ฆ ๋๋ค. ๊ฐ์ด ๋ฐ๋๋๊ฒ ์๋๊ณ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํฌ์ธํฐ๋ง ๋ฐ๊พธ๋ ๋ถ๋ณ๊ฐ์ฒด๋ผ๋ ๋จ์ ์ด ์๋ค๋ผ๋ ๊ฒ์ ์์๋์!
์ฐธ๊ณ )StringBuilder ํด๋์ค
- String ํด๋์ค์ ๋์ผํ๊ฒ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ํด๋์ค
- String ํด๋์ค๋ ๋ฌธ์์ด์ ์ธ์คํด์ค๋ก ์์ฑํ๊ณ ๋๋ฉด ์ธ์คํด์ค๊ฐ ๊ฐ์ง ๋ฌธ์์ด์ ๋ณ๊ฒฝํ์ง ๋ชปํ๋ ๋ถ๋ณ๊ฐ์ฒด๋ผ๋ ๋จ์ ์ด ์์
- ๊ฐ์ ์ธ์คํด์ค ์์ ๋ฌธ์์ด ํ๋๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋๋ก ํจ
- ๋ถ๋ณ๊ฐ์ฒด๊ฐ ์๋๊ฒ ํด์ค๋ค!
ex)
StringBuilder ์ฐธ์กฐ๋ณ์ = new StringBuilder("๋ฌธ์์ด1");
์ฐธ์กฐ๋ณ์.append("๋ฌธ์์ด2").append("๋ฌธ์์ด3") ... <-๋ฌธ์์ด1๋ฌธ์์ด2๋ฌธ์์ด3...
List ์ธํฐํ์ด์ค: ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ค์ ์งํฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉ
Set ์ธํฐํ์ด์ค: ์์๊ฐ ์๋ ๋ฐ์ดํฐ ์งํฉ์ผ๋ก ๋ฐ์ดํฐ์ ์ค๋ณต์ ํ์ฉํ์ง ์์
Map ์ธํฐํ์ด์ค: ํค์ ๊ฐ์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ์์๊ฐ ์๊ณ , ํค๋ ์ค๋ณต์ผ๋ก ํ์ฉํ์ง ์์ง๋ง ๊ฐ์ ์ค๋ณต์ ํ์ฉ
import java.util.ArrayList;
import java.util.Iterator;
public class ArratList1 {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(80);
arrayList.add(95);
arrayList.add(65);
arrayList.add(100);
arrayList.add(90);
arrayList.add(55);
System.out.println(arrayList); //[80, 95, 65, 100, 90, 55]
System.out.println(arrayList.size()); //6
for(int i=0; i<arrayList.size(); i++){
System.out.print(arrayList.get(i) + " "); //80 95 65 100 90 55
}
System.out.println();
arrayList.remove(2);
System.out.println(arrayList); //[80, 95, 100, 90, 55]
// arrayList.remove(2);
// System.out.println(arrayList); //[80, 95, 90, 55]
arrayList.set(4,85);
System.out.println(arrayList); //[80, 95, 100, 90, 85]
Iterator<Integer> iterator = arrayList.iterator();
while(iterator.hasNext()){ //.hasnext: ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด true ์์ผ๋ฉด false
System.out.print(iterator.next() + " "); //.next: ํ์ฌ๊ฐ์์ฐ๊ณ ๋ค์์ผ๋ก ๋๊ธด๋ค.
} //80 95 100 90 85
}
}
๋ํผ ํด๋์ค๊ฐ ํ์ํ ์ด์
byte -> ๊ฐ์ฒด์์ฑ -> Byte
short -> ๊ฐ์ฒด์์ฑ -> Short
int -> ๊ฐ์ฒด์์ฑ -> Integer
long -> ๊ฐ์ฒด์์ฑ -> Long
char -> ๊ฐ์ฒด์์ฑ -> Character
float -> ๊ฐ์ฒด์์ฑ -> Float
double -> ๊ฐ์ฒด์์ฑ -> Double
boolean -> ๊ฐ์ฒด์์ฑ -> Boolean
String num = "100";
System.out.println(num + 100); //100100
System.out.println(Integer.parseInt(num) + 100); //200 ์ฌ๊ธฐ์ Integer๊ฐ ๋ํผํด๋์ค
๋ฐ์ฑ(Boxing)
๊ธฐ๋ณธํ์
์ ๋ํผํด๋์ค๋ก ๋ณํ
int num = 10; //num์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋๊ณ ![10]stack []heap
Integer i = new Integer(num); //์๋ก ๋ง๋๋ ๊ฒ ! [ref]stack -> [10]heap
์ธ๋ฐ์ฑ(UnBoxing)
๋ํผํด๋์ค๋ฅผ ๊ธฐ๋ณธํ์
์ผ๋ก ๋ณํ
int num = i.intValue();
public class Wrapper1 {
public static void main(String[] args) {
int num1 = 100;
// Integer num2 = new Integer(num1); //์ทจ์์ : ์์ด์ก๊ฑฐ๋ ์์ด์ง ์์ ์ธ ๋ฌธ๋ฒ
Integer num2 = num1; //์ต๊ทผ์ ์ฐ์ด๋ ๋ฐ์ฑ ๋ฌธ๋ฒ: ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ
System.out.println(num1); //100
System.out.println(num2); //100
int num3 = num2.intValue(); //์ธ๋ฐ์ฑ ๋ฐฉ๋ฒ1
int num4 = num2; //์ธ๋ฐ์ฑ ๋ฐฉ๋ฒ2: ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ
System.out.println(num3); //100
System.out.println(num4); //100
// Integer num5 = new Integer(10);
Integer num5 = 100; //new๋ฅผ ํ์ง ์์๋ ๊ฐ์ฒดํ์
์ผ๋ก ๋ณํ๋๋ค.
System.out.println(num1 + num5); //200: ์ผ๋ฐ ๋ฐ์ดํฐํ์
+ ๋ํผํด๋์ค ๊ณผ๊ฑฐ์ ์๋ฌ์ง๋ง ์ง๊ธ์ ๋๋ค!
Integer num6 = 100;
System.out.println(num5 + num6); //200: ๋ํผ ๋ผ๋ฆฌ๋ ์ฐ์ฐ ๊ฐ๋ฅ!
System.out.println(num1 == num5); //true: ์ซ์๋ ์ผ๋ฐ ๋ฐ์ดํฐํ์
, ๋ํผํด๋์ค์ ๊ฐ ๋น๊ต *์ฃผ์๋น๊ตXX
System.out.println(num5 == num6); //true: ์ซ์๋ ๋ ํผํด๋์ค, ๋ํผํด๋์ค์ ๊ฐ ๋น๊ต *์ฃผ์๋น๊ตXX
// ์คํธ๋ง์ == ์ฃผ์๋น๊ต .equals ๊ฐ๋น๊ต!
}
}
dzone-articles-java memory management
DigitalOcean-tutorial-java heap-vs-stack
https://yaboong.github.io/java/2018/05/26/java-memory-management/
https://leedo.me/35
Stack์ด๋ Heap์ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์ง๊ธฐ ์ํด์๋ ๊ผญ ์์์ผ ๋๋ ๊ฐ๋ ๊ฐ์์ :)