Chapter 02 변수(Varialbe)
2. 변수의 타입
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것이 허용된다.
int i = 'A' // OK. 문자 'A'의 유니코드인 65가 변수 i에 저장된다.
long l = 123; // OK. int보다 long타입이 더 범위가 넓다.
double d = 3.14f; // OK. float보다 double타입이 더 범위가 넓다.
그러나 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러가 발생한다.
int i = 0x123456789; // 에러. int타입의 범위를 넘는 값을 저장
float f = 3.14; // 에러. float타입보다 double타입의 범위가 넓다.
3.14
는 3.14d에서 접미사가 생략된 것으로 double
타입이다. 이 값을 float
타입으로 표현할 수 있지만 double
타입의 리터럴이므로 float
타입의 변수에 저장할 수 없다.
byte
와 short
타입의 리터럴은 따로 존재하지 않으므로 int
타입의 리터럴을 사용한다. 단, short
타입의 변수가 저장할 수 있는 범위에 속한 것이어야 한다.
byte b = 65; // OK. byte타입에 저장 가능한 범위의 int타입 리터럴
short s = 0x1234; // OK. short타입에 저장 가능하 범위의 int타입 리터럴
값의 크기에 상관없이 double
타입의 리터럴을 float
타입의 리터럴을 float
타입의 변수에 저장할 수 없다는 것을 주의하자.
'A'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다. 두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열(무자의 연속된 나열) 리터럴'이라고 한다.
char sh = 'J'; // char ch = 'Java'; 이렇게 할 수 없다.
String name = "Java"; // 변수 name에 문자열 리터럴 "Java"를 저장
char
타입의 변수는 단 하나의 문자만 저장할 수 있으므로 여러 문자(문자열)를 저장하기 위해서는 String
타입을 사용해야 한다.
문자열 리터럴은 ""안에 아무런 문자도 넣지 않는 것을 허용하며 이를 빈 문자열(empty string)이라고 한다. 그러나 문자 리터럴은 반드리 ''안에 하나의 문자가 있어야한다.
String str = ""; // OK. 내용이 없는 빈 문자열
char ch = ''; // 에러. ''안에 반드시 하나의 문자가 필요
char ch = ' '; // OK. 공백 문자(blank)로 변수 ch를 초기화.
원래 String
은 클래스이므로 아래와 같이 객체를 생성하는 연산자 new
를 사용해야하지만 위와 같은 표현도 허용한다.
String name = new String("Java"); // String객체를 생성
그리고 덧셈 연산자를 이용해서 문자열을 결합할 수 있다.
String name = "Ja" + "va"; // name은 "Java"
String str = name + 8.0; // str은 "Java8.0"
덧셈 연산자(+)는 피연산자가 모두 숫자일 때는 두 수를 더하지만 피연산자 중 어느 한쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합한다.
기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 되는 것이다.
문자열 + any type ➡️ 문자열 + 문자열 ➡️ 문자열
any type + 문자열 ➡️ 문자열 + 문자열 ➡️ 문자열
예를 들어 7 + "7"을 계산할 때 7이 String이 아니므로 먼저 7을 String으로 변화한 다음 "7"+"7"을 수행하여 "77"을 결과로 얻는다.
7 + " " ➡️ "7" = " " ➡️ "7 "
" " + 7 ➡️ " " + "7" ➡️ " 7"
7 + "7" ➡️ "7" + "7" ➡️ "77"
7 + 7 + "" ➡️ 14 + "" ➡️ "14" + "" ➡️ "14"
"" + 7 + 7 ➡️ "7" + 7 ➡️ "7" + "7" ➡️ "77"
true + "" ➡️ "true" + "" ➡️ "true"
null + "" ➡️ "null" + ➡️ "null"
덧셈 연산자는 왼쪽에서 오른쪽의 방향으로 연산을 수행하기 때문에 결합의 순서에 따라 결과가 달라진다는 것에 주의해야 한다. 그리고 7과 같은 기본형 타입의 값을 문자열로 반환할 때는 아무런 내용도 없는 빈 문자열("")을 더해주면 된다는 것도 알아둬야한다.
/* 예제 2-3 */
public class StringEx {
public static void main(String[] args) {
String name = "Ja" + "va";
String str = name + 8.0;
System.out.println(name);
System.out.println(str);
System.out.println(7 + " ");
System.out.println(" " + 7);
System.out.println(7 + "");
System.out.println("" + 7);
System.out.println("" + "");
System.out.println(7 + 7 + "");
System.out.println("" + 7 + 7);
}
}
📑 원본 자료
- Java의 정석(3판) [남궁 성/도우출판/2016]