이전 포스팅에 이어 참조 타입과 참조 변수를 더 보자.
Null / NullPointerException
기본 타입 변수에서 ==,!=의 연산은 변수의 값이 같은지/다른지 조사한다.
참조 타입 변수에서 ==,!=의 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.
Null / NullPointerException 은 아래 처럼 실행을 한다.
refVar1 == null // false
refVar1 != null // true
refVar2 == null //true
refVar2 != null //false
자바는 프로그램 실행 도중 발생하는 오류를 예외(Exception)라고 부른다.
예외는
- 사용자의 잘못된 입력으로 발생
- 프로그래머가 코드를 잘못 작성해서 발생
참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다. 이는 참조 타입 변수를 자롯 사용하면 발생한다.
참조 변수가 null을 가지고 있는 경우는 참조 객체가 없으므로 변수를 통해 객체를 사용할 수 없다.
int[] intArray = null; // intArray는 참조 변수 이고, null로 초기화
intArray[0] = 10; //NullPointerException 발생
//intArray 변수가 참조하는 배열객체가 없다.
String str = null; //String클래스에 str변수를 null 로 초기화
System.out.println("총 문자수: " + str.length()); //NullPointerException 발생
//str변수가 참조하는 String객체가 없기 때문
String 타입
문자열은 String 객체로 생성되고 변수는 String 객체를 참조 한다.
(일반적으로 STring 변수에 저장한다라고 표현)
//String 변수선언
String str;
//str 변수에 문자열 저장
str = "문자열";
//변수 선언과 동시에 문자열을 저장
String str = "문자열";
아래의 그림을 보면,
name변수와 hobby변수는 스택 영영엑 저장된다.
문자열 리터럴인 "신용권" 과 "자바"는 힙 영역에 String 객체로 생성된다.
name변수와 hobby변수는 String 객체의 번지 값이 저장 된다.
(*문자열 리터럴 이란, 문자열 표현법 이라고 이해해되 된다.)
String name = "신용권";
String hobby = "자바";
자바는 문자열 이터럴이 동일하면 String 객체를 공유한다.
아래의 그림을 보면,
name1과 name2 변수가 동일한 문자열 리터럴인 "신용권"을 참조할 경우 name1과 name2는 같은 String객체를 참조 한다.
String name1 = "신용권";
String naem2 = "신용권";
일반적으로 변수에 문자열을 저장할 경우에는 문자열 리터럴을 사용하지만,
new연산자를 사용해서 직접 String 객체를 생성 시킬수 있다. new 연산자는 힙영역에 새로운 객체를 만들 때 사용하는 연산자로 객체 생성 연산자 라고 한다.
new 연산자를 사용해서 각각의 String객체 따로 생성하여 할 수 있다.
String name1 = "자바";
String name2 = "자바";
String name3 = new String("자바");
name1 == name2 //true
name1 == name3 //false -> 새로운 String객체를 생성
내부 문자열을 비교할 때는String 객체의 equals()메소드를 사용한다.
equals()메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교후 ture/false값을 반환한다.
String name1 = "자바";
String name2 = "자바";
String name3 = new String("C");
String name4 = new String("자바");
//변수에 담긴 문자열이 같은지 확인하는 예
boolean result = name1.equals(name2);
System.out.println(result); //true
boolean result2 = name1.equals(name3);
System.out.println(result2); //false
boolean result3 = name1.equals(name4);
System.out.println(result3); //true
※용어 정리
- null: 참조 타입 변수는 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다. null값도 초기값으로 사용 할 수있어 null로 초기화된 참조 변수는 스택 영역에 생성 된다.
- NullPointerException: 참조 변수가 null을 가지고 있을 경우에는 참조 객체가 없으므로 참조 변수를 통해 객체를 사용할 수 없다.
- null인 참조 변수를 통해 있지도 않은 객체의 필드나 메소드를 사용하면 NullPinterException이 발생 한다.
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 배열2 (0) | 2020.09.22 |
---|---|
자바(Java) - 배열1 (0) | 2020.09.21 |
자바(Java) - 참조 타입과 참조 변수1 (0) | 2020.09.19 |
자바(Java) - ★찍기2 (0) | 2020.09.19 |
자바(Java) - ★찍기1 (0) | 2020.09.16 |