모든 변수에는 타입이 있으며, 타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다. 변수를 선언할 때 주어진 타입은 변수를 사용하는 도중에 변경할 수 없다. 따라서 변수를 선언할 때 어떤 타입을 사용할지 충분히 고려해야 한다.
정수타입
정수타입에는 모두 다섯 개의 타입이 있으며 저장할 수 있는 값의 범위가 서로 다르다. 메모리 크기 순으로 나열하면 다음과 같다.
정수 타입 | byte | char | short | int | long |
바이트 수 | 1 | 2 | 2 | 4 | 8 |
자바는 기본적으로 정수 연산을 int 타입으로 수행한다. 그렇기 때문에 저장하려는 값이 정수 리터럴이라면 특별한 이유가 없는 한 int 타입 변수에 저장하는 것이 좋다. byte와 short가 int 보다는 메모리 사용 크기가 작아서 메모리를 절약할 수는 있지만, 값의 범위가 작은 편이라서 연산시에 범위를 초과하면 잘못된 결과를 얻기 쉽다.
byte 타입
byte 타입은 색상정보 및 파일 또는 이미지 등의 이진 데이터를 처리할 때 주로 사용된다. byte 타입은 정수 타입중에서 가장 작은 범위의 수를 저장한다. 표현할 수 있는 값의 범위는 -128 ~ 127 이다.
코드에서 정상적으로 변수에 올바른 값을 저장하더라도 프로그램이 실행하는 도중에 변수의 값은 변경된다. 만약 실행 중에 저장할 수 있는 값의 범위를 초과하면 최소값부터 다시 반복 저장되는데, byte일 경우 -128부터 시작해서 127을 넘으면 다시 -128부터 시작하게 된다. 다른 정수 타입인 short, int, long 역시 저장할 수 있는 값의 범위를 넘어서면 이와 같은 방식으로 처리된다. 이와 같이 저장할 수 있는 값의 범위를 초과해서 값이 저장될 경우 엉터리 값이 변수에 저장되는데, 이러한 값을 쓰레기값이라고 한다. 다음 예제는 byte 변수와 int 변수를 각각 125로 초기화하고 5회에 걸쳐 1씩 더하기한 다음 출력한 결과를 보여준다.
public class GarbageValueExample {
public static void main(String[] args) {
byte var1 = 125;
int var2 = 125;
for(int i=0; i<5; i++) {
var1++;
var2++;
System.out.println("var1: " + var1 + "\t" + "var2: " + var2);
}
}
}
// 출력 결과
var1: 126 var2: 126
var1: 127 var2: 127
var1: -128 var2: 128
var1: -127 var2: 129
var1: -126 var2: 130
byte 변수는 127을 넘어서는 순간 최소값인 -128부터 다시 저장되는 것을 볼 수 있고, int 타입의 변수는 정상적으로 1 증가된 값을 계속 저장하는 것을 볼 수 있다.
char 타입
자바는 모든 문자를 유니코드로 처리한다. 유니코드는 하나의 문자에 대해 하나의 코드값을 부여하기 때문에 영문 'A' 및 한글 '가'도 하나의 코드값을 갖는다. 유니코드는 0 ~ 65535 범위의 2 byte 크기를 가진 정수값이다. 자바는 하나의 유니코드를 저장하기 위해 2 byte 크기인 char 타입을 제공한다. char 타입 변수에 작은 따옴표(' ')로 감싼 문자를 대입하면 해당 문자의 유니코드가 저장된다. 예를 들어 'A', 'B', '가', '각' 문자를 char 변수에 저장할 경우 다음과 같다.
char var1 = 'A'; // 유니코드: 0x0041
char var2 = 'B'; // 유니코드: 0x0042
char var3 = '가'; // 유니코드: 0xAC00
char var4 = '각'; // 유니코드: 0xAC01
char 변수에 문자가 아니라 직접 유니코드 정수값을 저장할 수도 있다.
// 문자 A
char c = 65;
char c = '\u0041'
char 타입 변수는 단 하나의 문자만 저장한다. 만약 문자여러개로 구성된 문자열을 저장하고 싶다면 String 타입을 사용하면 된다. 다음과 같이 String 변수를 선언하고, 큰 따옴표(" ")로 감싼 문자열 리터럴을 대입하면 된다.
String name = "홍길동";
String은 기본 타입이 아니다. String은 클래스 타입이고 String 변수는 참조 변수이다. 다시말해, 문자열을 String변수에 대입하면 문자열이 변수에 직접 저장되는 것이 아니라, String객체가 생성되고, String 변수는 String 객체의 번지를 참조하게 된다. String에 대한 자세한 설명은 참조 타입에서 설명하겠다. 여기서는 문자열을 저장하기 위해 String 변수를 사용해야 된다는 것만 알아두자.
char 타입의 변수에 어떤 문자를 대입하지 않고 단순히 초기화를 할 목적으로 다음과 같이 작은 따옴표 두 개를 연달아 붙인 비어있는 문자를 대입하면 컴파일 에러가 발생한다. 그렇기 때문에 공백 하나를 포함해서 초기화해야 한다.
char c = ''; // 컴파일 에러
char c = ' '; // 정상적인 초기화 방법
하지만 String 변수는 큰따옴표 두 개를 연달아 붙여도 상관없다.
String str = "";
short 타입
short 타입은 2 byte로 표현되는 정수값을 저장할 수 있는 데이터 타입이다. 자바에서는 잘 사용되지 않는 타입이니 그냥 넘어가도록 하겠다.
int 타입
int 타입은 4 byte로 표현되는 정수값을 저장할 수 있는 데이터 타입이다. int 타입은 자바에서 정수 연산을 하기 위한 기본 타입이다. 쉽게 설명하면 byte 타입 또는 short 타입의 변수를 '더하기' 연산하면 int 타입으로 변환된 후 연산되고 연산의 결과 역시 int 타입이 된다. 따라서 byte 타입이나 short 타입으로 변수를 선언한 것과 int 타입으로 변수를 선언한 것의 성능차이는 거의 없다.
정수값을 직접 코드에서 입력할 경우 8진수, 10진수, 16진수로 표현할 수 있다. 8진수일 경우 숫자 앞에 '0'을 붙이면 되고, 16진수는 '0x'를 붙이면 된다.
int number = 10; // 10진수
int octNumber = 012; // 8진수
int hexNumber = 0xA; // 16진수
long 타입
long 타입은 8 byte로 표현되는 정수값을 저장할 수 있는 데이터 타입이다. 수치가 큰 데이터를 다루는 프로그램에서는 long 타입이 필수적으로 사용된다. 대표적인 예가 은행 및 우주와 관련된 프로그램들이다. long 타입의 변수를 초기화할 때에는 정수값 뒤에 소문자 'l' 이나 대문자 'L'을 붙일 수 있다. 이것은 4 byte 정수 데이터가 아니라 8 byte 정수 데이터임을 컴파일러에게 알려주기 위한 목적이다. int 타입의 저장 범위를 넘어서는 큰 정수는 반드시 소문자 'l'이나 대문자 'L'을 붙여야 한다. 'l'은 숫자 1과 비슷하므로 대부분 'L'을 많이 사용한다.
public class LongExample {
public static void main(String[] args) {
long var1 = 10;
long var2 = 20L;
long var3 = 1000000000000; // 컴파일 에러
long var4 = 1000000000000L;
}
}
실수 타입
실수 타입은 소수점이 있는 실수 데이터를 저장할 수 있는 타입으로, 메모리 사용 크기에 따라 float과 double이 있다.
실수 타입 | float | double |
바이트 수 | 4 | 8 |
float과 double의 메모리 사용 크기는 각각 int와 long 의 크기와 같지만, 정수 타입과는 다른 저장 방식 때문에 정수 타입보다 훨씬 더 큰 범위의 값을 저장할 수 있다. 실수는 정수와 달리 부동 소수점 방식으로 저장된다. 부동 소수점 방식은 부호, 가수, 지수로 이루어진다.
float : 부호(1bit) + 지수(8bit) + 가수(23bit)
double : 부호(1bit) + 지수(11bit) + 가수(52bit)
float보다 double이 더 정밀한 값을 저장할 수 있기 때문에 높은 정밀도를 요구하는 계산에서는 double을 사용해야 한다. 자바는 실수 리터럴의 기본 타입을 double로 간주한다. 이 말은 실수 리터럴을 float 타입 변수에 그냥 저장할 수 없다는 뜻이다. 실수 리터럴을 float타입 변수에 저장하려면 리터럴 뒤에 소문자 'f'나 대문자 'F'를 붙여야 한다.
double var 1 = 3.14;
float var2 = 3.14; // 컴파일 에러
float var3 = 3.14f;
만약 정수 리터럴에 10의 지수를 나타내는 E 또는 e를 포함하고 있으면 정수 타입 변수에 저장할 수 없고 실수 타입 변수에 저장해야 한다. 다음은 정수값 3000000을 저장하는 방법을 보여준다.
int var6 = 3000000;
double var7 = 3e6;
float var8 = 3e6f;
double var9 = 2e-3; // 0.002
논리 타입
논리 타입은 boolean 타입이라고 한다. boolean 타입은 1 byte로 표현되는 논리값 true, false 를 저장할 수 있는 데이터 타입니다. boolean 타입은 두 가지 상태값을 저장할 필요성이 있을 경우에 사용되며, 상택밧에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용한다.
public class BooleanExample {
public static void main(String[] args) {
boolean stop = true;
if(stop) {
System.out.println("중지합니다.");
}
else {
System.out.println("시작합니다.");
}
}
}
stop 변수에 true가 저장되어 있기 때문에 if 블록을 실행해서 "중지합니다." 가 출력된다. 만약 stop 변수에 false가 저장되어 있다면 else 블록이 실행되어 "시작합니다."를 출력한다.
'Java 길찾기 > 이것이 자바다' 카테고리의 다른 글
[Java] 연산자 (0) | 2021.12.28 |
---|---|
[Java] 타입 변환 (0) | 2021.12.27 |
[Java] 변수란? (0) | 2021.12.23 |
[Java] 프로그램 개발 순서 (0) | 2021.12.22 |
[Java] 자바 가상 머신, JVM 이란? (0) | 2021.12.21 |