[Java의 정석] 상수와 리터럴(constant & literal) (2)

말하는 감자·2023년 10월 9일
0

Java의 정석

목록 보기
12/32
post-thumbnail

Chapter 02 변수(Varialbe)

2. 변수의 타입

📌 상수와 리터럴(constant & literal)

📍 타입의 불일치

리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것이 허용된다.

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타입의 변수에 저장할 수 없다.

byteshort타입의 리터럴은 따로 존재하지 않으므로 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]
profile
나는 말하는 감자다

0개의 댓글