03-1 상수(literal)
상수 literal
프로그래밍에서 상수란, 수학에서 말하는 그 상수와 같습니다.
우리는 이미 변수(Variable)과 자료형(Data Type)에서 이미 상수를 사용했었습니다.
int num = 10;
int형 num을 선언하고 10을 저장한다. 이 코드에서 상수를 사용했습니다.
상수도 메모리공간에 저장이 됩니다.
상수간의 연산도 CPU에서 이루어져야하기 때문에 상수 또한 메모리 공간에 저장됩니다. 단, 변수와는 다른 특징을 가지고 있습니다.
상수는 이름이 없습니다. 이름이 없으므로 메모리에 접근할 수도, 데이터를 변경시킬 수 없습니다.
03-2 상수의 표현 방식
상수의 자료형(Data Type)
상수도 자료형이 있습니다.
기본적으로 모든 정수형 상수는 int형, 실수형 상수는 double형으로 표현됩니다.
그렇다면, int형으로 표현될 수 없는 범위 (대충 2,147,483,648(약 2억)이상이라는 뜻)는 어떻게 될까?
다음 코드는 상수 10억을 int형으로 저장합니다.
일차적으로 int는 10억을 담을 수 없으므로 10억을 담으려고한다면 당연히 컴파일 에러가 납니다.
10억 이상을 변수에 저장하고 싶으면 long형을 쓰면 됩니다.
앗, long형은 최대 9,223,372,036,854,775,807까지 저장할 수 있는데 왜 컴파일 에러가 날까?
빨간 밑줄에 마우스를 올려놓고 1초정도 기다리면 위 사진처럼 왜 에러가 났는지 이유를 알려줍니다.
"The literal 10000000000 of type int is out of range"
"int형 상수 10억은 범위 밖이다."
long num = 1000000000*10;
1억에 10을 곱해서 임시방편으로 쓸 순 있지만 근본적인 문제를 해결하지 못 한다. (예를 들어 만약 소수를 저장하라고 한다면..)
다행이 상수도 long형 상수를 표현할 수 있는 방법이 있다. 마찬가지로 float형도 표현할 수 있습니다.
long형은 상수에 접미사 L을 붙이고, float형은 f를 붙입니다.
그럼 short형이랑 byte형을 표현하는 접미사는 없는걸까요? 네 java에는 없습니다.
정확히는 굳이 있을 필요가 없습니다. 자바의 정수의 산술 연산은 int형 기반으로 처리됩니다. 따라서 int보다 범위가 더 작은 값의 표현 방식을 만들 필요가 없습니다.
03-3 (자료)형 변환(Casting)
1.0+1을 할 수 있을까요? 이때 컴파일러는 어떤 변화가 있을까요?
1.0은 double형 이고 1은 int형입니다. 이 둘은 자료형의 크기 뿐만 아니라 표현 방식마저 다릅니다. 그렇다면 이 둘의 연산은 어떻게 될까요?
자동 형 변환 Implicit Conversion
이러한 문제를 해결하기위해서 컴파일러는 1.0 혹은 1의 자료형을 변경합니다. 서로 다른 두 자료형이 있다면 자동 형 변환 규칙에 따라 상위 자료형으로 형 변환이 일어나게 되죠. 위 예제에서는 1(int)이 1.0(double)로 바뀐 다음, 1.0+.1.0을 연산하게 됩니다.
여기서 상위 자료형이란, 자신보다 표현범위가 더 넓은 자료형입니다. 여기서 상위 자료형이라는 표현은 공식 표현이 아니고 이 포스팅에서만 쓰입니다.
byte -> short -> int -> long -> float -> double 순으로 바뀝니다.
명시적(강제) 형 변환 Explicit Conversion
자동 형 변환을 할 수 없는 경우, 자동 형 변환 규칙에 위배되는 상황에서 쓰입니다.
자동 형 변환은 그 대상 앞에 괄호( ) 와 그 안에 변환을 할 자료형을 적어줍니다.
int num = (int)1.624;
위 상황에서는 1.124를 int로 바꾸고있습니다.
double -> int로 가면 double의 소수점 뒷 자리가(0.624) 전부 사라집니다. 결국 num은 1이 저장됩니다.
이전 강좌> [초보Java 시리즈]02-변수(Variable)과 자료형(Data Type)
다음 강좌> []
DDang_
2020.01.30강의 감사합니다
배고픈상어-효묘
2020.01.30감사합니다!