๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/๊ตญ๋น„์ง€์›

[D+11] ์ฐธ์กฐํƒ€์ž…

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2022. 10. 4.

 

 

๊ตญ๋น„์ง€์› D+11

-  ์ฐธ์กฐํƒ€์ž… -

 


 

์ฐธ์กฐํƒ€์ž…

• ๋ฉ”๋ชจ๋ฆฌ๋งต Heap

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ์‹œ๊ฐ„์— ๋ฉ”๋ชจ๋ฆฌ๋งต์ธ Global Area, Heap Area, Stack Area 3๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด์•˜๋‹ค.

์ด๋•Œ, Heap์€ new๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ ๋Ÿฐํƒ€์ž„ ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ์•ˆ๋“ค์–ด์˜ฌ์ง€ ๋ชฐ๋ผ ์ด๋ฆ„์ด ์—†์ด ๋ž˜ํผ๋Ÿฐ์Šค ๊ฐ’๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์˜€๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ํ•œ๊ฐ€์ง€ ์˜๋ฌธ์ ์ด ๋“ค์–ด์•ผ ํ•œ๋‹ค.

์ €๋ฒˆ์ˆ˜์—…์‹œ๊ฐ„์— ์šฐ๋ฆฌ๋Š” ๋ž˜ํผ๋Ÿฐ์Šค ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ๋ธ”๋Ÿญ์ด ํฌ๋˜ ์ž‘๋˜ ์ฃผ์†Œ์˜ ํฌ๊ธฐ๋Š” ๊ฐ™๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์™œ ์•ž์— ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ญ˜๊นŒ?

 

int[] a1 = new int[5]; // 5int = 20byte

byte[] a2 = new byte[20]; // 20byte

์—ฌ๊ธฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

์ด๋•Œ a1์€ 5๊ฐœ์˜ int๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š” ๊ฒƒ์œผ๋กœ 20byte์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , a2๋„ 20๊ฐœ์˜ byte๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” 20byteํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

๊ณผ์—ฐ ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์ด ๊ฐ™์€ ์ข…๋ฅ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‹น์—ฐํžˆ ์•„๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” intํ˜•์œผ๋กœ ๋ช‡๊ฐœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€, byteํ˜•์œผ๋กœ ๋ช‡๊ฐœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์„ ์–ธ์ด ๋˜์–ด์žˆ์„ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ๊ฐ์ž ์‹œ์ž‘์ •๋ณด์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ์‹œ ๊ฐ™์€ ๋ฐ์ดํ„ฐํƒ€์ž…์œผ๋กœ ์ ‘๊ทผํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐฐ์—ด์•ˆ์˜ ๊ฐ’์ด int๋ผ๋ฉด intํ˜•์œผ๋กœ, byte์ผ๊ฒฝ์šฐ์—” byte๋ผ๊ณ  ์ž‘์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

• null

- null์€ ๋ž˜ํผ๋Ÿฐ์Šค๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.

- ๋ชจ๋“  ๋ž˜ํผ๋Ÿฐ์Šคํƒ€์ž…์€ null์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

- ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒํƒ€์ž…์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

• String ํƒ€์ž…

- ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐํƒ€์ž…์œผ๋กœ ์ฐธ์กฐํƒ€์ž…์ด๋‹ค.

- ๋ฌธ์ž์—ด์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค ๋ฐ์ดํ„ฐํƒ€์ž…

 

public static void main(String[] args) 
{
	//String : ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐํƒ€์ž…
	String a1 = "์•ˆ๋…•ํ•˜์„ธ์š”";
	String a2 = new String("Hello");
}

๊ธฐ์กด์— ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” Stringํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์€ a1 ๋ฐฉ์‹์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” a2๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ํ‘œํ˜„์ด๋ฉฐ, a1์€ a2๋กœ๋ถ€ํ„ฐ ๋‚ด๋ ค์˜จ ์Šˆ๊ฐ€์ฝ”๋“œ ์ด๋ฏ€๋กœ, a1์˜ ๋ฐฉ์‹์œผ๋กœ ์„ ์–ธํ•˜๋”๋ผ๋„ a2์˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์•Œ๊ณ ์žˆ๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.

 

