1. 상수 선언하기
1-2에서는 변수에 대해 공부해보았다.
그런데 변하는 수가 있다면 그 반대도 있는 법.
변하지 않는 수도 프로그램에는 꼭 필요하다.
예를 들어, 원주율의 값이라던가 1년은 12개월이라는 값과 같은 수 말이다.
이렇게 항상 변하지 않는 값을 '상수(constant)'라고 한다.
자바에서는 상수를 final 예약어를 사용해 선언한다.
final double PI = 3.14;
final int MAX_NUM = 100;
상수 이름은 주로 대문자를 사용하고, 여러 단어를 연결하는 경우에는 언더바(ㅡ) 기호를 사용하면 보기 좋다.
한 번 선언한 상수는 변하지 않기 때문에 선언과 동시에 값을 지정하는 것이 좋다.
하지만 가끔은 선언만 하고 사용하기 전에 값을 지정하기도 한다.
아래의 예재를 통해 더 잘 이해해보자.
package chapter2;
public class Constant {
public static void main(String[] args) {
final int MAX_NUM = 100; > 선언과 동시에 초기화
final int MIN_NUM;
MIN_NUM = 0; > 사용하기 전에 초기화, 초기화하지 않으면 오류 발생
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
//MAX_NUM = 1000; > 오류 발생. 상수는 값을 변경할 수 없다.
}
}
2. 상수를 사용하면 편리한 이유
프로그램 내부에서 반복적으로 사용하고, 변하지 않아야 하는 값을 상수로 선언한다.
만약 어느 반의 학생 수에 맞춰 코드를 작성하는데 일일이 학생수를 입력하는 코드를 사용하다 학생수가 변동되면 학생수를 적어놓은 코드마다 번거롭게 찾아서 고쳐야 하는데 학생수를 상수로 정해놓으면 상수로 정해놓은 값만 고치면 되는 것이다.
3. 리터럴(literal)
리터럴(literal)이란 프로그램에서 사용하는 모든 숫자, 문자, 논리값(true, false)를 통틀어 부르는 말이다.
각각의 값은 '리터럴' 혹은 '리터럴 상수'라고 부르며 이런 리터럴은 변수나 상수 값으로 대입할 수 있다.
리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀(constant pool)에 놓인다.
예를 들어 int num = 3; 인 문장에서 값 3이 메모리 공간 어딘가에 존재해야 num 변수에 그 값을 복사할 수 있다.
리터럴이 이런 상수 풀에 저장될 때 자바는 기본적인 자료형의 바이트를 따라 저장하기 때문에 long형, float형(1-2 참조)의 경우에는 값에 식별자를 꼭 써서 처리하라고 알려주어야 한다.
4. 형 변환
정수와 실수는 컴퓨터 내부에서 표현되는 표현방식이 전혀 다르다.따라서 정수와 실수를 더해야 할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로 통일한 후 연사을 해야한다.이 과정을 우리는 형 변환(type conversion)이라고 부른다.
int n = 10;
double dnum = n;
위의 문장에서 변수 n은 int형이고 변수 dnum은 double형이다.이렇게 각 변수의 자료형이 다를 때 자료형을 같게 바꾸는 것이 형 변환이다.
형 변환은 크게 묵시적 형 변환(자동 형 변환)과 명시적 형 변환(강제 형 변환) 두 가지로 구별해서 생각할 수 있다.
형 변환의 기본 원칙은 다음과 같다.
1) 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어진다.
2) 덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어진다.
이를 표로 나타내면 아래와 같다.
정수 > | > | > | > | 실수 > | > | ||
byte (1바이트) |
short (2바이트) |
int (4바이트) |
long (8바이트) |
float (4바이트) |
double (8바이트) |
||
char (2바이트) |
* 여기서 long형은 8바이트이고 float형은 4바이트인데도 자동 형 변환이 되는 이유는 정수형보다 실수형이 더 정밀한 자료형이기 때문이다.
5. 묵시적 형 변환
1) 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
byte bNum = 10;
int iNum = bNum;
위의 문장처럼 bNum의 크기는 1바이트이고 iNum의 크기는 4바이트이므로 자료 손실 없이 bNum에 들어있는 값이 모두 iNum에 저장된다. 남은 3바이트에는 0으로 채워진다.
2) 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
int iNum2 = 20;
float fNum = iNum2;
이 경우에는 두 변수의 크기가 같은 4바이트라도 float형이 더 정밀하기에 iNum2가 float형으로 변환된다.
3) 연산 중에 자동 변환되는 경우
int iNum = 20;
float fNum = iNum;
double dNum;
dNum = fNum + iNum;
이 경우에는 dNum = fNum + iNum에서 두 번의 형 변환이 일어난다.
먼저 fNum + iNum 연산에서 int형이 float형으로 대입되고, 결과 값이 dNum에 대입되면서 double형으로 변환된다.
이렇듯 바이트 크기가 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 자료형이 변환되는 경우엔 자동 형 변환이 일어난다.
아래의 예재를 통해 더 확실히 이해해보자.
package chapter2;
public class ImplicitConversion {
public static void main(String[] args) {
byte bNum = 10;
int iNum = bNum;
System.out.println(bNum);
System.out.println(iNum);
int iNum2 = 20;
float fNum = iNum2;
System.out.println(iNum2);
System.out.println(fNum);
double dNum;
dNum = fNum + iNum;
System.out.println(dNum);
}
}
6. 명시적 형 변환
묵시적 형 변환과 반대의 경우를 생각하면 된다.
1) 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
int iNum = 10;
byte bNum = (byte)iNum;
byte형은 int형보다 크기가 작기 때문에 자료 손실이 발생할 수 있다.
따라서 프로그래머가 변환할 자료명을 명시적으로 앞에 써주어야하며 이 과정을 명시적(강제) 형 변환이라 한다.
이 경우에는 대입된 값 10이 1바이트 안에 표현할 수 있어서 자료 손실이 없으나 만약 iNum의 값이 1000이라면 1바이트가 표현할 수 있는 범위를 넘기 때문에 자료 손실이 발생해 -24의 값으로 출력이 된다.
2) 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
double dNum = 3.14;
int iNum2 = (int)dNum;
이 경우에는 실수의 소수점 이하 부분이 생략되고 다음의 정수 부분만 대입되어 3의 값이 출력된다.
3) 연산 중 형 변환
다음은 연산 중에 명시적으로 형 변환을 하는 예제이다.
package chapter2;
public class ExplicitConversion {
public static void main(String[] args) {
double dNum1 = 1.2;
float fNum2 = 0.9f;
int iNum3 = (int)dNum1 + (int)fNum2;
int iNum4 = (int)(dNum1 + fNum2);
System.out.println(iNum3);
System.out.println(iNum4);
}
}
위의 문장을 출력하면 iNum3은 1, iNum4는 2의 값이 출력된다. 그 이유는 iNum3은 각각의 값을 int형으로 먼저 출력했기에 1과 0을 더한 1의 값이 나온 것이고.
iNum4는 dNum1 + fNum2의 값을 먼저 계산하여 2.1의 값을 int형으로 출력했기에 2의 값이 나온 것이다.
이 때 dNum1과 fNum2의 자료형이 다르지만 묵시적 형 변환이 일어나 double형으로 자료가 변환되어 계산이 되었다.
'⁂ Java > : 독학으로 공부하기(과거)' 카테고리의 다른 글
[java] #3-1 조건문 : 제어 흐름 이해하기 (0) | 2022.07.01 |
---|---|
[java] #2-2 비트 연산자 (0) | 2022.07.01 |
[java] #2-1 자바의 기본 연산자 (0) | 2022.06.30 |
[java] #1-2 변수와 자료형 (0) | 2022.06.29 |
[java] #1-1 그래서 자바가 뭔데? (2) | 2022.06.29 |