2. 변수의 타입
- 우리가 주로 사용하는 값(data)의 종류(type)는 크게 '문자와 숫자'로 나눌 수 있다.
- 숫자는 다시 '정수와 실수'로 나눌 수 있다.
- 이러한 값(data)의 종류(type)에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것이 자료형(data type)이다.
- 자료형에는 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 등이 있다.
- 변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타읍으로 선택하면 된다.
기본형과 참조형
- 자료형은 크게 '기본형'과 '참조형' 두 가지로 나눌 수 있다.
- 기본형(primitive type) 변수는 실제 값(data)을 저장한다.
- 논리형 (boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
- 계산을 위한 실제 값을 저장한다. 모두 8개
- 참조형(reference type) 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.
- 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입
- 자바는 C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
- 참조형 변수(또는 참조변수)를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다.
- 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 것이다.
- 다음은 참조변수를 선언하는 방법이다.
- 기본형 변수와 같이 변수이름 앞에 타입을 적어주는데 참조변수의 타입은 클래스의 이름이다.
클래스이름 변수이름; // 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
- 다음은 Date클래스 타입의 참조변수 today를 선언한 것이다.
- 참조변수는 null 또는 객체의 주소를 값으로 갖고 있으며 참조변수의 초기화는 다음과 같이 한다.
Date today = new Date(); // Date 객체를 생성해서, 그 주소를 today에 저장
- 객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다.
- 이 주소가 대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다.
- 이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.
- 참조형 변수는 null 또는 객체의 주소(4 byte, 0x0~0xFFFFFFFF)를 값으로 갖는다.
- null은 어떤 객체의 주소도 저장되어있지 않음을 뜻한다.
- 단, JVM이 32 bit가 아니라 64 bit라면 참조형 변수의 크기는 8 byte가 된다.
Q. 자료형 (data type)과 타입(type)의 차이가 뭔가요? A. 기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형(data type)'이라는 용어를 씁니다. 그러나 참조형은 항상 '객체의 주소(4 byte 정수)'를 저장하므로 값(data)이 아닌, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때는 '타입(type)'이라는 용어를 사용합니다. '타입(type)'이 '자료형(data type)'을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 됩니다. |
2.1 기본형(primitive type)
- 기본형에는 모두 8개의 타입(자료형)이 있다.
- 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.
| 분류 |
타입 |
설명 |
| 논리형 |
boolean |
true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다. |
| 문자형 |
char |
문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다. |
| 정수형 |
byte, short, int, long |
정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이전 데이터를 다룰 때 사용되며, short은 C언어와의 호환을 위해서 추가되었다. |
| 실수형 |
float, double |
실수를 저장하는데 사용되며, 주로 double이 사용된다. |
- 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않다.
- 정수형 또는 실수형과 연산도 가능하다.
- 반면에 boolean은 다른 기본형과의 연산이 불가능하다.
- 즉, boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능하다.
- 정수는 가장 많이 사용되므로 타입을 4가지나 제공한다.
- 일반적으로 int를 가장 많이 사용한다.
- 왜냐하면 int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문이다.
- 효율적인 실행보다 메모리를 절약하려면, byte나 short를 선택하는 것이 좋다.
| |
1 byte |
2 byte |
4 byte |
8 byte |
| 논리형 |
boolean |
|
|
|
| 문자형 |
|
char |
|
|
| 정수형 |
byte |
short |
int |
long |
| 실수형 |
|
|
float |
double |
- boolean은 true와 false 두 가지 값만 표현할 수 있으면 되므로 가장 작은 크기인 1 byte
- char은 자바에서 유니코드(2 byte 문자체계)를 사용하므로 2 byte.
- byte는 크기가 1 byte라서 byte.
- int(4 byte)를 기준으로 짧아서 short(2 byte), 길어서 long(8 byte)
- float는 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float.
- double은 float보다 두 배의 크기(8 byte)를 갖기 때문에 double.
| 자료형 |
저장 가능한 값의 범위 |
bit |
byte |
| boolean |
false, true |
8 |
1 |
| char |
'\u0000' ~ '\uffff' (0~2^16-1, 0~65535) |
16 |
2 |
| byte |
-128 ~ 127 (-2^7~2^7-1) |
8 |
1 |
| short |
-32,768 ~ 32,767 (-2^15~2^15-1) |
16 |
2 |
| int |
-2,147,483,648 ~ 2,147,483,647 (-2^31~2^31-1, 약 +-20억) |
32 |
4 |
| long |
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2^63~2^63-1) |
64 |
8 |
| float |
1.4E-45 ~ 3.4E38 (1.4x10^-45~3.4x10^38) |
32 |
4 |
| double |
4.9E-324 ~ 1.8E308 (4.9x10^-324~1.8x10^308) |
64 |
8 |
- 각 자료형이 가질 수 있는 값의 범위를 정확히 외울 필요는 없다.
- 정수형(byte, short, int, long)의 경우 '-2^n-1~2^n-1 -1'의 범위를 갖는다.
- 예를들어 int형의 경우 32bit(4 byte)이므로 '-2^31~2^31 -1'의 범위를 갖는다.
- 따라서 int타입의 변수는 대략 10자리 수(약 20억, 2,000,000,000)의 값을 저장할 수 있다는 것을 알 수 있다.
- 7~9자리 수를 계산할 때는 넉넉하게 long타입(약 19자리)으로 변수를 선언하는 것이 좋다.
- 연산중에 저장범위를 넘어서게 되면 원하지 않는 값을 결과로 얻게 될 것이기 때문이다.
- 실수형은 정수형과 저장형식이 달라서 같은 크기라도 훨씬 큰 값을 표현할 수 있으나 오차가 발생할 수 있다는 단점이 있다.
- 그래서 정밀도(precision)가 중요한데, 정밀도가 높을수록 발생할 수 있는 오차의 범위가 줄어든다.
- 아래의 표를 보면 float의 정밀도는 7자리인데, 이것은 10진수로 7자리의 수를 오차없이 저장할 수 있다는 뜻이다.
| 자료형 |
저장 가능한 값의 범위 |
정밀도 |
bit |
byte |
| float |
1.4E-45 ~ 3.4E38 (1.4x10^-45~3.4x10^38) |
7자리 |
32 |
4 |
| double |
4.9E-324 ~ 1.8E308 (4.9x10^-324~1.8x10^308) |
15자리 |
64 |
8 |
- float는 큰 값을 저장할 수 있지만, 정밀도가 7자리 밖에 되지 않으므로 보다 높은 정밀도가 필요한 경우에는 변수의 타입으로 double을 선택해야한다.
- 실수형에서는 저장 가능한 값의 범위뿐만 아니라 정밀도도 타입 선택의 중요한 기준이 된다.