[Java] 1_4_변수와 자료형(3)

Haeun Noh·2022년 7월 30일
0

0730


오늘은 크게 상수와 리터럴, 형 변환에 대해 배웁니다.
사실 7/28에 들었던 강의인데 MOS 엑셀시험의 막바지에 달리느라 정리를 못 했네요..
그럼 지금부터 정리 시작하겠습니다!



상수

: 변하지 않는 값 ( cf 변수: 변하는 값 )

상수를 선언할 때에는 final이라는 키워드를 사용합니다. final은 자료형 앞에 선언합니다.

ex)

final double PI = 3.14;
final int MAX_NUM = 100;	//상수는 대문자로 많이 표현하지만 굳이 하지 않아도는 됨

final로 선언된 상수는 다른 값을 대입할 수 없습니다.

PI = 3.15		//값을 바꾸어 대입했기 때문에 에러가 남

이렇게 값이 바뀌지 않는 상수의 특징덕분에 상수는 일일히 수정하지 않아도 되는 장점이 있습니다. 즉 한꺼번에 수정이 가능해 효율성이 뛰어납니다.



리터럴 (literal)

: 프로그램에서 사용하는 모든 숫자, 값, 논리 값
ex) 10, 3.14, 'A', true

이런 것들을 상수와 구별하기 위해 리터럴이라고 합니다.
상수는 final로 선언된 변수이고 숫자나 실수나 문자나 true/false 등등을 리터럴이라고 부릅니다.

리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀 constant pool (메모리 위치)에 있습니다. 필요한 경우 상수 풀에서 가져와서 사용하는 것입니다.
상수 풀에 저장할 때, 정수는 int로 실수는 double로 저장합니다. 따라서 long이나 float값으로 저장해야 하는 경우, 식별자 (L, l, F, f)를 반드시 명시해야 합니다.



형 변환 (type conversion)

: 자료형을 변환하는 것

서로 다른 자료형이 있을 때 다른 자료형끼리 대입이 될 때 필요합니다.
자료형은 각각 사용하는 메모리 크기와 방식이 다릅니다. 따라서 서로 다른 자료형의 값이 대입되는 경우 형 변환이 일어납니다.

주의할 점은 자료형을 바꾸는 것이지 해당 변수의 값이 바뀌는 것이 아닙니다.


묵시적 형 변환 (자동 형 변환)

: 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 대입되는 경우

보통 정수형에서 실수형으로 변환될 때 묵시적 형 변환이 일어납니다. 이해를 돕기 위해 쉽게 설명하자면 작은 상자가 큰 상자에 들어가는 것으로 생각하면 됩니다. 큰 상자는 작은 상자를 담기에 충분한 크기를 가지고 있기 때문에 어렵지 않게 작은 상자를 담을 수 있는 것입니다.

byte -> short, char -> int -> long -> float -> double

  • 묵시적 형 변환이 일어날 수 있는 자료형들을 화살표로 표시해보았습니다.

그런데 여기서 의문점이 있습니다.
"long8byte이고 float4byte인데 왜 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! 자바 프로그래밍 입문_자바 프로그래밍 시작하기 강의를 클릭하세요!


profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글