티스토리 뷰

자바를 만지다보면 자주 마주치는 NullPointerException! 
프로젝트 만들 때도 자주 만나서 이젠 화도 안난다... 반가워!ㅎㅎㅎ
geeksforgeeks에서 null에 관한 재밌는 이야기 거리가 있어서 들고와서 번역해봅니다! (오역 무조건 있음)

 

거의 모든 프로그래밍 언어에서 null은 떼려야 뗄 수 없는 관계. 거의 모든 개발자들이 null 때문에 고생을 하고 있지요. 자바에서 null은 java.lang.NullPointerException과 연관이 있습니다. java.lang.package에서 클래스인 이 녀석은 자바로 프로그래밍을 실행 할 때(null이 있건 없건간에) 가끔 당체, 어디서 예외가 발생했는지도 알 수 없게 나와 우리를 절망으로 빠뜨리곤 하죠. 아래에는 자바 개발자가 알아두면 좋은 null에 관한 이야기들이 있습니다!

 


 

1.  null은 대소문자 구별을 한다!

자바에서 null은 문자 그대로 null로 표현 해야한다. 왜냐하면 대소문자 구별을 하기 때문! C언어처럼 NULL이나 0으로 사용할 수 없다.

 

public class NullTest {
    public static void main(String[] args) throws java.lang.Exception {
		
        // java: cannot find symbol
        Object obj = NULL;
		
        // 에러 없음
        Object obj1 = null;
    }
}

NULL이라 선언한 obj는 심볼을 찾을 수 없다고 에러가 뜬다!!!

 

 

 


 

2.  참조 변수의 값(Reference Variable Value) : 자바에서 참조 변수의 값은 기본으로 null이다.

public class NullTest {
    private static Object obj;
    public static void main(String[] args) throws java.lang.Exception {

        System.out.println("객체 형태의 obj는 값이 " + obj + "이다.");
    }
}

 


 

3. null 타입

사람들이 오해하는 부분이 null은 Object나 null 타입이라 생각 하는데 사실은 그렇지 않고 null은 그 자체로 특별한 값. 어떠한 참조 타입에 선언할 수 있고 어떠한 타입으로도 캐스팅(casting)이 가능.

 

public class NullTest {
    public static void main(String[] args) throws java.lang.Exception {

        // null은 String으로 선언이 가능합니다.
        String 문자열 = null;

        // null은 Integer로  선언이 가능합니다. int는 불가능
        Integer 정수 = null;

        // null은 Double로 선언이 가능합니다.
        Double 더블 = null;

        // null은 String으로 캐스팅이 가능합니다.
        String 내문자열 = (String) null;

        // null은 Integer으로 캐스팅이 가능합니다.
        Integer 내정수 = (Integer) null;

        // null은 Double으로 캐스팅이 가능합니다.
        Double 내더블 = (Double) null;
    }
}

 

 


 

 

4. 오토박싱과 언박싱

null 값이 primitive 박스 데이터 타입으로 선언이 되어 있는 경우 오토 박싱 또는 언박싱을 할 때 컴파일러가 Nullpointer 예외 에러를 던져준다.

public class NullTest {
    public static void main(String[] args)
            throws java.lang.Exception
    {
        // Integer는 null이 될 수 있기 때문에 괜찮지만
        Integer i = null;

        // int로 언박싱한 null은
        // NullpointerException을 던진다.
        int a = i;
    }
}

 


 

 

5. 인스턴스오브 오퍼레이터

자바의 instanceof 오퍼레이터는 객체가 정확히 무슨 타입인지 테스트 해보는 용도로 사용하고 있다. 만약 Expression의 값이 null이 아니라면 instanceof 오퍼레이터는 true이다. instanceof 오퍼레이터의 프로퍼티는 상당히 중요하다. 바로 이것이 타입 캐스팅 체크를 할 때 몹시 유용하기 때문이다.

 

