String 클래스를 통해 문자열 생성 방법
- String 클래스는 기본형이 아니라 참조형이다.
- 문자열은 매우 자주 사용되어 자바 언어에서는 아래 1번과 같이 작성해도 new String("hello")와 같이 변경해준다.
1. String str1 = "hello";
2. String str1 = new String("hello");
String 클래스 - 비교
동일성(Identity) : == 연산자를 사용해서 두 객체의 참조가 동일한지 확인
동등성(Equality) : equals() 메서드를 사용하여 두 객체가 논리적으로 같은지 확인
String str1 = "hello";
String str2 = new String("hello");
String str3 = new String("hello");
System.out.println(str1 == str2); // false
System.out.println(str2 == str3); // false
System.out.println(str1.equals(str2)); // true
System.out.println(str2.equals(str3)); // true
문자열 풀
- String str = "hello"와 같이 문자열 리터럴을 사용하는 경우 자바는 메모리 효율성과 최적화를 위해 풀을 사용한다.
- 자바가 실행되는 시점에 문자열 리터럴이 있으면 문자열 풀에 String 인스턴스를 만들어둔다.
- 같은 문자열이 있으면 String 인스턴스를 만들지 않고 동일한 문자열에 인스턴스를 찾고 해당 인스턴스를 참조한다.
String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
불변 객체
1. 변경이 필요한 경우 기존 값을 변경하지 않고 새로운 결과를 만들어서 반환한다.
2. String 내부의 값을 변경할 수 있다면 기존에 문자열 풀을 통해 같은 문자를 참조하는 변수의 String값이 변경되는 문제가 생길 수 있음
// 1번 예제
String str1 = "hello";
str1.concat("java");
String str2 = str1.concat(" java");
System.out.println("str1 = " + str1); // hello
System.out.println("str2 = " + str2); // hello java
// 2번 예제
String str3 = "hello";
String str4 = "hello";
str2 = "bye";
System.out.println("str3 = " + str3); // hello
System.out.println("str4 = " + str4); // bye
StringBuilder 가변 String
- 내부의 값을 변경할 수 있는 String
- 변경된 값을 사용할때 불변 객체와 다르게 새로운 객체를 생성하지 않는다.
- 내부의 값을 변경할때마다 새로운 객체를 생성하는게 아니기 때문에 성능과 메모리 측면에서 효율적이다.
불변 객체 값 변경
// 문자열 변경시 동작 순서
String str = String("A") + String("B") + String("C") + String("D");
// 1
String str = new String("AB") + String("C") + String("D");
// 2
String str = new String("ABC") + String("D");
// 3
String str = new String("ABCD");
- 1번과 2번에서 생성된 new String("AB")과 new String("ABC")은 사용되지 않는다.
- 이후에 GC의 대상이 된다.
가변 객체 값 변경
StringBuilder sb = new StringBuilder();
sb.append("A");
sb.append("B");
sb.append("C");
sb.append("D");
System.out.println("sb = " + sb); // ABCD
'인강 > 자바(중급1편)' 카테고리의 다른 글
불변 객체 (0) | 2024.05.06 |
---|---|
Object 클래스 (0) | 2024.04.23 |