자바 기초부터 차근차근(3)
※ 상수와 형변환에 대해 알아보자.
※ 여기는 헷갈리고 까먹기 쉬운 부분이 많으니 주의하자.
※ '윤성우의 열혈 JAVA' 를 기반으로 정리하였으며 문제가 될 시 비공개처리 하겠습니다.
상수와 형 변환
상수 = 값이 변하지 않는 수
변수를 선언할 때 final 이라는 선언을 추가하면 그 변수는 상수가 된다.
-특징-
※ 값을 한번만 할당할 수 있다.
※ 한번 할당된 값은 변경이 불가능하다.
예를들어 이러한 변수가 선언되었다고 가정하자.
int MAX_SIZE = 100;
이것을 상수로 변환하려면 다음과 같다.
final int MAX_SIZE = 100; // 또는 final int MAX_SIZE ; 이후 값을 딱 한번 할당할 수 있음.
개발자들 간의 관례상 상수의 이름은 다음 두 가지 사항을 지켜서 짓는다고 한다.
※ 상수의 이름은 대문자
※ 둘 이상의 단어일 경우 언더바(_)로 표시
정수형 상수의 표현 방법
10진수로 int형 정수 표현
int num = 11 + 22 + 33; //그냥 일반적으로 사용하면 된다.
8진수로 int형 정수 표현
int num = 011 + 022 + 033; //앞에 0 삽입
16진수로 int형 정수 표현
int num = 0x11 + 0x22 + 0x33; //앞에 0x 삽입
예제로 확인해보고 넘어가자.
실행 결과.
※ 자바는 byte형이나 short형으로 정수를 표현하는 방법을 제공하지 않는다.
※ 다음과 같은 덧셈을 byte형이나 short형으로 진행하는 방법은 없다.
만일 숫자가 커서 long형 정수의 표현 방법을 사용해야 한다면 다음과 같이 사용하면 된다.
1234567865L; // 뒤에 L을 붙인다.
사용 예시) System.out.println(3147483647L + 3147483646L);
추가사항.
※ 2진수 표현 방법 = 숫자 앞에 0b를 붙이면 된다.
※ 숫자 사이에는 언더바(_)를 입력할 수 있다(큰 숫자 표기할 때 용이)
※ ex) int num = 100_0000; // => 동일한 표현 int num = 1000000;
실수형 상수
실수를 표현하는 방법은 다음과 같다.
double pi = 3.1415;
소스코드를 확인해보자.
결과값은 다음과 같다.
double 형 정밀도에는 16자리까지 들어가서 계산이 제대로 이루어졌다.
(만약 double 상수임을 명시하려면 숫자뒤에 d를 입력한다.)
float 형 정밀도에는 적절치 않은 자리수라 오차가 있어서 적절하지 않은 값이 나왔다.
여러가지 실수 표현은 다음과 같다.
3.4e3 => 3.4*10^3 = 3400.0
3.4e-3 => 3.4*10^-3 = 0.0034
(double형 실수임을 잊지말자)
0.5 => .5
5.0 => 5.
0.7f => .7f
7.0f => 7.f
이스케이프 시퀀스(escape sequences) 문자
\b | 백스페이스 |
\t | 탭 |
\\ | 백슬래시 |
\' | 작은따옴표 |
\" | 큰따옴표 |
\n | 개 행 |
\r | 캐리지 리턴 |
(한글 폰트에서 백슬래시는 \로 표시된다)
예시를 보면서 이 문자들을 익혀보자.
(어째서인지 '\b'값이 제대로 안되었다;; 원래는 AC가 출력되야할텐데.. 나중에 알아보자)
결과값을 보면 대충 어떻게 사용되는지 알 수 있다.
캐리지 리턴 \r은 커서를 왼쪽 끝으로 이동시킨다.
A의 위치로 커서가 이동한 다음 C가 입력되어 문자 A는 사라진 것이다.
유니코드에 대해서도 알아보자.
"오늘의 환율은 1$에 0.88€입니다." 를 출력하려면 \u를 사용한다.
여기서 유료화 문자 유니코드 값은 20AC이다 따라서 이 유니코드 값을 출력하려면 다음과 같이 하면 된다.
\u20AC
이걸 이용하면 다음과 같이 출력할 수 있다.
System.out.println("오늘의 환율은 1$에 0.88" + '\u20AC' + "입니다.");
형 변환
1.0과 1은 같은 숫자인가?
우리가 봤을때는 그렇지만 컴퓨터가 봤을 때는 그렇지 않다.
1.0은 실수형 자료이고, 1은 정수형 자료이다.
따라서 컴퓨터에서는 int형 덧셈 방법과 double 형 덧셈 방법 또한 다르다.
(자료형이 다른 두 변수에 대해서는 덧셈을 진행하지 못한다.)
예를들어, int형 자료형과 long형 자료형 둘이 덧셈을 진행하지 못한다.
int num1 = 50;
long num2 = 3147483647L;
System.out.println(num1 + num2); // 둘의 자료형이 다르므로 (원칙대로라면) 연산이 되지 않는다.
(하지만 이때 연산이 되는데 이유는 '자동 형 변환'이 일어나기 때문이다.)
따라서 연산을 하려면 다음과 같은 과정을 거쳐야 한다.
※ 변수 num1에 저장된 값을 long형으로 변환하여 메모리에 임시 저장한다.
※ 이어서 변환된 값과 num2에 저장된 값을 대상으로 덧셈을 진행한다.
'자동 형 변환(Implicit Conversion)'
필요한 상황에서 자동으로 형 변환이 일어났기 때문에 자동 형 변환이라고 한다.
이렇게 자동 형 변환이 일어나는데에는 규칙이 있다.
※ 자료형의 크기가 큰 방향으로 형 변환이 일어난다.
※ 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선이다.
byte -> short -> int -> long -> float -> double 순으로 자동 형 변환이 일어난다.
예시를 보면 다음과 같다.
double num1 = 30;// int형 정수 30은 double형으로 자동 형 변환
System.out.println(59L + 34.5); // 59 long형 정수이지만 double 형으로 자동 형 변환
(정수형에 비해 실수형이 값의 표현 범위가 넓기 때문에 실수형이 정수형보다 우선된다.)
만일, double 형에서 int형으로 형 변환을 하고싶으면 다음과 같이 진행하면 된다.
double pi = 3.14;
int wholeNumber = (int)pi;
이러면 pi는 int형으로 형 변환된다.
이를 '명시적 형 변환'이라 한다.
하지만 소수점 이하의 값이 잘려나가 wholeNumber 에 저장되는 값은 3이다.
명시적 형 변환은 다음과 같을 때 사용한다.
short num1 = 1;
short num2 = 2;
short num3 = num1 + num2; //컴파일 오류 발생
(덧셈 연산을 위해서 num1과 num2값이 int형으로 자동 형 변환되기 때문)
이럴때에는 다음과 같이 명시적 형 변환을 이용한다.
short num3 = (short)(num1 + num2);
이렇게 하면 오류없이 컴파일이 된다.