반응형

리터럴의 타입과 접미사

종류 리터럴 접미사
논리형 false, true 없음
정수형 123, 0b0101, 077, 0xFF, 100L L
실수형 3.14, 3.0e8, 1.4f, 0x1.op-1 f, d
문자형 'A', '1', '\n' 없음
문자열 "ABC", "123", "A", "tre" 없음

 

정수형과 실수형은 타입이 여러개이기 때문에 그냥은 구별이 안된다. 그래서 "접미사"를 붙여서 구별한다.

 

  • 정수형 리터럴

정수형 리터럴에 붙이는 접미사는 "L" 하나뿐이다. 

위의 정수형 리터럴 예시에서 100L 은 접미사 "L"이 붙어있기 때문에 Long타입이다.
그리고 나머지 123, 0b0101, 077, 0xFF는 접미사가 없으므로 모두 integer 타입이다. 즉, 바이트타입과 숏타입에는 접미사가 없이 integer타입으로 저장한다.

 

  • 실수형 리터럴

실수형 리터럴의 접미사는 fd가 있는데, 각각 float과 double을 의미한다.

실수형 리터럴의 경우 타입이 float과 double 2가지 이므로,  어느 한쪽에만 접미사를 붙여도 구분이 가능하다.
따라서 f를 사용하고 d는 생략을 허용한다.

 

그리고 접미사는 대소문자를 구분하지 않기 때문에 어떤것을 사용해도 상관없지만, 소문자 l(엘)의 경우 숫자 1과 혼동될 수 있기 때문에 대문자를 사용해주는 것이 좋다. 

 

이제 예제를 통해 확인 해보자.

boolean power = true;

bolean 타입의 변수에는 true나 flase만 저장 할 수 있다. 그 외에 다른 리터럴을 저장하려고 하면 에러가 발생한다. 

char ch = 'A';

char 타입의 변수에는 하나의 문자만 저장 할 수 있다.

여러 문자를 저장하려면 아래와 같이 String 타입을 사용해야 한다.

String str = "ABC";

