[자바 무료 강의] null ? - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의null ?최종수정일 2021-11-21
아이콘약 10분

앞으로도 자주 보게 될 null 값에 대해 알아봅시다.

노트 강의

Null


null에 대해서 정식적으로 설명하거나 강의를 한적은 없지만 실습을 하다보면 간간히 봤을 가능성이 높습니다.

null 이라는 것은 참조 자료형 변수만 선언하고 인스턴스의 참조 값이 저장되어 있지 않았을 때 기본적으로 null 값이 저장되어 있습니다.


case 1
String[] strArray = new String[3];

System.out.println(strArray[0]);
System.out.println(strArray[1]);
System.out.println(strArray[2]);

// null 
// null
// null

index를 이용하여 배열에 접근해보면 실제로 null이 출력됩니다.


case 2
String text = null;

System.out.println(text);

변수에 접근해보면 실제로 null이 출력됩니다.


case 3

만약에 Fruit 클래스가 존재하고 Fruit 참조 자료형 변수에 null 값을 저장했다고 가정해봅시다.

class Fruit {
    String name = "사과";
}
Fruit fruit = null;

System.out.println(fruit.name);

이와 같은 코드를 실행해보면 어떻게 될까요?

Fruit fruit 참조 자료형 변수에 Fruit 인스턴스의 참조값이 저장되어 있다면, Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근할 수 없고 NullPointerException이 발생합니다.


메서드와 매개변수와 null

class Person {

    String name = "김철수";

    public void setName(String name) {
        this.name = name;
    }
}
Person person = new Person();
person.setName(null);

메서드의 매개 변수가 참조 자료형인 경우 null 값을 전달할 수 있습니다. 이렇게 되면 name 변수는 null 값을 저장하게 됩니다. 메서드와 동일하게 생성자의 매개변수가 참조 자료형으로 선언되었을 경우도 동일합니다.


null 값을 확인하는 방법

null 값을 의도적으로 사용하기도 하고 의도적이지 않을 때도 있습니다. 의도적이든 비의도적이든 null 값을 확인할 필요가 있습니다. null==, != 연산자를 이용하여 확인할 수 있습니다.

if (null == name) {
    // name 변수에 저장된 값이 null 값이다.
}

다음 예시입니다.

String[] strArray = new String[4];

strArray[0] = "1";
strArray[2] = "2";
strArray[3] = "3";

for (int i = 0; i < strArray.length; i++) {
    System.out.println(strArray[i]);
}

// 출력
// 1
// null
// 2
// 3

공간이 네 개인 String 형 배열 인스턴스를 생성했습니다. 이러한 배열을 i는 0부터 배열의 크기전까지 순차적으로 배열의 내용을 읽는 코드입니다.

코드를 실행시키면 1, null, 2, 3이 출력됩니다. 만약에 null 값을 출력하고 싶지 않다면 어떻게 할까요?

String[] strArray = new String[4];

strArray[0] = "1";
strArray[2] = "2";
strArray[3] = "3";

for (int i = 0; i < strArray.length; i++) {
    if (null != strArray[i]) {
        System.out.println(strArray[i]);
    }
}

// 출력
// 1
// 2
// 3

조건문을 통해 null 값이 아닌 것만 확인하여 출력하면 됩니다.


마치며

이번 강의는 null 값에 대해 정리했습니다. 실제로 null 값을 빈번히 볼 수 있으며, NullPointerException도 앞으로 빈번히 보게 될 겁니다. NullPointerException이 발생해도 두려워 하지 마세요. 해결할 수 있는 방법은 있습니다. 해결 하는 방법은 예외 처리 강의에서 진행합니다.

도전자 질문
아이콘넬준(2021-10-20 15:12 작성됨)
null도 하나의 객체로 이해해도 되나요?

Fruit fruit = null; 일 때

