< 1. ๋ณ€์ˆ˜์™€ ์ดˆ๊ธฐํ™” >

๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜
- ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(ํ•„๋“œ): ํด๋ž˜์Šค์— ์„ ์–ธ
- ์ง€์—ญ ๋ณ€์ˆ˜: ๋ฉ”์„œ๋“œ์— ์„ ์–ธ, ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค.

 

 

๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ํ•„๋“œ ์˜ˆ์‹œ

public class Student {
      String name;
int age;
int grade; }

 

 

์ง€์—ญ ๋ณ€์ˆ˜ ์˜ˆ์‹œ

public class ClassStart3 {
      public static void main(String[] args) {
          Student student1;
          student1 = new Student();
          Student student2 = new Student();
} }

`student1` , `student2` ๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.


1.1 ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ํ›„์˜ ๋ณ€์ˆ˜ ์ƒํƒœ

public class MethodChange1 {
      public static void main(String[] args) {
          int a = 10;
System.out.println("๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „: a = " + a); changePrimitive(a); System.out.println("๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„: a = " + a);
}
      public static void changePrimitive(int x) {
          x = 20;
} }

 

1.1.1 ์ง€์—ญ ๋ณ€์ˆ˜ (Local Variable) 

์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์„ ์–ธ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ด€์ ์—์„œ ๋ณด๋ฉด, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค.

 

์ฝ”๋“œ์—์„œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜:

public static void main(String[] args) {
    int a = 10; // 'a'๋Š” main() ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
}

public static void changePrimitive(int x) {
    x = 20; // 'x'๋Š” changePrimitive() ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜์ด๋‹ค.
}

a๋Š” main() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. main() ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด a๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

x๋Š” changePrimitive() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด x ์—ญ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

์ด ๋‘ ๋ณ€์ˆ˜๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.


1.1.2. ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ (Call by Value)

- ์ž๋ฐ”๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜ ์ „๋‹ฌ์ด ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ์ด์ง€๋งŒ, ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋Š” ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋˜๊ณ , ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ์ฃผ์†Œ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

 

์ž๋ฐ”๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”์„œ๋“œ์—์„œ ์›๋ณธ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ฝ”๋“œ ๋™์ž‘:

int a = 10;
changePrimitive(a);
System.out.println(a); // ์—ฌ์ „ํžˆ a๋Š” 10์ด๋‹ค.

changePrimitive(a)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, a์˜ ๊ฐ’ 10์ด x์— ๋ณต์‚ฌ๋œ๋‹ค.

๋ฉ”์„œ๋“œ ์•ˆ์—์„œ x = 20;์„ ์‹คํ–‰ํ•ด๋„, ์ด๋Š” x์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, a์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

์ด๋Š” x๊ฐ€ a์˜ ๋ณต์‚ฌ๋ณธ์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

1.1.3. ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „ํ›„์˜ ๋ณ€์ˆ˜ ์ƒํƒœ

์ด ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „: a = 10 ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„: a = 10

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „:

   main() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ a๊ฐ€ ์„ ์–ธ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด ์‹œ์ ์—์„œ a์˜ ๊ฐ’์€ 10์ด๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ค‘

   changePrimitive(a)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, a์˜ ๊ฐ’ 10์ด x๋กœ ๋ณต์‚ฌ๋œ๋‹ค.

   x๋Š” changePrimitive() ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ, x = 20;์ด ์‹คํ–‰๋˜๋”๋ผ๋„ ์ด๋Š” x์—๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค. ๋”ฐ๋ผ์„œ a์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„:

   main() ๋ฉ”์„œ๋“œ๋กœ ๋Œ์•„์˜ค๋ฉด, a์˜ ๊ฐ’์€ ์—ฌ์ „ํžˆ 10์ด๋‹ค.

   x๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์–ด ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

1.1.4. ์ง€์—ญ ๋ณ€์ˆ˜์™€ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ

์ž๋ฐ”์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.

์ค‘์š”ํ•œ ์ ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ œ๊ฑฐ๋˜๊ณ , ์ง€์—ญ ๋ณ€์ˆ˜๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ๋ฆ„:

1. main() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ → ์Šคํƒ์— a(10) ์ƒ์„ฑ

2. changePrimitive(a) ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ → ์Šคํƒ์— x(10 ๋ณต์‚ฌ๋ณธ) ์ƒ์„ฑ