하나의 문자는 홑따옴표로 묶어주고('), 문자열은 쌍따옴표(")로 묶어줘야 한다.

'\n' 은 2개의 문자인 것 처럼 보이지만, 줄바꿈을 표현하는 개행문자로 하나의 문자로 취급된다. 

이 외에도 탭이나 백스페이스같은 특수문자들은 앞에 역슬래쉬(\)를 붙여서 표현한다.

 

그리고 위의 표에 있는 문자열 예시인 "A"처럼 하나의 문자도 큰따옴표(")로 묶어줄 수 있는데,
이것은 하나의 문자라고 해도 큰따옴표(")로 묶었기 때문에 문자열이다.

 

byte b = 127;

바이트 타입의 b에 127을 저장하는 것인데, 리터럴 127의 타입은 무엇일까?

정수인데 접미사가 없으므로 integer 타입이다.
앞서 보앗듯, byte타입과 short타입의 리터럴은 없기 때문에, byte 타입에 변수의 값을 저장할 때는 이처럼 integer타입의 리터럴을 사용한다.
단, byte 타입의 변수가 저장할 수 있는 범위의 값이어야 한다는 제약이 있다.(-128~127)

byte b = 128;		// 에러(byte 타입의 범위 초과)

 

그리고 정수형 리터럴은 앞에 접두사를 붙여서 10진수 외에도 다른 여러가지 진법으로 표현할 수 있다. 

int i = 100;		// 10진수(접두사 없음)
int oct = 0100;		// 8진수(접두사 0)
int hex = 0x100;	// 16진수(접두사 0x)
int bi = 0b0101;	// 2진수 (접두사 0b)

8진수의 접두사 0 (숫자영임)
16진수의 접두사 0x (영엑스)
2진수의 접두사 0b (영비)

long l = 10_000_000_000L;		// long 타입
long l = 10000000000L;			//  같은 표현임

위의 값은 0이 10개이기 때문에 100억이다.

integer 타입의 최댓값은 약 20억이기 떄문에 이값을 초과하면 Long타입의 변수에 담아야 한다. 

long l = 100;		// OK

이처럼 long 타입에 변수를 저장할 때, 100과 같이 integer타입의 리터럴을 써도 되기 때문에 접미사를 붙히건 안붙히건 상관은 없지만,
하나 위의 예시인 100억은 integer타입의 최대값인 20억을 초과하기 때문에  반드시 접미사 L을 붙여야 한다.

float f = 3.14f;		// f는 생략 불가능
double d = 3.14d;		// d는 생략 가능

실수형 float과 double타입에 변수의 값을 저장할 때는 접미사를 각 타입에 맞게 붙여주어야 한다. 이때, double 타입의 리터럴 "d"는 생략할 수 있다. 

만약 f를 생략하면 f = 3.14가 double 타입이 되어버리는데, 이때 float타입의 변수에 double 타입의 리터럴을 저장할 수 없어서 에러가 발생한다.

 

변수에 값을 저장할 때는, 기본적으로 "변수의 타입"과 "리터럴의 타입"이 일치해야 한다.
하지만, 일치하지 않아도 허용 되는 경우도 있으니 잘 알아두도록 하자. (ex -  byte b = 127, long l = 100;)

 

10. 리터럴의 의미는 무엇일까? 10.0 에서 0이 생략된 것이다.  즉 10. == 10.0 이다.
.10리터럴의 의미는 무엇일까? 0.10에서 앞의 0이 생략된 것이다 즉 .10 == 0.10이다.

두 리터럴 모두 소수점이 있으므로 실수형이고, 접미사가 없으므로 double type의 리터럴이다. 

그러면 10f 리터럴의 타입은 무엇일까? 실수형 접미사 f가 붙었기 때문에 실수형 리터럴이다. 즉 10f == 10.0f이다. 

마지막으로 1e3 리터럴의 의미는 무엇일까? 기호 "e"는 10의 n승을 표현할 떄 사용한다. 그러면 1e3은 10의 세제곱이므로 1000을 의미할까? 1000이긴하지만 기호 "e"는 실수형에 사용되는 것이기 때문에 1e3리터럴은 실수형이다. 즉 1e3 == 1000.0 이고, 접미사가 없으므로 double타입이다. 

 

이처럼 실수형 접미사에는 f와 d외에도 리터럴에 소수점이나 10의 n승을 의미하는 기호e가 포함되어 있으면 실수형 리터럴 이라는 것을 잘 기억하자.

 

 

변수와 리터럴의 타입 불일치

변수에 저장할 리터럴 타입은 변수의 타입과 일치하는 것이 보통이지만, 반드시 일치해야만 하는 것은 아니다. 

  • 범위가 '변수 > 리터럴' 인경우, OK
int i = 'A';		// int > char

이 문장은 ineger 타입의 변수 i에 문자'A'가 저장되는 것이 아니라, 문자 'A'의 문자코드인 65가 변수i에 저장된다. 

 

long l = 123;		// long > int

이 문장은 integer타입의 리터럴을 더 넓은 범위인 long타입 변수에 저장하니까 아무런 문제가 없다. 

 

double d = 3.14f		// double > float

float타입의 값을 더 범위가 넓은 double타입의 변수에 저장하는 것이기 때문에 괜찮다.

 

  • 범위가 '변수 < 리터럴' 인 경우, 에러
int i = 30_0000_0000;		// int의 범위(+-20억)벗어남

변수 i가 int타입인데, int타입의 최대값인 20억이 넘는 값을 저장하려고 하기때문에 에러가 발생한다. 

 

long l = 3.14f;		// long < float

long타입이 8바이트고, float타입이 4바이트라서 괜찮을 것 같지만, 실수형은 정수형보다 저장범위가 훨씬 넓기 떄문에 에러가 발생한다. 

 

float f = 3.14;		// float < double

double타입의 값을 float타입의 변수에 저장하려는 것이기 떄문에 에러가 발생한다. 

 

앞서 설명한 것과 같이, 실수형 리터럴에 접미사가 없으면 접미사 d가 생략된 것이라는 것을 잊으면 안된다. 

 

  • byte, short 변수에 int리터럴 저장가능 - 단, 변수의 타입의 범위 이내이어야 함
byte b = 100;		//OK (byte의 범위 (-128~127)에 속함)

자바 리터럴

반응형

'JAVA' 카테고리의 다른 글

두 변수 바꾸기  (0) 2022.03.11
문자, 문자열 리터럴, 문자열 결합  (0) 2022.03.10
상수와 리터럴  (0) 2022.03.09
변수의 타입  (0) 2022.03.09
변수란? 변수의 선언과 저장  (0) 2022.03.09