String 타입
String 변수에 문자열 리터럴을 대입할새 경우 스택 영역에 변수가 선언이 되고 힙 영역에 리터럴(객체)
가 생성되어 스택 영역에 저장이 된다. 만약 같은 리터럴로 변수 값을 선언하면 힙 영역에 생성된 하나의 객체로 두 변수가 공유하여 가지게 된다.
New 연산자
- 객체 생성 연산자
- 힙 영역에 새로운 String 객체를 생성
String name1 = new String("신용권");
String name2 = new String("신용권");
문자열 리터럴과 new 연산자로 생성된 객체 비교
String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");
name1 == name2 : true
name1 == name3 : false
new를 이용하여 string객체를 만들게 되면 새로운 힙 영역에 저장이 되어 서로 같은 문자열 이어도
다른 힙 영역에 저장되기 때문에 다른 스트랭 객체로 인식된다.
문자열 비교
== : 번지 비교 (X)
equals(): 문자열 비교 (O)
== 연산자는 문자열의 번지를 비교하고, equals연산자는 문자열 자체를 비교를 한다.
그래서 문자열을 비교할 때에는 주로 equals연산자를 사용한다.
boolean result = str1.equals(str2);
(원본) (비교대상)
str1과 str2가 서로 동일한 객체를 참조하고 있다.
new String(); 연산자를 이용해 선언을 하니 서로 다른 참조를 하고 있다.
String 변수 초기값으로 null 대입이 가능하다.
String hobby = null;
이는 String 변수가 참조하는 객체가 없음을 의미한다.
String hobby = "여행";
hobby = null;
다른 값 대입 후에 다시 null값 대입 가능
참조를 잃은 String 객체는 쓰레기 수집기 (Garbage Collector) 통해 메모리에서 자동 제거된다.
null 값의 length를 구하려 시도하자 NullPointerException 발생
객체를 메모리에서 지우기 위해서는 위와 같이 null값을 대입해 변수에 저장된 참조를 끊어준다.
null값의 이전에 참조되어 있던 객체는 쓰레기 객체가 되고 쓰레기 수집기에 의해 메모리가 부족하거나 cpu가 한가할 때 메모리에서 제거가 된다.
C++ 에는 객체 제거 코드가 있지만 자바는 쓰레기 수집기가 있어 그런 코드가 따로 없다.
'JAVA > 혼자공부하는자바' 카테고리의 다른 글
[JAVA 기초] 자바 배열 2 (명령라인에서의 실행) (0) | 2020.12.16 |
---|---|
[JAVA 기초] 자바 배열 1 (선언, 생성, length) (0) | 2020.12.16 |
[JAVA 기초] 참조 타입과 참조 변수(==/!=연산, NullPointerException) (0) | 2020.12.11 |
[JAVA 기초] 자바 반복문 (for문, while문, do-while문, break, continue, label) (0) | 2020.12.11 |
[JAVA 기초] 조건문 (if문, switch문) (0) | 2020.12.10 |