String은 참조 타입이지만 기본 타입처럼 쓸 수 있는 문자열이라고 다룬 적이 있습니다.
이런 문자열 String은 불변성(immutable)을 가지고 있습니다.
또 String 타입과 다른 타입을 연산하면 다른 타입도 String 타입으로 인식하게 되는데요.
이게 무슨 말인지 잠시 코드를 볼까요?
String s = "Hello";
System.out.println(s + 1 + 2);
System.out.println(1 + 2 + s);
System.out.println(s);
String h = "Hello";
System.out.println(h);
System.out.println(s == h);
String newS = new String("Hello");
System.out.println(newS);
System.out.println(s == newS);
String s = "Hello";
먼저 String 타입의 s라는 변수를 선언하여 "Hello"의 값을 넣어줬습니다.
System.out.println(s + 1 + 2);
그런 후에 s + 1 + 2를 출력하면 Hello3이 나올까요? Hello12가 나올까요?
출력 결과는 Hello12가 나옵니다. 연산 순서가 왼쪽부터 이기 때문입니다.
s + 1을 먼저 해서 "Hello1"이라는 문자열이 나오고 여기에 + 2를 하면 "Hello12"문자열이 나오게 됩니다.
System.out.println(1 + 2 + s);
반대로 1 + 2 + s가 되면 어떻게 출력이 될까요??
연산을 왼쪽부터 해보시면 1 + 2를 연산하여 3이 되고 3에 s인 "Hello"문자열을 더하면 3Hello가 출력되게 됩니다.
System.out.println(s);
위의 연산은 연산하여 변수에 다시 대입한 게 아니라 출력물에서 연산을 해주었기 때문에 s를 출력하면 기존에 s에 대입했던 "Hello"가 출력이 됩니다.
String h = "Hello"; System.out.println(h);
이번에는 h라는 변수에 Hello의 값을 넣어준 문자열을 만들어 보겠습니다.
System.out.println(s == h);
s 와 h가 같은지 비교를 해봤는데 같다고 나오네요!
String newS = new String("Hello");
System.out.println(newS);
자 그럼 new 키워드를 사용해서 새로운 객체의 문자열 newS를 만들어보았습니다.
System.out.println(s == newS);
s와 newS를 비교했더니 다르다고 나옵니다!
왜 그럴까요??
String s = "Hello";
System.out.println(s + 1 + 2);
System.out.println(1 + 2 + s);
System.out.println(s);
String h = "Hello";
System.out.println(h);
System.out.println(s == h);
String은 heap 영역 안에 String pool이라는 것이 존재하는데요.
위의 코드에서 s가 생성되었을 때 String pool에는 "Hello"라는 값을 가진 객체가 생성이 됩니다.
h가 생성되었을 때 String pool에는 이미 "Hello"값을 가진 객체가 있기 때문에 새로운 객체를 생성하지 않고 기존에 있던 "Hello"가 들어 있는 객체의 주소값을 가리킵니다.
String newS = new String("Hello");
System.out.println(newS);
System.out.println(s == newS);
하지만 new 키워드를 선언하여 "Hello"값이 있는 newS를 선언했다면 String pool에 "Hello"객체가 있어도 새로운 객체를 만들겠다고 말하는 것과 같습니다.
그래서 s와 newS를 비교했을 때 주소값이 다르다고 나오는 것입니다.
쉽게 말해서 heap 영역에 String pool이 있는데 String이 생성되면 String pool 안에는 그 객체가 떠다닙니다.
new 키워드를 선언하여 새로운 객체를 만들지 않으면 String이 생성이 되더라도 값이 같으면 이미 생성돼있는 String을 가리키게 되는 것입니다.
'Java 관련 > Java' 카테고리의 다른 글
[Java] Split() & StringTokenizer() (0) | 2021.10.30 |
---|---|
[Java] String() & StingBuffer() (0) | 2021.10.29 |
[Java] Calendar 클래스를 이용한 달력(calendar) (0) | 2021.10.27 |
[Java] 달력(calendar) 만들기 (1) | 2021.10.26 |
[Java] 인터페이스(Interface) (0) | 2021.10.23 |