๋˜ํ•œ a2๋ฅผ ๋ณด๋ฉด ์•ž์— new๊ฐ€ ๋ถ™์—ฌ์ ธ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” String์€ ์ฐธ์กฐํ˜•์ด๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ๋งต์—์„œ Heap์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์œ„์น˜์ •๋ณด๋ฅผ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

	
    public static void main(String[] args) 
	{
		//String : ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐํƒ€์ž…
		String a1 = "Hello";
		String a2 = new String("Hello");
		String a3 = "Hello";
		
		if(a1 == a2) // ๋‹ค๋ฅด๋‹ค
			System.out.println("๊ฐ™๋‹ค");
		else
			System.out.println("๋‹ค๋ฅด๋‹ค");
		
		if(a1 == a3) // ๊ฐ™๋‹ค
			System.out.println("๊ฐ™๋‹ค");
		else
			System.out.println("๋‹ค๋ฅด๋‹ค");
	}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋…ผ๋ฆฌ๋กœ ๋”ฐ์ง€์ž๋ฉด a1, a2, a3๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ์œ„์น˜์ •๋ณด๋ฅผ ์ฐธ์กฐ๋ณ€์ˆ˜์•ˆ์— ๋„ฃ์–ด์„œ ์กฐ๊ฑด๋ฌธ์—๋Š” ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค๋Š” ํ‘œํ˜„์„ ๋‚˜ํƒ€๋‚ด๋Š”๊ฒŒ ์ •์ƒ์ธ๋ฐ ํฌํ•œํ•˜๊ฒŒ๋„ a1๊ณผ a2๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ด์ง€๋งŒ a1๊ณผ a3๋Š” ๊ฐ™๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

์ด๋Š” ์ž๋ฐ”์ž์ฒด์—์„œ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ ๋งŒ์•ฝ a2๊ฐ™์ด ์ œ๋Œ€๋กœ ์„ ์–ธํ•ด์ฃผ์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ heap์—๋‹ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ณ ์œ ์˜ ์œ„์น˜์ •๋ณด๋ฅผ ๋‚ด๋ณด๋‚ด a1์ด๋ผ๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜ ์•ˆ์— ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ a2์™€ a3์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์Šˆ๊ฐ€์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ ๋ฐฉ์‹์œผ๋กœ ๋งŒ์•ฝ a1์œผ๋กœ ๋จผ์ € ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์œ„์น˜์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ์„๋•Œ, a3๋Š” "Hello"๋ฅผ ๋„ฃ์„๋•Œ ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๊ฐ™์€๊ฒƒ์ด ์ด๋ฏธ heap์•ˆ์— ์กด์žฌํ• ๋•Œ ์ƒˆ๋กœ์šด ์œ„์น˜์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด์„œ heap์•ˆ์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด์— ์žˆ๋Š” "Hello"์— ๋Œ€ํ•œ ์œ„์น˜์ •๋ณด๋ฅผ ๊ทธ๋ƒฅ ์จ๋ฒ„๋ฆฌ๊ฒŒ ๋˜์–ด์„œ a1๊ณผ a3๋Š” ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ผ์น˜ํ•œ๋‹ค๊ณ  ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์ด๋‹ค.

=> ์ž๋ฐ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๊ธฐ ์œ„ํ•ด์„œ ์ž๋™์œผ๋กœ ์ตœ์ ํ™” ํ•ด๋ฒ„๋ฆผ.

 

a1.equals(a2); // true
a2.equals(a3); // true
a3.equals(a1); // true

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋‹ค์†Œ ๋ณต์žกํ•˜๊ณ  ์• ๋งคํ•œ ๊ณผ์ •์„ ํ”ผํ•˜๊ณ ์ž ์„œ๋กœ ๋‚ด์šฉ์— ๊ฐ™์€ ๊ฐ’์ด ์žˆ์„๋•Œ ๋ณ€์ˆ˜๋ฅผ ๋น„๊ต์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•ด์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ equls๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์ค€๋‹ค.

 

