Java 스터디 2일차
※이 글은 2018/08/05 ~ 2018/08/27일까지 했던 자바 스터디 노트를 올려놓은 겁니다. ※
02-4 상수와 리터럴
상수 선언하기
상수는 항상 변하지 않는 값 (constant)입니다.
이때까지 배웠던 변수랑은 정반대의 의미를 가지고 있네요.
자바에서는 상수를 final 예약어를 사용해 선언한다고 합니다.
아래 코드는 예시입니다.
상수 이름은 대문자를 주로 사용하고, 여러 단어를 연결하는 경우에는,
_ 기호를 사용해주면 보기 좋습니다.
가끔은 선언만 하고 사용하기 전에 값을 지정하기도 한답니다.
상수 사용하기
6번 코드가 선언과 동시에 초기화해주는 부분이다.
9번 코드는 사용하기 전에 초기화를 시켜주고 (안 해주면 오류 발생)
14번 코드는 오류 발생 부분이어서 주석 처리를 해주었다. (상수는 변하지 않는다.
단 저 코드는 상수를 변경하려 했으니 오류 발생!)
상수를 사용하면 편리한 이유
프로그램 내부에서 반복적으로 사용되고, 변하지 않아야 하는 값을 상수로
선언하여 사용하면 좋습니다.
예를 들면 어떤 학급의 학생 수가 최대 30명이라는 코드를 작성하는 경우.
값을 코드에 직접 사용한다면
상수로 선언한다면
(저는 솔직히 상수로 선언하는 게 더 길어 보여서 더 불편할 것 같습니다.)
하지만, 값을 코드에 직접 사용할 경우 30명에서 35명으로 늘어날 때,
엄청난 삽질을 요구해서 실질적으로 상수로 선언하는 게 더 편합니다 :)
리터럴
리터럴 이란 프로그램에서 사용하는 모든 숫자, 문자, 논리값을 일컫는 말입니다.
위에서 사용한 'A', 10, 3.14와 같은 문자와 숫자를
'리터럴' 혹은 '리터럴 상수'라고 합니다.
리터럴은 변수나 상수값으로 대입할 수 있습니다.
그리고, 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인
상수 풀(constant pool)에 놓입니다.
예를 들어 int num = 3;
코드에서 값 3이 메모리 공간 어딘가에 존재해야 num 변수에 그 값을
복사할 수 있습니다. 즉 숫자가 변수에 대입되는 과정은 일단 숫자 값이 어딘가 메모리에
쓰여있고, 이 값이 다시 변수 메모리에 복사되는 것입니다.
자바에서 정수를 표현하는 메모리의 기본 크기는 4바이트라는 걸
1일차에 공부하였습니다.
이는 상수 풀에서도 마찬가지로 적용됩니다.
예를 들어 리터럴 10, 'a', 3.14등은 int형으로 처리됩니다.
그런데 long num = 12,345,678,900;은 4바이트 크기에 들어갈 수 없기 때문에 long형,
즉 8바이트로 처리하라고 컴파일러에 알려 주어야 합니다.
따라서 '이 리터럴은 long형으로 저장되어야 한다'라는 의미로
리터럴 뒤에 식별자 l이나 L을 써 주는 것입니다.
실수도 마찬가지입니다.
(실수는 float이니 f나 F를 사용해야 합니다.)
02-5 형 변환
형 변환이란?
정수와 실수는 컴퓨터 내부에서 표현되는 방식이 전혀 다릅니다.
따라서 정수와 실수를 더한다고 할 때 그대로 연산을 수행할 수 없고 하나의
자료형으로 통일한 후 연산을 해야 합니다.
이를 형 변환이라고 합니다.
위 코드처럼 형 변환이란 이렇게 각 변수의 자료형이 다를 때
자료형을 같게 바꾸는 것을 말합니다.
형 변환은 크게 묵시적 형 변환(자동)과 명시적 형 변환(강제) 두 가지로 구별해서
생각할 수 있습니다. 형 변환의 기본 원칙은 밑과 같습니다.
바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어진다.
덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어진다.
이 두 가지 원칙에 기반하여 묵시적 형 변환이 이루어지는 관계는 아래와 같습니다.
위 그림에서 화살표 방향과 반대로 형 변환을 하려면 강제로 변환해야 합니다.
여기서! long형은 8바이트이고, float형은 4바이트인데 형 변환이 되는 이유는
실수가 정수보다 표현 범위가 더 넓고 정밀하기 때문입니다.
※ 화살표 방향으로 형 변환이 될 때는 자료 손실이 없지만,
그 반대의 경우에는 자료 손실이 발생할 수 있습니다. ※
묵시적 형 변환
바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
이 경우는 자료 손실 없이 bNum에 들어있는 값이 모두 iNum에 저장됩니다.
남은 3바이트는 0으로 채워집니다.
덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
이 4번 코드에서 두 번의 형 변환이 일어납니다.
fNum + iNum; 요 부분에서 float형으로 먼저 변환되어주고
dNum = 요 부분에서 double형으로 변환이 됩니다.
바이트 작은 크기 -> 큰 크기
덜 정밀 -> 정밀
한 번 더 복습!!
묵시적 형 변환
(코드를 천천히 읽어보며 해석해보면 바보 도 터지는 소리가 절로 납니다. )
명시적 형 변환
묵시적 형 변환과 반대의 경우로 생각할 수 있습니다.
바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
byte형은 int 형보다 크기가 작기 때문에 자료 손실이 발생할 수 있습니다.
따라서, 프로그래머가 변환할 자료형을 명시적으로 써 주어야 하며 이를 강제 형 변환이라고 합니다.
이 경우에는 대입된 값 10을 1바이트 안에 표현할 수 있으므로 자료 손실이 없습니다.
이 경우에는 값 1000이 byte형 범위를 넘기 때문에 자료 손실이 발생해
대입된 값이 -24로 출력이 됩니다.
더 정밀한 자료형에서 덜 정밀한 자료형으로 대입한 경우
실수형에서 정수형으로 변환될 때도 형 변환을 명시적으로 해주어야 합니다.
이 경우에는 실수의 소수점 부분이 생략되고 정수 부분만 대입됩니다.
연산 중 형 변환
이처럼 같은 연산이라도 형 변환이 언제 이루어졌는지에 따라 값이 다르게 나타날 수 있습니다.