์๋ฐ์ ๋ฐฐ์ด ์ด๊ธฐํ ์ดํดํ๊ธฐ: ๊ธฐ๋ณธํ(Primitive Type)๊ณผ ์ฐธ์กฐํ(Reference Type)์ ์ฐจ์ด
์๋ฐ์์ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ๊ธฐ๋ณธํ(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]
์๋ฐ์์ ๊ธฐ๋ณธํ ๋ณ์(์: int, boolean ๋ฑ)๋ ๊ฐ ์์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ด๊ธฐํ ์, 0, false์ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ ํ ๋น๋ฐ๋๋ค.
๋ฐ๋ฉด ์ฐธ์กฐํ ๋ณ์๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ฏ๋ก, ๊ฐ์ฒด๊ฐ ์๋ ์ํ์์ ํน์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค. ๊ทธ๋์ ์ฐธ์กฐํ ๋ณ์๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ์ ๊น์ง null ์ํ๋ฅผ ์ ์งํ๋ค.
์ ๋ฆฌ
- ๊ธฐ๋ณธํ ๋ฐฐ์ด
- ์์ฑ๊ณผ ๋์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋จ
- ๋ฐ๋ก ๊ฐ ๋์ ๊ฐ๋ฅ
- ์ฐธ์กฐํ ๋ฐฐ์ด
- ์์ฑ๊ณผ ๋์์ 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