Java

์ž๋ฐ”์˜ ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ์ดํ•ดํ•˜๊ธฐ: ๊ธฐ๋ณธํ˜•(Primitive Type)๊ณผ ์ฐธ์กฐํ˜•(Reference Type)์˜ ์ฐจ์ด

9taetae9 2024. 11. 3. 18:30
728x90

์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ๊ธฐ๋ณธํ˜•(Primitive Type)๊ณผ ์ฐธ์กฐํ˜•(Reference Type)์˜ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ ์ด ์ฐจ์ด์ ์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

1. ๋ฐฐ์—ด์˜ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™”

1.1 ๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด(Primitive Type)

๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ ์š”์†Œ๋Š” ํ•ด๋‹น ํƒ€์ž…์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

int[] arr = new int[5];
System.out.println(arr[0]);    // ์ถœ๋ ฅ: 0
arr[0] = 10;                   // ๋ฐ”๋กœ ๊ฐ’ ๋Œ€์ž… ๊ฐ€๋Šฅ

 

๊ฐ ๊ธฐ๋ณธํ˜• ํƒ€์ž…๋ณ„ ์ดˆ๊ธฐ๊ฐ’

byte -> 0
short -> 0
int -> 0
long -> 0L
float -> 0.0f
double -> 0.0d
boolean -> false
char -> '\u0000'

 

1.2 ์ฐธ์กฐํ˜• ๋ฐฐ์—ด(Reference Type)

์ฐธ์กฐํ˜• ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ ์š”์†Œ๋Š” null๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

String[] strArray = new String[5];
ArrayList<Integer>[] listArray = new ArrayList[5];
System.out.println(strArray[0]);        // ์ถœ๋ ฅ: null
System.out.println(listArray[0]);       // ์ถœ๋ ฅ: null

 

๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ ๊ตฌ์กฐ
๋‹ค์ฐจ์› ๋ฐฐ์—ด int[][] arr๋Š” int[] ํƒ€์ž…(๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…)์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๋‹ค.


์ฒซ ๋ฒˆ์งธ ์ฐจ์›์˜ ์ดˆ๊ธฐํ™”
int[][] arr = new int[3][];์—์„œ new int[3][]๋Š” 3๊ฐœ์˜ int[] ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์‹œ์ ์—์„œ ๊ฐ ์š”์†Œ๋Š” null๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
arr์€ int[] ํƒ€์ž…์ด๊ณ  ์ด๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ null์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

int[][] arr = new int[3][];
System.out.println(arr[0]); // ์ถœ๋ ฅ: null


์ฐจ์›์„ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด arr[i] ๊ฐ ํ–‰๋งˆ๋‹ค 1์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. new int[4]๋Š” ๊ธฐ๋ณธํ˜•์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ.

int[][] arr = new int[3][];
for (int i = 0; i < arr.length; i++) {
    arr[i] = new int[4]; // ๊ฐ ํ–‰์„ 4์—ด๋กœ ์ดˆ๊ธฐํ™”
}

 

2. ์ฐธ์กฐํ˜• ๋ฐฐ์—ด์˜ ์‚ฌ์šฉ ๋ฐฉ์‹ ์ฐจ์ด

2.1 ๊ฐ’ ๋Œ€์ž… vs ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

์ฐธ์กฐํ˜• ๋ฐฐ์—ด์—์„œ null ์ƒํƒœ์˜ ์š”์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹

// ๊ฐ’ ๋Œ€์ž… - ๊ฐ€๋Šฅ
String[] s = new String[5];
s[0] = new String("apple");     // ์ •์ƒ ์ž‘๋™
s[0] = "apple";                 // ์ด๊ฒƒ๋„ ์ •์ƒ ์ž‘๋™

// ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ - ๋ถˆ๊ฐ€๋Šฅ
String[] s = new String[5];
s[0].length();                  // *** NullPointerException ๋ฐœ์ƒ ***

 

2.2 ArrayList ๋ฐฐ์—ด - ์˜ˆ์‹œ

ArrayList์™€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ถ”๊ฐ€์ ์ธ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋‚ด๊ฐ€ ์ตœ๊ทผ์— ์ฝ”ํ…Œ๋ฅผ ํ’€๋ฉฐ ํ•œ ์‹ค์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด์ž.

// ์ž˜๋ชป๋œ ์‚ฌ์šฉ
ArrayList<Edge>[] graph = new ArrayList[5];
graph[0].add(new Edge(1, 2));   // NullPointerException ๋ฐœ์ƒ!

// ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ
ArrayList<Edge>[] graph = new ArrayList[5];
graph[0] = new ArrayList<>();    // gragh[i]์— ํ• ๋‹นํ•  ArrayList ๊ฐ์ฒด ๋จผ์ € ์ƒ์„ฑ
graph[0].add(new Edge(1, 2));   // ์ด์ œ ์ •์ƒ ์ž‘๋™

 

์™œ graph[0].add(~~)์—์„œ NullPointerException ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๊นŒ?

์œ„์—์„œ ๋ณด์•˜๋“ฏ์ด ๋ฐฐ์—ด ํƒ€์ž…(ArrayList<Edge>)์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์˜ ๋Œ€์ž…์€ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœ์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. 

ArrayList<Edge>[] graph = new ArrayList[5]; ์งํ›„ graph ๋ฐฐ์—ด์˜ ์ƒํƒœ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

์ฒซ ๋ผ์ธ ์งํ›„ graph ๋ฐฐ์—ด์€ ๊ฐ๊ฐ null๋กœ ์ดˆ๊ธฐํ™” ๋œ ์ƒํƒœ์ด๋‹ค.

