데이터타입(Data Type)이란? |
: 자바 언어가 처리할 수 있는 데이터(자료) 종류를 의미하며 기본 데이터형과 참조 데이터형이 있다.
기본타입 (primitive) |
: 메모리에는 0 과 1 을 저장하는 최소 기억단위인 비트(bit)가 있다.
8개의 비트를 묶어 바이트(byte)라고 한다 ex)1byte = 8bit [0000 0000]
값 종류 |
타입 |
메모리 사용 크기 |
저장되는 값의 범위 |
|
정수 |
byte |
1 byte |
8 bit |
-128~127 |
short |
2 byte |
16 bit |
-32768~32767 |
|
int |
4 byte |
32 bit |
-2147483648~214838647 |
|
long |
8 byte |
64 bit |
-9223372036854775808~9223372036854775807 |
|
실수 | float |
4 byte |
32 bit |
1.40239846e-45f ~3.40282347e+38f |
double |
8 byte |
64 bit |
4.94065645841246544e-324~1.79769313486231570e+308 |
|
문자 | char |
2 byte |
16 bit |
'\u0000' ~ 'uFFFF' (16비트 유니코드 문자 데이터) |
논리 |
boolean |
1 byte |
8 bit |
true 또는 false |
각 타입별 저장되는 값의 범위보다는 메모리크기를 알아두면 좋다. 메모리 크기를 알고있으면 사용되는 값의 범위를 대략 알 수 있기 때문이다.
정수타입의 저장되는 값의 범위는 -2^(n-1) ~ (2^(n-1)-1)이다.
변수마다 사용할 수 있는 값의 범위를 초과하면 오버플로우(overflow)현상이 발생하는데 이것은 쉽게 설명하면 그릇에 담을 수 있는 한계를 초과하여 흘러넘친다는 뜻이다.
오버플로우 현상이 발생하면 엉뚱한 값이 들어갈 수 있고 에러의 원인이 된다.
[byte타입의 값을 초과하여 최소값부터 다시 반복 저장된 결과이다(쓰레기값)] |
[정수타입] (byte, short, int, long)
byte타입 : 색상정보 및 파일 또는 이미지 등 이진데이터를 처리할 때 사용
char타입 : 자바는 모든 문자를 유니코드(Unicode)로 처리한다(직접 유니코드 정수 값(음수값은 없다)을 저장할 수 있다 ex) char c = 65; 또는 char c = '\u0041';)
short타입 : C언어와 호환을 위해 사용하며 비교적 자바에서는 잘 사용되지 않는다
int타입 : 메모리가 크게 부족하지 않다면 정수를 저장할 때 int타입을 사용한다
long타입 : 수치가 큰 데이터를 다루는 프로그램에서 필수적으로 사용한다 ex)은행 및 우주 관련된 프로그램
[실수타입] (float, double) 소수점값을 나타내기 위해 사용 (부동소수점(floating-point)방식으로 저장)
flolat : 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte double : 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte |
[실수 리터럴의 기본타입은 double이므로 float리터럴은 끝에 F,f를 붙이도록 한다] |
[정수 리터럴에 10의 지수를 나타내는 E,e가 있을 경우 실수타입에 저장해야 한다] |
[논리타입] (boolean) true 또는 false 값을 저장하며 조건문 또는 제어문의 실행 흐름을 변경할 때 사용 (소문자만 인식)
[stop변수의 값이 false 이므로 else의 값이 출력된다] |
참조타입 (reference) |
: 객체의 번지를 참조하는 타입으로 배열(array), 열거(enum), 클래스(class), 인터페이스(interface) 타입을 말한다.
기본과 참조의 차이는 저장되는 값이 무엇인가? 이다
기본타입은 선언된 변수는 실제 값을 변수에 저장하지만 참조타입은 배열, 열거 ,클래스, 인터페이스를 이용하여 메모리에 번지를 값으로 갖게된다.
[자료 참고 : https://kingpodo.tistory.com/54] |
메모리 사용 영역 |
java.exe로 프로그램을 실행하면 JVM이 실행된다. JVM은 운영체제에서 할당받은 메모리 영역을 메소드,스레드,힙과 같은 세부 영역으로 구분해서 사용한다.
이때 쓰레드 영역마다 하나의 JVM스택영역이 존재하게 된다.
[자료 참고 : https://kingpodo.tistory.com/54] |
1. 메소드 영역 (Method Area)
: 런타임 상수 풀, 필드 / 메소드 데이터, 메소드 코드, 생성자 코드 등으로 분류하여 저장한다.
: 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
2. 힙 영역 (Heap Area)
: 객체와 배열이 생성되는 영역이며 JVM스택영역의 변수나 다른 객체의 필드에서 참조한다.
: 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 쓰레기로 취급하고 JVM은 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거합니다.
: Java는 개발자가 직접적으로 객체를 제거시키는 방법을 제공하지 않는다(System.gc() 메소드가 있지만 JVM에게 요청을 하는 형태이다)
3. JVM(Java Virtual Machicne) Stack Area
: 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
: 추가적으로 스레드를 생성하지 않으면 main스레드만 존재하므로 JVM스택도 하나이다.
: JVM스택은 메소드를 호출할 때 마다 프레임을 추가하고 메소드가 종료되면 프레임을 제거한다.
: 배열은 객체로 취급한다 (내부에서 생성된 변수는 해당 로컬 변수 스택에만 존재하여 해당 구문을 나오면 제거되어 외부에서 사용이 불가하지만 배열은 스택 영역에 생성되지만 배열 데이터 자체는 Heap영역에 생성되어 제거되지않는다)
'Java' 카테고리의 다른 글
| 변수와 리터럴 (0) | 2020.04.07 |
|---|---|
| 주석처리 컴파일(인코딩)오류 (1) | 2020.04.04 |
| 자바(JDK), 이클립스 설치 및 환경구축 (0) | 2020.04.03 |
| 자바 시작하기 (0) | 2020.04.03 |