public class NullTest {
    public static void main(String[] args)
            throws java.lang.Exception
    {
        Integer i = null;
        Integer j = 10;

        // false가 나옴
        System.out.println(i instanceof Integer);

        // 성공적인 컴파일링, true 나옴
        System.out.println(j instanceof Integer);
    }
}

 

 


 

 

6. 스태틱 vs 넌 스태틱 메서드

우리는 non-static인 메서드를 null 값을 가진 참조 변수에 부를 수 없다. 그렇게 되면 NullPointerException과 인사하게 될 것이기 때문. 하지만 우리는 static인 메서드를 null 값들을 가진 참조 변수에 부를 수 있다. static binding을 사용하여 static메서드들이 이어지면 Null pointer Exception을 던지지 않을 것이다.

 

public class Test {
	public static void main(String args[])
	{
		Test obj = null;
		obj.staticMethod();
		obj.nonStaticMethod();
	}

	private static void staticMethod()
	{
		// null 참조를 부를 수 있음
		System.out.println(
			" static method,
				can be called by null reference & quot;);
	}

	private void nonStaticMethod()
	{
		// null 참조를 부를 수 없음
		System.out.print("
						Non - static method - ");
		System.out.println(
			"
			cannot be called by null reference & quot;);
	}
}

※ 개인적으로 이부분 이해가 안됌. 무슨 문법이길래 더블 코테이션 마크가 저런 모양이지...

 


 

7. == 와 !=

자바에서 같다와 같지 않다 오퍼레이터는 null과 함께 사용할 수 있다. 이건 객체가 null 값인지 아닌지 확인할 수 있으므로 상당히 유용하다.

public class NullTest {
    public static void main(String args[])
    {

        // true 출력;
        System.out.println(null == null);

        // false 출력;
        System.out.println(null != null);
    }
}

 

 


 

8. null은 메서드에서 독립변수로 사용될 수 있다.

우리는 자바에서 null을 독립변수로 통과시킬 수 있고 똑같이 프린트할 수 있다. 독립변수의 데이터 타입은 참조 타입이어야하는데 리턴 타입이 void, int, double, 또는 프로그래밍 로직에 따라 다른 참조타입이 될 수 있다. 여기 메서드 "print_null"은 간단하게 메인 메서드를 통과한 독립변수을 프린트할 것이다. 

import java.io.*;

class GFG {
	public static void print_null(String str)
	{
		System.out.println("Hey, I am : " + str);
	}
	public static void main(String[] args)
	{
		GFG.print_null(null);
	}
}

// 출력: Hey, I am : null

 


 

9. null과 + 오퍼레이터 

자바에서 null 값과 String 변수들을 이을 수 있다. 이런 방법은 자바에서 고안되었다.

 

null 값은 오직 String 변수하고만 이어질 수 있다. 만약에 '+' 오퍼레이터로 null값을 다른 타입의 변수들과 이어준다면 에러메세지를 만나게 될 것이다. Integer a = null + 7 은 이러한 에러 메세지를 보낼 것이다. "2진법 오퍼레이터 '+' 에게는 맞지 않는 피연산자 타입이다."

 

import java.io.*;

class GFG {
	public static void main(String[] args)
	{
		String str1 = null;
		String str2 = "_value";
		String output = str1 + str2;
		System.out.println("Concatenated value : "
						+ output);
	}
}

 

 


 

 

자료 원문

Gaurav Miglani가 기고한 아티클입니다!

https://www.geeksforgeeks.org/interesting-facts-about-null-in-java/
 

Interesting facts about null in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

'Java' 카테고리의 다른 글

[Java] Static  (1) 2022.08.16
[Java] Enhanced For Loop  (0) 2022.08.16
[Java] 배열과 반복문 예제  (0) 2022.08.14
[Java] 중첩 반복문  (0) 2022.08.14
[Java] 구구단 출력  (0) 2022.08.14
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함