변수(Variable)라는 프로그램이 작업을 처리하는 과정에서 데이터를 저장 할 수 있는 메모리 공간 중 기본 자료형에 대한 데이터(값)를 저장할 수 있는 공간을 의미
변수는 작업을 처리하면서 수시로 변경되는 데이터를 저장하기 위한 메모리 공간으로 데이터를 담을 수 있는 하나의 그릇이다. 변수에는 다양한 자료형의 데이터를 저장 할 수 있다. 다만, 하나의 변수에 한가지 타입의 데이터만 저장이 가능하다. 예를 들어 논리형(boolean)타입의 변수에는 정수 또는 문자형 타입의 데이터는 저장이 불가능하다.
위 그림의 코드 부분을 보면 int
와 boolean
은 변수의 자료형이고, 그 뒤의 age
와 flag
는 변수의 이름이다. =
뒤의 숫자 또는 논리값은 변수의 자료형과 동일한 형태의 데이터를 입력해주면된다. 하나의 데이터는 하나의 메모리 공간을 차지한다고 생각하면 이해에 조금은 도움이 될 것이다. 다음은 변수의 종류에 대해 알아보자.
- 변수의 종류는 기본형 변수(Primitive Type)와 참조 변수(Reference Type) 크게 두가지로 나뉨
- 기본형 변수 : 수치형, 문자형, 논리형 3가지로 구분
- 참조 변수 : 기본형 변수를 제외한 모든 변수
수치형 변수는 정수형
과 실수형
으로 구분된다. 아래의 표에 자세한 설명이 나와있으니 참고하기 바란다.
-정수형
형의 이름 | 읽는 법 | 들어가는 값의 범위 | 사이즈(비트 수) |
---|---|---|---|
byte | 바이트 | -128 ~ 127 | 8 |
short | 쇼트 | -32768 ~ 32767 | 16 |
int | 인트 | -2147483648 ~ 214783647 | 32 |
long | 롱 | -9223372036854775808 ~ 9223372036854775807 | 64 |
long형 변수에 정수를 대입할 경우 수치 뒤에 l 또는 L을 붙여서 대입
예시 : long i = 8888L;
-실수형
형의 이름 | 읽는 법 | 들어가는 값의 범위 | 사이즈(비트 수) |
---|---|---|---|
float | 플로트 | +_3.4 x 10(38승) ~ +_1.4 x 10(-45승) | 32 |
double | 더블 | +_1.8 x 10(308승) ~ +_4.9 x 10(-324승) | 64 |
float형 변수에 실수값을 대입할 경우 수치 뒤에 f 또는 F를 붙여서 대입
예시 : float f = 4.5f;
수치형 자료에서 정수형의 기본이 되는 자료형은 int
, 실수형의 기본이 되는 자료형은 double
이다. 이 말은 기본이 되는 자료형보다 작은 경우에 적용이 되며, 정수형의 경우 long은 int보다 크기에 선언할 경우 long형이 되는 것이다.
아래 예시를 보자.
byte b = 127; //데이터가 byte의 범위 내에 있으므로 byte형으로 저장
byte b2 = 130; //데이터가 byte 범위 밖이므로 컴파일 에러
long a = 345342498493; //정수형의 기본인 int형의 범위를 넘으므로 컴파일 에러가 발생
long a = 345342498493L;
//이와 같이 long형으로 선언하면서 식별할 수 있는 'L' or 'l'을 명시해야함.
그렇다면 실수형은 어떤지 알아보자. 소수형은 2가지로 구분되지만 들어가는 값의 범위 즉, 소수점의 자리수가 double형이 더 크다. 이 말은 double형이 더 정밀도(Precision)
가 높다는 뜻이기도하다. 이러한 이유로 실수형은 double형을 기본으로 사용한다.
아래 예시를 보자.
float f = 3.4; //기본적으로 double형으로 인식되기 때문에 컴파일 에러 발생
float f2 = 3.4f; //이와 같이 'f' or 'F'를 명시하여 float형임을 알려야함
수치형에 대해 정리를 하자면
- 정수형의 기본자료형은 int(long형은 'L' or 'l'을 명시)
- 실수형의 기본자료형은 double(float형은 'F' or 'f'를 명시)
- 각 자료형의 데이터 범위를 벗어난다면 해당 자료형보다 데이터의 범위가 큰 자료형으로 변수를 선언해야함
문자형은 하나의 자료형(char)만 가지고 있다. (참고로 String 형은 기본형변수가 아닌 참조변수이기에 문자형이라 할 수 없으며 정확히는 문자열 자료형)
종류 | 데이터형 | 데이터사이즈 | 표현범위 |
---|---|---|---|
문자형 | char | 2byte | '\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터) |
위의 표에서 설명하듯이 문자형의 데이터 사이즈는 2byte이다. 이는 숫자와 알파벳을 포함한 세계 각국의 문자를 표현할 수 있는 문자코드체계인 유니코드
의 사용으로 인한 것이다. 숫자와 특수문자, 알파벳은 1byte, 그 외 각국의 문자는 한글자당 2byte의 데이터 사이즈를 가진다. 즉, 각국의 문자를 모두 표현하기 위하여 2byte의 데이터 사이즈를 가지는 것이다. 또한, 문자형은 유일하게 unsigned 형태
이다.
unsigned : 음수 없이 0부터 시작하여 양수 값만 가지는 데이터 형태
아래 예시를 보자.
char a = 'A'; //유니코드 정수형태 = 65
char b = 'B'; //유니코드 정수형태 = 66
위 처럼 문자형 변수 a, b를 선언 및 정의했다면, a>b의 비교연산자 사용이 가능하다. 컴퓨터는 사람의 문자를 인식 할 수 없기 때문에 문자를 유니코드를 기반으로 정수형태로 저장한다. 따라서 a에는 65('A'), b에는 66('B')가 저장되게된다.
//변수 선언 및 초기화
char a = 'a'; //문자형태로 저장
char a2 = 97; //아스키코드 중 'a'에 해당하는 정수형태로 저장
char a3 = '\u0061'; //유니코드 중 'a'에 해당하는 값으로 저장
위 코드에서 a, a2 ,a3는 모두 동일한 값을 표현한 변수이다.
- 아스키코드(ASCII) : 1byte기반 문자코드체계이자 영문자 및 특수문자와 숫자 표현
- 유니코드 : 2byte기반 문자코드체계이자 아스키코드를 포함한 전 세계 문자 표현
문자형에 대해 정리를 하자면
- 2byte 데이터 사이즈를 가진다. 이는 전 세계 문자를 표현하기 위함이라고 생각하자.
- Java에서 유일하게 음수없이 양수 값만 가지는 데이터 형태(unsigned)이다.
논리형은 하나의 자료형(boolean)만 가지고 있다.
종류 | 데이터형 | 데이터사이즈 | 표현범위 |
---|---|---|---|
논리형 | boolean | 1byte | true, false |
데이터를 다루는 최소 범위가 1byte 이기 때문에 낭비적이지만 1byte를 사용한다. 논리형은 참/거짓
만을 나타내는 자료형이다.
//변수 선언 및 초기화
boolean t = true; //참
boolean f = false; //거짓
논리형은 추가적으로 설명할 부분이 없으니 넘어가겠다.
변수의 선언은 값을 저장하기 위한 최초의 준비라고 이해하면 된다. 아래의 예시를 보자
//기본문법
변수타입 변수_명; //변수 선언
변수타입 변수_명 = 값; //변수 선언과 동시에 초기화
//int형 변수 선언
int a; //변수 선언
int a = 3; //변수 선언과 동시에 초기화
변수에는 오직 하나의 값만 저장이 가능하기 때문에 초기화에 지정된 변수의 값을 변경하고 싶을 경우 아래와 같이 변수를 재정의(대입)를 해주면 된다.
int a = 3; //변수 선언과 동시에 초기화, 현재 a에 저장된 값은 3
a = 5; //변수 재정의 또는 값 대입, 현재 a에 저장된 값은 5
변수는 선언만 할 수도 있고, 선언과 동시에 초기화로 값을 대입해 줄 수도 있다. 또한, 변수의 값을 변경하고 싶은 경우 기존에 선언된 변수를 재정의하여 값을 변경해줄 수 있다.
오늘은 변수의 종류 중 한가지인 기본형 변수(Primitive Type)에 대하여 알아보았다. 기본형 변수는 종류도 다양하고 각 종류가 표현할 수 있는 데이터의 범위와 타입이 다른만큼 외워야 할 것들이 많다. 계속 반복해서 보다보면 각 자료형의 데이터 사이즈 및 범위와 타입이 익숙해 질 것이다.
기본형 변수를 사용할 때 중요한 부분은 데이터의 범위와 사이즈를 고려하여 어떻게 선언하여 데이터(값)을 정의하여 사용할 지 고민하는 것이다. 데이터의 표현범위가 작은데 굳이 큰 자료형을 사용하여 메모리 공간을 낭비할 필요가 없다는 뜻이다. 이 부분에 대해서는 차후 JVM 메모리 구조 등에 대한 설명을 할 때 자세히 다루도록 하겠다.