fruit변수에 null객체의 레퍼런스 값이 저장된다.고 생각하면 무리가 있을까요?
아이콘코드라떼(2021-10-20 19:29 작성됨)
안녕하세요. 코드라떼입니다 :)

자바 언어 스펙에서의 null은 기본형(PrimitiveType)도 아니고 참조형(ReferenceType)도 아닌 별도의 null type으로 봅니다.
이게 끝입니다. 실제로 null을 어떻게 처리하는지는 자바 가상 머신 구현체마다 다를 수 있습니다.
C나 C++에서는 null을 0의 값으로보나 자바에서는 null을 특정한 리터럴로 봅니다.

결론적으로 null 참조값으로 생각하시면 됩니다. (줄여서 null값)
인스턴스에 접근할 수 있는 참조값도 본질적으론 정수형입니다.

감사합니다 :)
아이콘resCogitans(2021-07-01 04:14 작성됨)
fruit 참조형 변수에 Fruit 인스턴스의 참조 값이 저장되어 있다면 참조 값을 통해 Fruit 인스턴스에 접근하고 Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근한려고 하면 NullPointerException이 발생하게 됩니다.

-> Fruit 클래스의 참조값이 아니라 fruit 인스턴스라는 의미로 쓰신 건가요?
fruit참조형변수에 fruit인스턴스의 참조 값이 저장되어 있고, 그것을 통해(C의 포인터가 주소를 가리키듯이) name변수로 접근한다는 의미로 이해했는데, 맞는지 궁금합니다.
아이콘코드라떼(2021-07-01 04:37 작성됨)
다시 읽어보니 작성된 문장이 이상하네요. 해당 내용을 재작성한다면.. 

'Fruit fruit' 참조 자료형 변수에 Fruit 인스턴스의 참조값이 저장되어 있다면, Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근할 수 없고 NullPointerException이 발생합니다.

이게 더 깔끔한 것 같습니다^^
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의null ?최종수정일 2021-11-21
아이콘약 10분

앞으로도 자주 보게 될 null 값에 대해 알아봅시다.

노트 강의

Null


null에 대해서 정식적으로 설명하거나 강의를 한적은 없지만 실습을 하다보면 간간히 봤을 가능성이 높습니다.

null 이라는 것은 참조 자료형 변수만 선언하고 인스턴스의 참조 값이 저장되어 있지 않았을 때 기본적으로 null 값이 저장되어 있습니다.


case 1
String[] strArray = new String[3];

System.out.println(strArray[0]);
System.out.println(strArray[1]);
System.out.println(strArray[2]);

// null 
// null
// null

index를 이용하여 배열에 접근해보면 실제로 null이 출력됩니다.


case 2
String text = null;

System.out.println(text);

변수에 접근해보면 실제로 null이 출력됩니다.


case 3

만약에 Fruit 클래스가 존재하고 Fruit 참조 자료형 변수에 null 값을 저장했다고 가정해봅시다.

class Fruit {
    String name = "사과";
}
Fruit fruit = null;

System.out.println(fruit.name);

이와 같은 코드를 실행해보면 어떻게 될까요?

Fruit fruit 참조 자료형 변수에 Fruit 인스턴스의 참조값이 저장되어 있다면, Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근할 수 없고 NullPointerException이 발생합니다.


메서드와 매개변수와 null

class Person {

    String name = "김철수";

    public void setName(String name) {
        this.name = name;
    }
}
Person person = new Person();
person.setName(null);

메서드의 매개 변수가 참조 자료형인 경우 null 값을 전달할 수 있습니다. 이렇게 되면 name 변수는 null 값을 저장하게 됩니다. 메서드와 동일하게 생성자의 매개변수가 참조 자료형으로 선언되었을 경우도 동일합니다.


null 값을 확인하는 방법

null 값을 의도적으로 사용하기도 하고 의도적이지 않을 때도 있습니다. 의도적이든 비의도적이든 null 값을 확인할 필요가 있습니다. null==, != 연산자를 이용하여 확인할 수 있습니다.

