코린이의 소소한 공부노트

문자와 문자열 본문

Java

문자와 문자열

무지맘 2021. 12. 8. 17:39

 

문자는 문자형 char의 리터럴이다.

char c1 = 'A'; // 작은 따옴표로 문자를 둘러싸면 된다.
char c2 = 'AB'; // 에러 발생 - 문자는 1개만 저장 가능

 

참조형인 String도 문자 리터럴을 사용하여 선언한다.

String s1 = "ABC"; // 큰 따옴표로 문자를 둘러싸면 된다.
String s2 = new String("ABC"); // ??

s2 변수를 선언할 때 기존 것과 차이가 있음을 알 수 있다. String은 클래스인데, 클래스는 객체를 new 키워드를 이용해 생성한다. 그런데 특별히 String만 기본형에 값을 저장하는 것과 같은 표현을 허용한다. 원칙은 s2 변수처럼 초기화를 하는 게 맞지만, s1처럼 초기화를 하는 것이 편하기 때문에 이를 더 많이 쓴다.

초기화만 기본형처럼 할 수 있는것이 아니라, 결합도 기본형처럼 가능하다.

// +를 이용해 숫자처럼 연산할 수 있다.
// 이때 결과는 문자를 코드로 바꾼 값의 합이 아닌
// 문자열의 결합이다.

String s = "A" + "B";
// A의 코드: 10진수 65
// B의 코드: 10진수 66
// s에 저장되는 값은 코드가 131에 해당하는 문자가 아니라 "AB"

문자열 결합은 숫자와 문자열 사이에서도 가능하다.

String s1 = "" + 1; // 결과는 "1"
// "" + 1 -> "" + "1" -> "1"

String s2 = "" + 1 + 1; // 결과는 "11"
// "" + 1 + 1 -> "1" + 1 -> "1" + "1" -> "11"

String s3 = 1 + 1 + ""; // 결과는 "2"
// 1 + 1 + "" -> 2 + "" -> "2" + "" -> "2"

문자열과 숫자를 결합하면 왼쪽에서 오른쪽으로 숫자가 문자열로 자동 변환이 되어 결합되는데, 순서에 따라 결과가 달라질 수 있으니 의도한 대로 결합이 이루어지게 확인해 볼 필요가 있다.

 

char도 String도 문자를 저장하지만, 타입 차이, 저장 가능 문자 개수 차이 외에도 차이점이 또 있다.

char c = ''; // 에러 발생 - char는 반드시 문자 1개를 저장해야한다.
String s = ""; // String은 빈 문자열 저장이 가능하다.

변수 c를 출력할 때 굳이 빈 것으로 출력하고 싶다면, 공백 문자(space바)를 하나 넣으면 출력 시에는 빈 것으로 보인다. 하지만 실제로는 빈 문자가 아닌 공백 문자 1개가 들어가 있다는 것을 명심해야 한다.


[쿠키글] 참조형 변수의 기억공간은?

String a = new String("abcd");

위 코드를 작성하면 벌어지는 일을 순서대로 표현해보면 아래와 같다.

1. String 타입의 변수 a가 만들어진다. 이때 기억공간의 크기는 4 byte이다.

2. 문자열 "abcd"를 담은 String 객체가 만들어진다.

3. 2번에서 만들어진 객체의 주소가 a에 저장된다.

[그림 003] String 변수 선언, 객체 생성

1~3번의 그림을 합쳐서 가장 오른쪽 그림처럼 간단하게 표현하기도 한다.

만약 여기에서 참조형 변수 a가 어떠한 객체도 참조하고 있지 않게 만들고 싶다면,

a = null;

을 쓰면 된다. 여기서 null은 비어있다는 것을 나타내는 것으로, 0과는 다르다(0은 0이라는 값이 있는 것). 이걸 쓰면 a에는 객체의 주소가 아닌 null값이 들어가게 되고, 화살표는 지워지게 된다.