오늘은 크게 상수와 리터럴, 형 변환에 대해 배웁니다.
사실 7/28에 들었던 강의인데 MOS 엑셀시험의 막바지에 달리느라 정리를 못 했네요..
그럼 지금부터 정리 시작하겠습니다!
: 변하지 않는 값 ( cf 변수: 변하는 값 )
상수를 선언할 때에는 final
이라는 키워드를 사용합니다. final
은 자료형 앞에 선언합니다.
ex)
final double PI = 3.14;
final int MAX_NUM = 100; //상수는 대문자로 많이 표현하지만 굳이 하지 않아도는 됨
final
로 선언된 상수는 다른 값을 대입할 수 없습니다.
PI = 3.15 //값을 바꾸어 대입했기 때문에 에러가 남
이렇게 값이 바뀌지 않는 상수의 특징덕분에 상수는 일일히 수정하지 않아도 되는 장점이 있습니다. 즉 한꺼번에 수정이 가능해 효율성이 뛰어납니다.
: 프로그램에서 사용하는 모든 숫자, 값, 논리 값
ex) 10, 3.14, 'A', true
이런 것들을 상수와 구별하기 위해 리터럴이라고 합니다.
상수는 final
로 선언된 변수이고 숫자나 실수나 문자나 true/false 등등을 리터럴이라고 부릅니다.
리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀 constant pool (메모리 위치)
에 있습니다. 필요한 경우 상수 풀
에서 가져와서 사용하는 것입니다.
상수 풀
에 저장할 때, 정수는 int
로 실수는 double
로 저장합니다. 따라서 long
이나 float
값으로 저장해야 하는 경우, 식별자 (L, l, F, f)
를 반드시 명시해야 합니다.
: 자료형을 변환하는 것
서로 다른 자료형이 있을 때 다른 자료형끼리 대입이 될 때 필요합니다.
자료형은 각각 사용하는 메모리 크기와 방식이 다릅니다. 따라서 서로 다른 자료형의 값이 대입되는 경우 형 변환이 일어납니다.
주의할 점은 자료형을 바꾸는 것이지 해당 변수의 값이 바뀌는 것이 아닙니다.
: 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 대입되는 경우
보통 정수형에서 실수형으로 변환될 때 묵시적 형 변환이 일어납니다. 이해를 돕기 위해 쉽게 설명하자면 작은 상자가 큰 상자에 들어가는 것으로 생각하면 됩니다. 큰 상자는 작은 상자를 담기에 충분한 크기를 가지고 있기 때문에 어렵지 않게 작은 상자를 담을 수 있는 것입니다.
byte -> short, char -> int -> long -> float -> double
그런데 여기서 의문점이 있습니다.
"long
은 8byte
이고 float
는 4byte
인데 왜 long -> float
가 묵시적 형 변환이 되나요?"
봤을 때 바이트 수는 확실히 long
이 더 큽니다. 하지만 long
은 정수형
이고 float
는 실수형
이라는 사실을 알아야 합니다. 바이트 수의 문제를 떠나서 실수형 > 정수형
이기 때문에 실수형보다 작은 정수형인 long
이 실수형인 float
에 들어가는 것이 묵시적 형 변환이 되는 것입니다.
ex)
float MaxNum = 19.5;
int num = 0;
double sum = num + MaxNum;
System.out.printLn( sum );
실행결과 : 19.5
: 큰 수에서 작은 수로, 더 정밀한 수에서 덜 정밀한 수로 대입되는 경우
앞서 보았던 묵시적 형 변환에서는 큰 상자에 작은 상자가 들어가는 예시를 들었습니다.
그에 반해 명시적 형 변환은 작은 상자에 큰 상자가 들어가는 것이라고 볼 수 있습니다. 그런데 작은 상자에는 큰 상자가 모두 완전히 들어갈 만큼의 충분한 공간 확보가 되어 있지 않습니다. 따라서 명시적 형 변환에서는 변환되는 자료 형을 명시해야 할 자료의 손실이 발생할 수 있습니다.
명시적 형 변환에서는 반드시 컴파일러에게 '나 자료 손실이 일어나도 괜찮으니까 자료 형 변환 해줘.' 와 같이 알려주어야 합니다. 따라서 명시적 형 변환이 일어날 변수명 앞에 (변환되는 자료 형)
을 붙여야 합니다. 그렇지 않으면 컴파일러는 에러가 났다고 인식하기 때문입니다.
ex)
double MaxNum = 19.5;
float num = (float)MaxNum;
실행결과 : 19.5
이 블로그에 작성된 정보를 더 자세히 알고 싶다면?
Do it! 자바 프로그래밍 입문_자바 프로그래밍 시작하기 강의를 클릭하세요!