Java에서 일반적인 데이터 타입의 비교는 == 연산자를 사용한다.
하지만 String에서는 ==이 아닌 equals 연산자를 사용한다.
public class Test {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));
}
}
String 변수 생성
String 변수를 생성하는 방법은 2가지가 있다.
String str1 = "Hello"; // 리터럴 방식
String str2 = new String("Hello"); // new 연산자 방식
str1 과 str2는 둘다 "Hello"를 저장하고있지만 메모리 관점에서 차이가 있다.
str1과 같은 리터럴 방식은 String Consant Pool에 저장되고
str2와 같이 new 방식으로 생성되는 String은 Heap 영역에 저장된다.
스택 영역에 주소값을 저장한다. == 연산자는 스택에 저장된 주소값을 비교한다.
String Constant Pool 이란?
String Constant Pool이란 Java에서 문자열 리터럴을 저장하는 독립된 영역을 의미한다. (String Constant Pool도 힙영역에 존재한다)
String Literal이 생성되면 String Pool에 해당 객체가 존재하는지 확인하고 존재하면 기존 객체를 반환하고
String Pool에 해당 객체가 없다면 새로운 객체를 생성하여 String Pool에 저장하고 재사용한다.
(String Pool은 HashMap 구조 형태이므로 중복되는 데이터가 없다.)
String의 불변성
String은 불변 객체이다. 즉, 한번 생성하면 변경이 불가능 하다.
그러면 아래코드와 같이 우리가 수정을 하면 무슨일이 생길까?
String str1 = "Hello";
str1 = "Java";
수정된 값을 가지는 새로운 String 객체를 생성해서 리턴해준다.
즉, 수정이 아니라 새로운 객체를 만드는것이다.
String 객체가 수정이 안되는이유
그렇다면 String 객체는 왜 수정이 안되는것일까?
private final byte[] value; // String class의 맴버변수
위와 같이 private final 키워드가 있어서 수정될수가 없고, 따라서 String 객체는 수정이 아닌 새로운 객체를 만들어서 리턴하는것이다.
String 객체가 불변객체인 이유
그렇다면 왜 String 객체를 불변 객체로 만들었을까?
크게 3가지 이유가 있다.
- 성능
- String은 String Pool을 이용하여 객체를 관리하는데, 생성된 String은 동일한 문자열에 대한 여러 참조가 같은 String 객체를 가리키게 된다. 이때 동일한 문자열에 대한 중복 생성을 방지하고 메모리를 절약할 수 있습니다.
- 보안
- 불변 String은 암호화나 해시 등과 같은 보안 관련 작업에서 안전하게 사용될 수 있다. 내용이 변경되지 않기 때문에 예측할 수 없는 상태를 유지할 수 있다.
- 동시성
- 불변 String 은 여러 스레드에서 안전하게 공유될 수 있다. 한 번 생성된 문자열은 변경되지 않기 때문에 여러 스레드에서 동시에 접근해도 문제가 발생하지 않는다.
String, StringBuilder, StringBuffer
https://bangbaeking.tistory.com/89
[Java] String, StringBuffer, StringBuilder 차이 및 장단점
Java에서 문자열을 다루는 대표적인 클래스에는 String, StringBuffer, StringBuilder가 있다. 각 클래스의 차이점 및 장단점을 정리해보자. String vs StringBuffer / StringBuilder String과 StringBuffer/StringBuilder 클래스
bangbaeking.tistory.com
Reference
- https://2jinishappy.tistory.com/293
- https://coding-factory.tistory.com/536
- https://inpa.tistory.com/entry/JAVA-%E2%98%95-String-%ED%83%80%EC%9E%85-%ED%95%9C-%EB%88%88%EC%97%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-String-Pool-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B9%84%EA%B5%90#%EC%9E%90%EB%B0%94_string_%EC%A3%BC%EC%86%8C%ED%95%A0%EB%8B%B9_%EB%B0%A9%EC%8B%9D
- https://velog.io/@indongcha/String-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EC%83%9D%EC%84%B1%EA%B3%BC-%EB%B6%88%EB%B3%80%EC%84%B1
'Java , Spring > Java' 카테고리의 다른 글
[Java] JVM 메모리 구조 (0) | 2024.01.12 |
---|---|
[Java] String, StringBuffer, StringBuilder 차이 및 장단점 (0) | 2024.01.10 |
[Java] JVM , Java compiler, Java 코드 실행과정 JDK,JRE,JVM (0) | 2024.01.09 |
[Java] next(), nextLine() 차이 (0) | 2024.01.07 |
[Java] Optional (0) | 2023.09.15 |
댓글