[JAVA] 이것이 자바다_2

Updated:

JAVA의 String 타입에 대해 알아보자.

String 타입


JAVA는 문자열을 String 변수에 저장하기 때문에 다음과 같이 String 변수를 우선 선언해야 한다.

String 변수;

String 변수에 문자열을 저장하려면 큰 따옴표로 감싼 문자열 리터럴을 대입하면 된다.

변수 = "문자열";

변수 선언과 동시에 문자열을 저장할 수도 있다.

String 변수 = "문자열"; 

다음은 두 개의 String 변수를 선언하고 문자열을 저장한다.

String name;
name = "박동현";
String hobby = "자바";

사실 문자열을 String 변수에 저장한다는 말은 틀린 표현이다.
문자열이 직접 변수에 저장되는 것이 아니라, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
name 변수와 hobby 변수는 스택 영역에 생성되고, 문자열 리터럴인 “박동현”과 “자바”는 힙 영역에 String 객체로 생성된다.
그리고 name 변수와 hobby 변수에는 String 객체의 주소 값이 저장된다.

자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다.
name1과 name2 변수가 동일한 문자열 리터럴인 “박동현”을 참조할 경우 name1과 name2는 동일한 String 객체를 참조한다.

String name1 = "박동현"
String name2 = "박동현"

일반적으로 변수에 문자열을 저장할 경우에는 문자열 리터럴을 사용하지만, new 연산자를 사용해서 직접 String 객체를 생성할 수도 있다. new 연산자는 힙 영역에 새로운 객체를 만들 때 사용하는 연산자로 객체 생성 연산자라고 한다.

String name1 = new String("박동현");
String name2 = new String("박동현");

이 경우 name1과 name2는 서로 다른 String 객체를 참조한다.

String name1 = "박동현";
String name2 = "박동현";
String name3 = new String("박동현");

name1과 name2는 동일한 문자열 리터럴로 생성된 객체를 참조하므로 name1==name2의 결과는 true이다. 그러나 name3은 new 연산자로 String 객체를 별도로 생성했기 때문에 name1==name3은 false가 나온다. 동일한 String 객체이건 다른 String 객체이건 상관없이 문자열만을 비교할 때에는 String 객체의 equals() 메소드 를 사용해야 한다. equals() 메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교한 후 true 또는 false를 return한다.

boolean result = str1.equals(str2);

String 변수는 참조 타입이므로 초기값으로 null을 대입할 수 있다.
null은 String 변수가 참조하는 String 객체가 없다는 뜻이다.

다음 코드처럼 hobby 변수가 String 객체를 참조하였으나, null을 대입함으로써 더 이상 String 객체를 참조하지 않도록 할 수도 있다.

String hobby = "여행";
hobby = null;

참조를 잃은 String 객체는 JVM의 Garbage Collector가 메모리에서 자동 제거한다.


JAVA의 String 타입을 정리해보았다.
메모리 영역과 연결지어 정리하니 확실히 깊게 이해할 수 있었다.
Garbage Collector가 어떤 때에 동작하는 지도 직관적으로 이해했다.

Leave a comment