• String ํƒ€์ž…์˜ ๋ฐฐ์—ด

String[] box = new String[] {"aa", "bb", "cc"};

์šฐ๋ฆฌ๋Š” ์œ„์˜ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ String์ด ์ฐธ์กฐํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์˜ ์ฝ”๋“œ๋Š” ๊ณผ์—ฐ Heap์— ["aa", "bb, "cc"]์„ ๋„ฃ๊ณ  ์‹œ์ž‘์ •๋ณด๋ฅผ ์ฐธ์กฐ๋ณ€์ˆ˜ ์•ˆ์— ๋„ฃ์–ด์„œ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

 

๋งŒ์•ฝ String ๋ฐฐ์—ด์•ˆ์— 3๊ฐœ์˜ ์ŠคํŠธ๋ง ํƒ€์ž…์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ํ•˜์ž.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด Heapํ˜•์‹์œผ๋กœ ๋ฐฐ์—ด์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ String ์ž์ฒด๊ฐ€ ์ฐธ์กฐ๊ทธ์ž์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— String ๋ฐฐ์—ด์•ˆ์—๋Š” ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Heap์–ด๋”˜๊ฐ€์— ์žˆ์„ ๋ฐ์ดํ„ฐ์˜ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ strs๋Š” String์˜ ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜์ด๋ฉฐ, ์ด๋•Œ ๋ฐฐ์—ด์•ˆ์—๋Š” ์ฐธ์กฐ๊ฐ’๋“ค์ด ๋“ค์–ด๊ฐ€์„œ ๊ทธ ์ฃผ์†Œ๋ฅผ ํƒ€๊ณ  ๋ฐ์ดํ„ฐ๊ฐ’์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

// Before
String[] strs1 = new String[] {"aa", "bb", "cc"};


// After
String[] str2 = new String[] {
	String("aa"),
	String("bb"),
	String("cc")
};

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์œ„์˜ ๊ทธ๋ฆผ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฐ”๊พผ After์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋งต์„ ์ดํ•ดํ•˜๋ฉด ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๋‹ค.

์ฐธ๊ณ ๋กœ ์ด๋กœ์จ ์•Œ ์ˆ˜ ์žˆ๋Š”๊ฑด ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ์“ฐ๊ณ  ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์Šˆ๊ฐ€์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ์˜ ๋ชจ์Šต์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

 

• ๋‹ค์ฐจ์›๋ฐฐ์—ด

๋ฐฐ์—ด์ด๋ž€ Data-type์„ T๋ผ๊ณ  ํ–ˆ์„๋•Œ, T๊ฐ€ n๊ฐœ ์—ฐ์†ํ•˜์—ฌ ํ• ๋‹น๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ •์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ„์— ์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋ฐฐ์—ด์ด 1์ฐจ์›์ด ์•„๋‹ˆ๋ผ 2์ฐจ์› ์ด์ƒ์ด ๋  ๊ฒฝ์šฐ์—” T์™€ n์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

๋‹ต๋ถ€ํ„ฐ ์•Œ๋ ค์ฃผ์ž๋ฉด int[2][3]์—์„œ int[3]์ด 2๊ฐœ ์žˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๋Š” 1์ฐจ์› ์ด์ƒ์ธ ๋ฐฐ์—ด์„ ์ ‘ํ–ˆ์„๋•Œ ํ–‰๋ ฌ์„ ์ƒ๊ฐํ•˜๊ฑฐ๋‚˜  3์ฐจ์›์ ์ธ ๋ชจ์Šต์„ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด int[4][3][2][3]์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜์˜€์„ ๋•Œ 4์ฐจ์›์„ ๊ทธ๋ ค์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋‹ด๊ฐ์„ ๊ฐ€์ง€์ง€ ์•Š๊ณ  ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ๊ณ„์ธต์ ์œผ๋กœ ๊ทธ๋ ค๋‚˜๊ฐ€๋ฉด ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์ดํ•ดํ•˜๋Š”๋ฐ ํ›จ์”ฌ ์ˆ˜์›”ํ•˜๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€