원본: https://www.baeldung.com/java-string-initialization
자바 String 객체 초기화에 관한 글입니다.
생성하는 방식은 크게 2가지 방식이 있습니다.
New
키워드를 이용한 객체생성- `Literal` 방식을 이용한 객채생성
## 1. 생성방식
```JAVA
@Test
void String_생성방법() {
String usingNew = new String("minseok");
String usingLiteral = "minseok";
}
```
두 방식이 같지는 않습니다. 그 이유는 간단하게 밑에서 설명하겠습니다.
만약 초기화 값을 명시하지 않으면 어떻게 될지도 살펴보겠습니다.
## 2. 초기화값이 없을때
```JAVA
public class StringBasicInitTest {
String fieldString;
@Test
void 지역변수와_멤버변수차이() {
//given
String localVarString;
//when
// System.out.println(localVarString); <- Compile error
//then
assertNull(fieldString);
}
}
```
Class를 만들고 지역변수와 멤버변수를 출력하려고하는 코드입니다.
지역변수는 컴파일 에러를 발생시키고 멤버변수는 Null이 출력될 것입니다. 또한 초기화되지 않은 멤버변수는 `Null`값을 가집니다.
```Java
@Test
void 지역변수_null초기화시_멤버변수_초기값과같아야한다() {
//given
String localVarString = null;
//when
//then
assertEquals(localVarString, fieldString);
}
```
## 3. 리터럴방식과 new의 차이
동일성, 동등성에 대한 개념이 나오는데 이 부분은 설명하지 않겠습니다. 다른 좋을글들을 통해 학습하는게 좋습니다.
```JAVA
@Test
void Literals_로선언시_동일성을지닌다() {
//given
String literalOne = "Minseok";
String literalTwo = "Minseok";
//then
assertTrue(literalOne == literalTwo);
}
```
```JAVA
@Test
void new_로선언시_동일성을지니지않는다() {
//given
String literalOne = new String("Minseok");
String literalTwo = new String("Minseok");
//then
assertFalse(literalOne == literalTwo);
}
```
리터럴방식으로 생성하는 경우와, `New`연산자를 통해 생성하는 방식의 차이는 위 코드를 보면 알 수 있습니다.
동일성에 대한 차이가 있어서 이 부분을 고려하여 스트링 객체 생성을 하면 됩니다.
## 4. 빈 문자열
빈 문자열을 생성하는 방식에는 크게 3가지가 있습니다. ""를 이용하여 리터럴방식으로 생성하거나 `new`를 통해 생성하는 2가지 방식이 있습니다.
그리고 이렇게 생성했을 경우 각각의 경우가 동일성, 동등성을 다르게 지니는데 테스트 코드를 확인해보면 됩니다.
```Java
@Test
void 빈_문자열_선언방법_및_동일성_동등성_확인() {
//given
String emptyLiteral = "";
String emptyNewString = new String("");
String emptyString = new String();
//then
assertFalse(emptyLiteral == emptyNewString);
assertFalse(emptyLiteral == emptyString);
assertFalse(emptyNewString == emptyString);
assertEquals(emptyLiteral, emptyNewString);
assertEquals(emptyLiteral, emptyString);
}
```
## 5. Null에 대하여
마지막으로 `Null`값을 console에 출력해보면 "null"이라고 찍힙니다. 왜그런걸까요. `Null`값이 문자열 "null"값을 지닌걸까요
먼저 간단하게 말하면 이는 `System.out.println()` 메소드의 구현방식에서 답을 알 수 있습니다.
이를 확인하기위해 해당 메서드의 구현방식을 확인해보겠습니다.


println()의 구현체를 보면 PrintStream.class인지 확인하고 맞으면 `String.valueOf(x)`의 값을 `writeln()`에 넘겨줍니다.
여기서 `writeln()`의 구현은 보지 않아도 되므로, `String.valueOf()` 메서드의 구현을 확인해보면

이렇듯 넘겨온값이 `Null`인 경우 "null"값을 반환하게 설정되어있습니다.
때문에 `Null`값을 출력시 "null"이 호출되는것을 알 수 있습니다.
모든 코드는 제 깃허브인 https://github.com/kkminseok/baeldung-test/tree/main/Java-String 에서 확인가능합니다.
'Baeldung번역&공부 > Java-string' 카테고리의 다른 글
String 비교법(Comparing Strings in Java) (0) | 2025.01.28 |
---|---|
문자열 순회 방법들(How to Iterate Over the String Characters in Java) (0) | 2025.01.27 |
String Pool에 대하여(Guide to Java String Pool) (0) | 2025.01.26 |
문자열을 잇는방법(Concatenating Strings in Java) (0) | 2025.01.22 |
왜 String은 불병성을 가지나(Why String Is Immutable in Java?) (0) | 2025.01.21 |