충분히 쌓여가는
데이터 유형 본문
- 저장할 수 있는 값들과 그러한 값들에 적용할 수 있는 연산들을 상술함
- 자바의 데이터 유형은 기본형(primitive type)와 참조형(reference type)로 나눌 수 있음
기본형
- 하나의 값을 나타내는 데이터 유형으로 정수형, 실수형, 논리형, 문자형이 있음
- 기본형 변수에 저장되는 값은 리터럴, 즉, 실제 값이 저장됨
- 10, A, true 등 있는 그대로의 값을 저장한다는 뜻
정수형
- 정수 값을 저장할 수 있는 데이터 유형으로 음수일 수 있음
유형 | 저장소의 크기 | 표현 가능한 정수의 범위 |
byte | 8 bits | -128 ~ 127 |
short | 16 bits | -32,768 ~ 32,767 |
int | 32 bits | -2^32 ~ 2^32-1 |
long | 64 bits | -2^64 ~ 2^64-1 |
실수형
- 소수점을 가진 실수 값을 나타낼 수 있는 유형
유형 | 저장소의 크기 | 표현 가능한 실수의 범위 | 유효 자리 |
float | 32 bits | -3.4 X 10^38 ~ 3.4X10^38 | 7 |
double | 64 bits | -1.8 X 10^308 ~ 1.8X10^308 | 15 |
논리형
- true(참), 거짓(false)과 같은 논리 값만을 저장할 수 있는 유형으로 1bit 필요함
문자형
- 한 문자를 나타내는 데이터의 유형
- 자바에서 문자를 나타내기 위해 사용하는 코드는 유니코드(Unicode)
- 유니코드는 한 문자를 저장하기 위해 16bit 사용
특수문자 | 의미 | 설명 |
\b | Backspace | 커서가 현 위치에서 한 칸 뒤로 이동 |
\n | Newline | 커서가 다음 줄 맨 앞에 위치 |
\t | Tab | 커서가 Tab key를 누른만큼 이동하여 위치 |
\r | Carriage return | 커서가 다음 줄 맨 앞으로 이동하여 위치 |
\\ | Backslash | \(backslash)를 나타냄 |
\' | Single quote | 작은 따옴표 나타냄 |
\" | Double quote | 큰 따옴표 나타냄 |
\u#### | Unicode character | Unicode 문자 나타냄(####: Unicode 문자에 대응하는 16자리 숫자) |
참조형
- 실제 값 혹은 값들의 집합에 대한 참조(위치)를 나타내는 데이터의 유형
- 참조형 변수는 실제 값이 아닌 주소 값을 저장함
주소 값
- 컴퓨터에서 주소 값이라고 하면 www로 시작하는 인터넷 주소같은 걸 말하는건가?라고 생각하겠지만 의미는 맞지만 주소가 가리키고 있는 장소가 다름
- 우리가 쓰고 있는 컴퓨터의 메모리에 메모리 주소라는 개념이 들어있음
- 즉, 메모리 안에도 주소별로 저장 공간이 배정되어 있다는 뜻
- 이 주소는 사용자가 확인은 할 수 있지만 직접 정하거나 바꿀 수는 없음
- 참조형 변수는 앞서 설명한 주소 값을 저장하는 변수
참조형 변수와 기본형 변수의 차이
메모리 안의 구조
메모리의 구조는 그림보다 더 세분화가 되어 있지만 간단하게 3개의 영역으로 나눠보자면,
Class/Method/Static영역이라고 되어 있는 부분과 Stack영역, 그리고 Heap영역으로 나눌 수 있음
앞에서도 말했지만 메모리는 공간마다 주소 값을 가지고 있고, 이는 모든 영역에서 동일함
기본형 변수는 실제 값이 저장이 되는데 만약 우리가 변수를 선언하면 Stack영역에 선언한 변수만큼의 공간이 생성이 되고 그 공간 안에 값이 들어가게 됨
int i = 10;이라고 변수를 선언하게 되면 Stack영역에 4byte크기의 이름이 i라는 공간이 생성되고
그 안에 10이 들어가게 됨
여기까지 기본형
그런데 참조형 변수는 다름
String str = new String("java");
참조형 변수의 선언은 이러한 형태로 하게 되는데 기본형 변수와 비슷한 부분도 있고 다른 부분도 보일 것임
예시와 같이 변수를 선언하게 되면 메모리에서 이런 동작을 하게 됨
기본형 변수처럼 Stack영역에 str이라는 이름을 가진 공간이 생성됨
여기에서 생성되는 변수의 크기는 4byte의 고정된 크기만 생성(주소 값만 저장하는 공간이기 때문에 형태에 따른 크기 변화가 필요없기 때문)
new라는 명령어가 Heap영역에 새로운 저장공간을 생성하게 됨, 공간의 크기는 우리가 넣으려는 값(java)의 크기만큼 생성하게되고 이 공간은 메모리 주소 값을 할당받게 됨
물론 이건 Heap영역에 생성된 공간뿐만 아니라 Stack영역에 생성된 공간도 주소를 할당받게 되고 이는 기본형 변수도 마찬가지이다
(하지만 여기서는 굳이 필요한 내용이 아니기 때문에 생략)
다시 본론으로 돌아와서 이렇게 Heap영역에 공간이 생성되고 주소 값을 할당받으면 그 주소 값을 Stack영역에 생성된 str이라는 장소에 저장이 되는 것
정리: 기본형 변수는 Stack영역에서 실제 값을 그대로 저장하지만 참조형 변수는 먼저 Stack영역에 공간을 생성하고 Heap영역에 새로운 공간을 생성해 실제 값을 저장한 다음에 그 공간의 주소 값을 불러와서 Stack영역의 공간에 저장한다는 것
객체라는 것을 배우게 되면 더 이해가 쉽게 될 것임
여기서 말한 참조형 변수가 바로 객체라는 것이고 자바 프로그래밍을 객체지향 프로그래밍이라고 칭하는 이유
정리
참조형 변수는 기본형 변수와는 다르게 실제 값을 그대로 저장하는 공간이 아니라 Heap영역에 값이 저장된 공간의 주소 값을 저장하는 공간이라는 것
즉, 기본형 변수는 실제 값을 저장하고 참조형 변수는 주소 값을 저장하고 있는 것
참고자료
주인장의 프로그래밍 개발공부방, [Chapter 1 변수] 7. 참조형 변수(Reference Variable)의 기본개념