3. x ๊ฐ’ ๋ณ€๊ฒฝ (20) → ์›๋ณธ a๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ

4. changePrimitive() ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ → ์Šคํƒ์—์„œ x ์ œ๊ฑฐ

5. main() ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ → ์Šคํƒ์—์„œ a ์ œ๊ฑฐ

 

1.1.5. ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์™€์˜ ๋น„๊ต

๋งŒ์•ฝ ์ด ์ฝ”๋“œ๊ฐ€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜(์˜ˆ: ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด)๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ๊ฐ’์ด ์•„๋‹Œ ์ฐธ์กฐ(์ฃผ์†Œ)๊ฐ€ ๋ณต์‚ฌ๋˜๋ฏ€๋กœ,

๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ์˜ ๋ณ€๊ฒฝ์ด ์›๋ณธ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์ณค์„ ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐ’ ํƒ€์ž…๊ณผ ์ฐธ์กฐ ํƒ€์ž…์˜ ์ฐจ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

public class ReferenceExample {
    public static void main(String[] args) {
        int[] arr = {10}; // ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜
        changeReference(arr);
        System.out.println("๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ›„: arr[0] = " + arr[0]); // ์ถœ๋ ฅ: 20
    }

    public static void changeReference(int[] array) {
        array[0] = 20; // ์›๋ณธ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ
    }
}

์ด ๊ฒฝ์šฐ, ๋ฐฐ์—ด arr์˜ ์ฐธ์กฐ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— array[0] = 20;์€ ์›๋ณธ ๋ฐฐ์—ด arr์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

 

1. ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•(primitive type)์€ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
2. ์ฐธ์กฐ ์ž๋ฃŒํ˜•(reference type)์€ ์ฃผ์†Œ๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ๊ฐ์ฒด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
3. ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

< 2. ๋ณ€์ˆ˜์˜ ๊ฐ’ ์ดˆ๊ธฐํ™” >

< InitData >

package ref;
public class InitData {
int value1; //์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์Œ 
int value2 = 10; //10์œผ๋กœ ์ดˆ๊ธฐํ™”
}

value1์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ณ value2 ๋Š” ์ดˆ๊ธฐ๊ฐ’์„ 10์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค.

 

**InitMain**

package ref;
  public class InitMain {
      public static void main(String[] args) {
          InitData data = new InitData();
          System.out.println("value1 = " + data.value1);
          System.out.println("value2 = " + data.value2);
} }

 

**์‹คํ–‰ ๊ฒฐ๊ณผ**

value1 = 0
value2 = 10

`value1` ์€ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค. 