๊ทธ ์ƒํƒœ์—์„œ graph[0].add(~~) ์™€ ๊ฐ™์€ ์‹œ๋„๋Š” graph[0]๊ฐ€ null์ด๋ฏ€๋กœ null.add(~~)์„ ๋ช…๋ นํ•œ ๊ผด์ด ๋œ๋‹ค. 

add ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ graph[0].get(0) ์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ–ˆ์„๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ์™€ ํ•จ๊ป˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.ArrayList.get(int)" because "Main.graph[0]" is null  => ์ง์—ญ : get() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค, graph[0]๊ฐ€ null ์ด๊ธฐ ๋•Œ๋ฌธ์—

 

ArrayList(๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…)์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์˜€๋‹ค๋ฉด, ์žŠ์ง€๋ง๊ณ  ๋ฐ”๋กœ ๊ฐ ์ธ๋ฑ์Šค๋งˆ๋‹ค ์ƒˆ๋กœ์šด ArrayList ๊ฐ์ฒด๋„ ์ƒ์„ฑํ•ด์ฃผ์ž. 

graph = new ArrayList[N];
for(int i=0; i<N; i++){
    graph[i] = new ArrayList<>();
}

 

3.  ์ž๋ฐ”์—์„œ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ์™œ null๋กœ ์ดˆ๊ธฐํ™” ๋ ๊นŒ?

3.1  ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์˜ ์ดํ•ด (๊ธฐ๋ณธํ˜• vs ์ฐธ์กฐํ˜•)

// ๊ธฐ๋ณธํ˜•: ๊ฐ’์ด ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ง์ ‘ ์ €์žฅ
int number = 10;

// ์ฐธ์กฐํ˜•: ๊ฐ์ฒด๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ณ , ๋ณ€์ˆ˜๋Š” ๊ทธ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐ
String text = new String("Hello");

[stack ๋ฉ”๋ชจ๋ฆฌ]                 [heap ๋ฉ”๋ชจ๋ฆฌ]

number: 10

text: 0x123  ------->  0x123: "Hello" ๊ฐ์ฒด

(๋„์‹ํ™” ํ•ด๋ณด๋ฉด ์œ„์™€ ๋Œ€๋žต ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ)

 

๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์˜ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ

String[] arr = new String[3];

[์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ]              [ํž™ ๋ฉ”๋ชจ๋ฆฌ]

arr: 0x456 -------> 0x456: [null][null][null]

(์œ„์™€ ๊ฐ™์ด ๋„์‹ํ™” ๋  ๊ฒƒ์ด๋‹ค)

 

์œ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ธฐ๋ณธํ˜•์˜ ๊ฐ’์€ ์Šคํƒ์— ์ €์žฅ๋˜์ง€๋งŒ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

3.2  null ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

1) ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ •์„ฑ

  • null์€ "์•„์ง ์–ด๋–ค ๊ฐ์ฒด๋„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์Œ"์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ
  • ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Œ
  • null๋กœ ์ดˆ๊ธฐํ™”ํ•จ์œผ๋กœ์จ ์•ˆ์ „ํ•œ ์ƒํƒœ ๋ณด์žฅ
String[] arr = new String[3];
// ์ด ์‹œ์ ์—์„œ arr[0]์€ null
// arr[0]๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด?
// -> ์‹œ์Šคํ…œ ํฌ๋ž˜์‹œ๋‚˜ ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ  
// ๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด
int[] nums = new int[3];
// JVM์ด ๊ฐ ์š”์†Œ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
// [0][0][0]

// ์ฐธ์กฐํ˜• ๋ฐฐ์—ด
String[] strings = new String[3];
// JVM์ด ๊ฐ ์š”์†Œ๋ฅผ null๋กœ ์ดˆ๊ธฐํ™”
// [null][null][null]
2) ์ฐธ์กฐํ˜•๊ณผ ๊ธฐ๋ณธํ˜•์˜ ์ฐจ์ด  

์ž๋ฐ”์—์„œ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜(์˜ˆ: int, boolean ๋“ฑ)๋Š” ๊ฐ’ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ, 0, false์™€ ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

๋ฐ˜๋ฉด ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ, ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ ํŠน์ • ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „๊นŒ์ง€ null ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

์ •๋ฆฌ

  1. ๊ธฐ๋ณธํ˜• ๋ฐฐ์—ด
    • ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ
    • ๋ฐ”๋กœ ๊ฐ’ ๋Œ€์ž… ๊ฐ€๋Šฅ
  2. ์ฐธ์กฐํ˜• ๋ฐฐ์—ด
    • ์ƒ์„ฑ๊ณผ ๋™์‹œ์— null๋กœ ์ดˆ๊ธฐํ™”
    • ๊ฐ’ ๋Œ€์ž…์€ ๊ฐ€๋Šฅ
    • ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ „ ๊ฐ์ฒด ์ƒ์„ฑ ํ•„์š”

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ :

https://www.scientecheasy.com/2021/08/array-initialization-in-java.html/

 

Array Initialization in Java with Example - Scientech Easy

Learn array initialization in Java with examples, array initializer, string array initialization, default array initialization, accessing

www.scientecheasy.com

https://stackoverflow.com/questions/1922677/nullpointerexception-when-creating-an-array-of-objects

 

NullPointerException when Creating an Array of objects

I have been trying to create an array of a class containing two values, but when I try to apply a value to the array I get a NullPointerException. public class ResultList { public String name;...

stackoverflow.com

 

728x90