if (null == name) {
    // name 변수에 저장된 값이 null 값이다.
}

다음 예시입니다.

String[] strArray = new String[4];

strArray[0] = "1";
strArray[2] = "2";
strArray[3] = "3";

for (int i = 0; i < strArray.length; i++) {
    System.out.println(strArray[i]);
}

// 출력
// 1
// null
// 2
// 3

공간이 네 개인 String 형 배열 인스턴스를 생성했습니다. 이러한 배열을 i는 0부터 배열의 크기전까지 순차적으로 배열의 내용을 읽는 코드입니다.

코드를 실행시키면 1, null, 2, 3이 출력됩니다. 만약에 null 값을 출력하고 싶지 않다면 어떻게 할까요?

String[] strArray = new String[4];

strArray[0] = "1";
strArray[2] = "2";
strArray[3] = "3";

for (int i = 0; i < strArray.length; i++) {
    if (null != strArray[i]) {
        System.out.println(strArray[i]);
    }
}

// 출력
// 1
// 2
// 3

조건문을 통해 null 값이 아닌 것만 확인하여 출력하면 됩니다.


마치며

이번 강의는 null 값에 대해 정리했습니다. 실제로 null 값을 빈번히 볼 수 있으며, NullPointerException도 앞으로 빈번히 보게 될 겁니다. NullPointerException이 발생해도 두려워 하지 마세요. 해결할 수 있는 방법은 있습니다. 해결 하는 방법은 예외 처리 강의에서 진행합니다.

도전자 질문
아이콘넬준(2021-10-20 15:12 작성됨)
null도 하나의 객체로 이해해도 되나요?

Fruit fruit = null; 일 때

fruit변수에 null객체의 레퍼런스 값이 저장된다.고 생각하면 무리가 있을까요?
아이콘코드라떼(2021-10-20 19:29 작성됨)
안녕하세요. 코드라떼입니다 :)

자바 언어 스펙에서의 null은 기본형(PrimitiveType)도 아니고 참조형(ReferenceType)도 아닌 별도의 null type으로 봅니다.
이게 끝입니다. 실제로 null을 어떻게 처리하는지는 자바 가상 머신 구현체마다 다를 수 있습니다.
C나 C++에서는 null을 0의 값으로보나 자바에서는 null을 특정한 리터럴로 봅니다.

결론적으로 null 참조값으로 생각하시면 됩니다. (줄여서 null값)
인스턴스에 접근할 수 있는 참조값도 본질적으론 정수형입니다.

감사합니다 :)
아이콘resCogitans(2021-07-01 04:14 작성됨)
fruit 참조형 변수에 Fruit 인스턴스의 참조 값이 저장되어 있다면 참조 값을 통해 Fruit 인스턴스에 접근하고 Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근한려고 하면 NullPointerException이 발생하게 됩니다.

-> Fruit 클래스의 참조값이 아니라 fruit 인스턴스라는 의미로 쓰신 건가요?
fruit참조형변수에 fruit인스턴스의 참조 값이 저장되어 있고, 그것을 통해(C의 포인터가 주소를 가리키듯이) name변수로 접근한다는 의미로 이해했는데, 맞는지 궁금합니다.
아이콘코드라떼(2021-07-01 04:37 작성됨)
다시 읽어보니 작성된 문장이 이상하네요. 해당 내용을 재작성한다면.. 

'Fruit fruit' 참조 자료형 변수에 Fruit 인스턴스의 참조값이 저장되어 있다면, Fruit 인스턴스의 name 변수에 접근하여 값을 읽을 수 있습니다. 그러나 참조값이 아닌 null 값이 저장되어 있으므로 Fruit 인스턴스에 접근할 수 없고 NullPointerException이 발생합니다.

이게 더 깔끔한 것 같습니다^^
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

Output
root$