8.5 문자열(String) 타입
1. 문자열도 객체입니다
우리가 편하게 쓰는 String은 사실 참조 타입(객체)입니다.
그래서 변수에는 실제 문자열이 아니라 주소가 저장됩니다.
2. 문자열 리터럴의 비밀
String name1 = "홍길동";
String name2 = "홍길동";
자바는 메모리를 아끼기 위해, 똑같은 문자열 리터럴(“홍길동”)이 있으면 새로 만들지 않고 기존 주소를 재사용합니다.
그래서 name1 == name2가 true가 나옵니다.
flowchart LR
subgraph Stack [스택 (Stack)]
n1[name1]
n2[name2]
end
subgraph Heap [힙 (Heap)]
subgraph Pool [String Constant Pool]
str["홍길동"]
end
end
n1 -->|같은 주소 가리킴| str
n2 -->|같은 주소 가리킴| str
style Stack fill:#eef,stroke:#333
style Heap fill:#efe,stroke:#333
style Pool fill:#d5e8d4,stroke:#333,stroke-dasharray: 5 5
style str fill:#bfb,stroke:#333
하지만 new String("홍길동")으로 만들면 강제로 새로운 집을 짓기 때문에 주소가 달라집니다.
결론: 문자열 비교는 묻지도 따지지도 말고 그냥
equals()를 쓰세요. 그게 마음 편합니다.
서브목차