์ˆซ์ž๋Š” `์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. value2 ๋Š” 10

์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ  

10์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

 

2.1. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”

๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค์˜ ํ•„๋“œ๋กœ, ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

 

์ดˆ๊ธฐํ™” ๊ทœ์น™:

  • ์ˆซ์žํ˜•(int, float ๋“ฑ): 0 ๋˜๋Š” 0.0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ.

  • boolean: false๋กœ ์ดˆ๊ธฐํ™”๋จ.

  • ์ฐธ์กฐํ˜•(String, ๋ฐฐ์—ด ๋“ฑ): null๋กœ ์ดˆ๊ธฐํ™”๋จ.

 

2.2. ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”

์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋ธ”๋ก ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋กœ, ์ž๋™ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

์ดˆ๊ธฐํ™” ๊ทœ์น™:

   ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

   ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹นํ•œ ํ›„์— ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์ฝ”๋“œ์—์„œ์˜ ์˜ˆ์‹œ:

public class InitMain {
    public static void main(String[] args) {
        int localVar; // ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์Œ
        // System.out.println(localVar); // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
        localVar = 5; // ์ดˆ๊ธฐํ™”
        System.out.println(localVar); // ์ •์ƒ ์ถœ๋ ฅ: 5
    }
}

localVar๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋กœ, ์ดˆ๊ธฐ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ 5๋กœ ์ดˆ๊ธฐํ™”ํ•œ ํ›„์—๋Š” ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2.3. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ๋น„๊ต

2.4. ์‹ค์ƒํ™œ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋ฐ”๊ฐ€ “์ž๋™์œผ๋กœ ์ •๋ฆฌ์ •๋ˆ”์„ ํ•ด์ฃผ์–ด, ๊ฐ’์ด ์—†๋”๋ผ๋„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ •๋ฆฌ๋œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.

์ง€์—ญ ๋ณ€์ˆ˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •๋ฆฌ์ •๋ˆ์„ ํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ’์„ ๋„ฃ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด “์ •๋ฆฌ๊ฐ€ ์•ˆ ๋์Šต๋‹ˆ๋‹ค!“๋ผ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

• ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ์ž๋™ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€์ง€๋งŒ, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.
• ์ด ์ฐจ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์‹œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ฉด์„œ, ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๋ถˆํ•„์š”ํ•œ ์ดˆ๊ธฐํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ”์˜ ์„ค๊ณ„ ์ฒ ํ•™์—์„œ ๋น„๋กฏ๋˜์—ˆ๋‹ค.

 


< 3.Null >

3.1. null์˜ ์˜๋ฏธ

null์€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์—์„œ “์•„์ง ์–ด๋–ค ๊ฐ์ฒด๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค”๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Š” ๊ฐ’์ด ์—†๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ฐธ์กฐํ•  ๋Œ€์ƒ์ด ์—†๋‹ค๋Š” ํŠน๋ณ„ํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Data data = null; // data๋Š” ์•„์ง ์–ด๋–ค ๊ฐ์ฒด๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š์Œ

 

3.2. ์ฝ”๋“œ ์‹คํ–‰ ํ๋ฆ„

์ฝ”๋“œ์—์„œ null๊ณผ ๊ฐ์ฒด ์ฐธ์กฐ์˜ ๋ณ€ํ™”๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์‚ดํŽด๋ณด์ž.

Data data = null;
System.out.println("1. data = " + data); // null ์ถœ๋ ฅ

data = new Data();
System.out.println("2. data = " + data); // ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์ •๋ณด ์ถœ๋ ฅ

data = null;
System.out.println("3. data = " + data); // ๋‹ค์‹œ null ์ถœ๋ ฅ

์‹คํ–‰ ๊ฒฐ๊ณผ:

1. 1๋‹จ๊ณ„: data๊ฐ€ null

• Data data = null;์€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜ data๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ถœ๋ ฅ๊ฐ’: null

 

2. 2๋‹จ๊ณ„: data๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ

data = new Data();๋Š” ์ƒˆ๋กœ์šด Data ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ฐธ์กฐ๋ฅผ data์— ํ• ๋‹นํ•œ๋‹ค.

์ถœ๋ ฅ๊ฐ’: ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์ •๋ณด(์˜ˆ: ref.Data@x001).

 

3. 3๋‹จ๊ณ„: ๋‹ค์‹œ null

data = null;์€ data๊ฐ€ ๋” ์ด์ƒ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ถœ๋ ฅ๊ฐ’: null

 

3.3. Garbage Collection (GC, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)

null๋กœ ์ฐธ์กฐ๊ฐ€ ๋Š๊ธด ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฐ”์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC)๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•œ๋‹ค.

 

๋™์ž‘ ์›๋ฆฌ:

1. ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ์˜ ํ•œ ์˜์—ญ์— ์ €์žฅ๋˜๊ณ , ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ์ฐธ์กฐ๋ฅผ ์žƒ๊ฑฐ๋‚˜ null๋กœ ์„ค์ •๋˜๋ฉด ๋” ์ด์ƒ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

3. JVM์˜ GC๋Š” ์ด๋Ÿฌํ•œ “๊ณ ์•„ ๊ฐ์ฒด”(Unreachable Object)๋ฅผ ํƒ์ง€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค.

์˜ˆ: data = null; ์ดํ›„, ์ด์ „์— ์ฐธ์กฐํ–ˆ๋˜ Data ๊ฐ์ฒด๋Š” GC์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

 

3.4. GC์˜ ์ด์ 

์ž๋ฐ”๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ค„์ด๊ณ , ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค.

ํ•˜์ง€๋งŒ GC๋Š” ์ฆ‰๊ฐ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , JVM์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ๋•Œ ์‹คํ–‰๋œ๋‹ค.

 

3.5. ์ฃผ์˜ํ•  ์ 

null๋กœ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•œ๋‹ค๊ณ  ํ•ด์„œ GC๊ฐ€ ์ฆ‰์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. GC๋Š” JVM์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ•„์š”ํ•  ๋•Œ ๋™์ž‘ํ•œ๋‹ค.

๊ฐ์ฒด๊ฐ€ null์ด๋”๋ผ๋„, ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ทธ ๊ฐ์ฒด์˜ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ ์ ˆํžˆ ํŒ๋‹จํ•˜์ง€ ๋ชปํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

• null์€ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน๋ณ„ํ•œ ๊ฐ’์ด๋‹ค.
• ์ฐธ์กฐ๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋Š” GC์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
• ์ž๋ฐ”์˜ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๊ธฐ์—ฌํ•œ๋‹ค.
   ํ•˜์ง€๋งŒ, null์„ ์ž˜๋ชป ๋‹ค๋ฃจ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

< 4.NullPointerException์ด ๋ฐœ์ƒํ•˜๋Š” ์›๋ฆฌ์™€ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• >

 

4.1. NullPointerException์ด๋ž€?

NullPointerException์€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๊ฐ€ null์ผ ๋•Œ ํ•ด๋‹น ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ด๋‹ค.

null์€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ฆ‰, ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

Data data = null;
data.value = 10; // NullPointerException ๋ฐœ์ƒ

์œ„ ์ฝ”๋“œ์—์„œ data๋Š” null ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, data.value์— ์ ‘๊ทผํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด ์ฝ”๋“œ๋Š” ์ง๊ด€์ ์œผ๋กœ๋Š” “๋น„์–ด ์žˆ๋Š” ๊ณณ์— 10์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ”์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ,
์‹ค์ œ๋กœ๋Š” null์€ “์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ”๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๊ฑธ ๋” ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

1. data = null;์˜ ์˜๋ฏธ
Data data = null;
• ์ด ์ฝ”๋“œ๋Š” data๋ผ๋Š” ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ์•„๋ฌด ๊ฐ์ฒด๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š” ์ƒํƒœ(null)๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๊ฒƒ์ด๋‹ค.
   ์ฆ‰, data๋Š” ๋‹จ์ˆœํžˆ “๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜”์ผ ๋ฟ, ํ˜„์žฌ๋Š” ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค.
• data ์ž์ฒด๊ฐ€ ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ, ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ฐ’์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

2. data.value = 10;์˜ ๋™์ž‘ ์›๋ฆฌ
data.value = 10;
• ์ด ์ฝ”๋“œ๋Š” data๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์˜ value ํ•„๋“œ์— 10์„ ๋„ฃ์œผ๋ผ๋Š” ๋œป์ด๋‹ค.
  ํ•˜์ง€๋งŒ, ํ˜„์žฌ data๋Š” null(์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Œ) ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ๋Š” value๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
• ์ฆ‰, data๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ์ƒํƒœ์—์„œ data.value๋ฅผ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋น„์œ :
• data๋Š” ๋งˆ์น˜ “์ฃผ์†Œ”์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ null ์ƒํƒœ์ด๋ฏ€๋กœ,
  ์ฃผ์†Œ๊ฐ€ ์—†๋Š” ์ƒํƒœ์—์„œ ์ง‘ ์•ˆ์˜ ๋ฌผ๊ฑด(value)์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

• ์ฃผ์†Œ๊ฐ€ ์—†๋‹ค๋ฉด ์ง‘๋„ ์—†์œผ๋ฏ€๋กœ, ๋‹น์—ฐํžˆ ์ง‘ ์•ˆ์˜ ๋ฌผ๊ฑด์„ ์ฐพ์„ ์ˆ˜ ์—†์–ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

3. null๊ณผ ๋น„์–ด ์žˆ๋Š” ๊ฐ์ฒด์˜ ์ฐจ์ด
null์€ “์•„๋ฌด ๊ฐ์ฒด๋„ ์กด์žฌํ•˜์ง€ ์•Š์Œ”์„ ์˜๋ฏธํ•œ๋‹ค.
๋งŒ์•ฝ “๋น„์–ด ์žˆ๋Š” ๊ฐ์ฒด”๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

Data data = new Data(); // ๋น„์–ด ์žˆ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ
data.value = 10; // ์ด์ œ value์— 10์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ

์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค:
1. new Data()๋กœ Data ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•œ๋‹ค.
2. data ๋ณ€์ˆ˜๋Š” ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.
3. ์ด์ œ data๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, data.value๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด์˜ value ํ•„๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ์™œ NullPointerException์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
null ์ƒํƒœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
๋”ฐ๋ผ์„œ, ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
null ์ƒํƒœ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค ํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

5. ์ž˜๋ชป๋œ ์ดํ•ด์™€ ์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด

 

์ž˜๋ชป๋œ ์ดํ•ด:

data๊ฐ€ null์ด๋ฉด, ๋งˆ์น˜ ๋น„์–ด ์žˆ๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ๋‚˜์ค‘์— ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, null์€ ๊ฐ์ฒด๊ฐ€ “์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ”๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์•„๋ฌด ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด:

null์€ ๋‹จ์ง€ ์ฐธ์กฐ๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ผ ๋ฟ์ด๋‹ค.

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ๋งŒ(new Data()) ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

data๊ฐ€ null์ด๋ฉด ๋‚˜์ค‘์— ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์•„์˜ˆ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ.
Data data = null;๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๋‹ค.
์ด ์ƒํƒœ์—์„œ data.value = 10;์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, 
data๊ฐ€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์œผ๋ฏ€๋กœ NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

data.value์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ data๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์“ฐ์ธ value ํ•„๋“œ๋Š” ๋ญ์ง€? - ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(๋˜๋Š” ํ•„๋“œ)๋กœ, ๊ฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค

 

1. ํ•„๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

 ํ•„๋“œ๋Š” ํด๋ž˜์Šค์˜ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ๊ฐ์ฒด์˜ ์ƒํƒœ(state)๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜์ด๋‹ค.

 ํ•„๋“œ๋Š” ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค.

๊ฐ์ฒด์˜ ํ•„๋“œ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Data {
    int value; // ์ˆซ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•„๋“œ
}

์œ„ ์ฝ”๋“œ์—์„œ value๋Š” Data ํด๋ž˜์Šค์˜ ํ•„๋“œ์ด๋ฉฐ, int ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

 

2. value ํ•„๋“œ์˜ ์—ญํ• 

value ํ•„๋“œ๋Š” Data ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Data๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์ˆซ์ž ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ํด๋ž˜์Šค๋ผ๋ฉด, value๋Š” ํ•ด๋‹น ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

public class Main {
    public static void main(String[] args) {
        Data data = new Data(); // Data ๊ฐ์ฒด ์ƒ์„ฑ
        data.value = 10;        // value ํ•„๋“œ์— ์ˆซ์ž ์ €์žฅ
        System.out.println(data.value); // value ์ถœ๋ ฅ: 10
    }
}

์—ฌ๊ธฐ์„œ data.value = 10;์€ Data ๊ฐ์ฒด์˜ value ํ•„๋“œ์— 10์„ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

System.out.println(data.value);์€ value์— ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

3. ์™œ ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

๊ฐ์ฒด๋Š” ํด๋ž˜์Šค๋ผ๋Š” ์„ค๊ณ„๋„์— ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง€๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋‹จ์œ„์ด๋‹ค.

ํ•„๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ํŠน์„ฑ์ด๋‚˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค.

ํด๋ž˜์Šค ์„ค๊ณ„ ์‹œ ํ•„๋“œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์ •์˜๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด:

1. ์‚ฌ๋žŒ ์ •๋ณด ๊ด€๋ฆฌ ํด๋ž˜์Šค:

public class Person {
    String name; // ์ด๋ฆ„
    int age;     // ๋‚˜์ด
}

name: ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ €์žฅ

age: ์‚ฌ๋žŒ์˜ ๋‚˜์ด๋ฅผ ์ €์žฅ

 

1. ๋ฐ์ดํ„ฐ ์ €์žฅ:

Data data = new Data();
data.value = 42; // value ํ•„๋“œ์— ๊ฐ’ ์ €์žฅ

 

2. ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ:

System.out.println(data.value); // ํ•„๋“œ ๊ฐ’์„ ์ถœ๋ ฅ

 

3. ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰:

data.value = data.value * 2; // ํ•„๋“œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ ์ˆ˜ํ–‰

 

 

value ํ•„๋“œ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋‹ค.
ํ•„๋“œ๋Š” ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ์„ค๊ณ„์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
Data ํด๋ž˜์Šค์—์„œ value ํ•„๋“œ๋Š” ๋‹จ์ˆœํžˆ ์ˆซ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค.

4.2. NullPointerException ๋ฐœ์ƒ ์›๋ฆฌ

์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์— null์ด ํ• ๋‹น๋œ ์ƒํƒœ์—์„œ .(dot) ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ํ•„๋“œ๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค ํ•˜๋ฉด,

“๊ฐ์ฒด๊ฐ€ ์—†๋Š”๋ฐ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค”๋Š” ์ด์œ ๋กœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

public class NullMain2 {
    public static void main(String[] args) {
        Data data = null; // data๋Š” null ์ƒํƒœ์ด๋‹ค.
        data.value = 10;  // NullPointerException ๋ฐœ์ƒ
    }
}

 

์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Exception in thread "main" java.lang.NullPointerException

 

4.3. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ null์ธ ๊ฒฝ์šฐ

๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ null์ด ์„ค์ •๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

BigData ํด๋ž˜์Šค ์˜ˆ์ œ:

public class BigData {
    Data data; // ์ฐธ์กฐํ˜• ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋‹ค.
    int count; // ๊ธฐ๋ณธํ˜• ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ด๋‹ค.
}

 

์‹คํ–‰ ์ฝ”๋“œ:

public class NullMain3 {
    public static void main(String[] args) {
        BigData bigData = new BigData(); // BigData ๊ฐ์ฒด ์ƒ์„ฑ
        System.out.println(bigData.count); // 0 ์ถœ๋ ฅ
        System.out.println(bigData.data);  // null ์ถœ๋ ฅ

        // NullPointerException ๋ฐœ์ƒ
        System.out.println(bigData.data.value); // bigData.data๊ฐ€ null์ด๋ฏ€๋กœ ์˜ˆ์™ธ ๋ฐœ์ƒ
    }
}

 

์‹คํ–‰ ๊ณผ์ •:

1. BigData ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ์ฐธ์กฐํ˜• ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ data๋Š” ์ž๋™์œผ๋กœ null๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

2. bigData.data.value์— ์ ‘๊ทผํ•˜๋ ค ํ•˜๋ฉด, bigData.data๊ฐ€ null์ด๊ธฐ ๋•Œ๋ฌธ์— NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

 

4.4. NullPointerException ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  4.4.1. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ์‚ฌ์šฉํ•˜๊ธฐ

null ์ƒํƒœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™”ํ•œ ํ›„์— ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

BigData bigData = new BigData();
bigData.data = new Data(); // Data ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ํ• ๋‹น
bigData.data.value = 10;   // ์ •์ƒ ์‹คํ–‰


4.4.2. null ์ฒดํฌํ•˜๊ธฐ

์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— null ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

if (bigData.data != null) {
    bigData.data.value = 10;
} else {
    System.out.println("data๊ฐ€ null ์ƒํƒœ์ด๋‹ค.");
}

 

  4.4.3. Optional ์‚ฌ์šฉํ•˜๊ธฐ (Java 8 ์ด์ƒ)

Optional์„ ์‚ฌ์šฉํ•˜๋ฉด null ์ฒ˜๋ฆฌ๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Optional<Data> optionalData = Optional.ofNullable(bigData.data);
optionalData.ifPresent(data -> data.value = 10);

 

 

 

4.5. NullPointerException ๋ฐœ์ƒ ์›์ธ ์ฐพ๊ธฐ

NullPointerException์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ null ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

Exception in thread "main" java.lang.NullPointerException: Cannot read field "value" because "bigData.data" is null

์œ„ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด bigData.data๊ฐ€ null์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

NullPointerException์€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๊ฐ€ null ์ƒํƒœ์—์„œ ๊ฐ์ฒด์˜ ์†์„ฑ์ด๋‚˜ ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ด๋‹ค.
์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

1. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„์— ์‚ฌ์šฉํ•œ๋‹ค.
2. ๋ณ€์ˆ˜์˜ ๊ฐ’์ด null์ธ์ง€ ํ•ญ์ƒ ํ™•์ธํ•œ๋‹ค.
3. Optional๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ null์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.

NullPointerException์€ ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ, ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์˜ null ์ƒํƒœ๋ฅผ ํ•ญ์ƒ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

+ Recent posts