탄탄대로
[Java 기본] 데이터 타입 본문
· 자바 데이터 타입
- 기본 타입 (primitive type)
- 참조 타입 (reference type)
· 기본 타입 (primitive type)
정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입.
값의 종류 | 기본 타입 | 메모리 사용 크기 | 데이터의 표현 범위 | |
정수 | byte | 1 byte | 8 bit | -128 ~ 127 |
char | 2 byte | 16 bit | ||
short | 2 byte | 16 bit | -32,768 ~ 32,767 | |
int | 4 byte | 32 bit | -2,147,483,648 ~ 2,147,483,647 | |
long | 8 byte | 64 bit | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
|
실수 | float | 4 byte | 32 bit | |
double | 8 byte | 64 bit | ||
논리 | boolean | 1 byte | 8 bit |
※ bit : 메모리에 0과 1일 저장하는 최소 기억 단위
※ byte : 8개의 bit가 묶어진 단위
1. 정수 타입
① byte
색상 정보 및 파일, 이미지 등의 이진(바이너리) 데이터를 처리할 때 주로 사용한다.
② char
자바는 모든 문자를 유니코드(Unicode)로 처리한다. char 타입은 하나의 유니코드를 저장하기 위한 타입이다.
작은 따옴표(')로 감싼 문자 뿐만 아니라 직접 유니코드 정수값을 저장할 수 있다. 10진수 또는 16진수로 저장한다.
※ 유니코드 (Unicode) : 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약.
유니코드는 하나의 문자에 대해 하나의 코드값을 부여한다.
0 ~ 65535 범위의 2byte 크기의 정수값이다.
char c1 = 'A'; //문자를 직접 저장
char c2 = 65; // 10진수로 저장
char c3 = '\u0041'; // 16진수로 저장
int unicode = c1; //유니코드 얻기
System.out.println(c1); // A
System.out.println(c2); // A
System.out.println(c3); // A
System.out.println(unicode); // 65
③ short
C언어와의 호환을 위해 사용된다. 비교적 자바에서는 잘 사용되지 않는 타입이다.
④ int
자바에서 정수 연산을 하기 위한 기본 타입이다.
→ byte 타입 또는 short 타입의 변수를 + 연산 ☞ int 타입으로 변환된 후 연산, 연산의 결과도 int 타입
→ 자바에서 정수 연산을 4byte로 처리하기 때문.
메모리가 크게 부족하지 않다면 정수를 저장할 때는 일반적으로 int 타입을 사용한다.
⑤ long
int 타입의 저장 범위를 넘어서는 큰 정수를 저장하기 위한 타입이다.
은행 및 우주 관련 프로그램처럼 수치가 큰 데이터를 다루는 프로그램에서 사용된다.
long 타입의 변수 초기화할 때에는 정수값 뒤에 'l', 'L'을 붙여야한다.
→ 8byte 정수 데이터임을 컴파일러에게 알려주기 위함.
→ 1000000000000L / 1000000000000l
★정수 타입은 저장할 수 있는 값의 범위를 초과될 경우 다시 최소값에서부터 저장한다.
byte var1 = 125;
int var2 = 125;
for(int i=0; i < 5; i++) {
var1++;
var2++;
System.out.println("var1: "+var1+" 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이 증가된 값을 계속 저장한다.
2. 실수 타입
실수는 부동 소수점(floating-point) 방식으로 저장된다.
가수 m은 0 ≤ m < 1 범위의 실수.
ex) 1.2345 ☞ 0.12345 [가수] x 10¹ [지수 = 1]
float 타입과 double 타입은 가수와 지수를 저장하기 위해 전체 bit를 나누어 사용한다.
① float
[부동 소수점 저장 방식] 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte
float 타입에 실수 리터럴을 저장하려면 리터럴 뒤에 'f', 'F'를 붙여하 한다.
② double
[부동 소수점 저장 방식] 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte
float 타입보다 더 정밀한 값을 저장할 수 있다.
실수 리터럴의 기본 타입을 double로 간주하기 때문에 바로 실수 리터럴을 저장할 수 있다.
3. 논리 타입
1byte(8bit)로 표현되는 논리값(true/false)을 저장할 수 있는 데이터 타입이다.
· 참조 타입 (reference type)
메모리의 번지(주소)를 값으로 갖는 타입.
참조 타입 | 배열 |
열거 | |
클래스 | |
인터페이스 |
※ 메모리 사용 영역 (Runtime Data Area)
JVM이 사용하는 메모리 영역 : 메소드 영역(Method Area) / 힙 영역(Heap Area) / 스택 영역(Stack Area)
1. 메소드 영역 (Method Area)
코드에서 사용되는 클래스(*.class)들을 저장하는 영역.
→ 클래스 로더로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등 분류해서
저장
JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역.
2. 힙 영역 (Heap Area)
객체와 배열이 생성되는 영역.
힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조.
참조하는 변수나 필드가 없으면 쓰레기 취급하고 JVM은 Garbage Collector를 실행시켜 자동으로 제거.
3. 스택 영역 (Stack Area)
각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당 됨.
동작 수행 방식
→ 메소드를 호출할 때마다 프레임(Frame)을 추가[push].
→ 메소드가 종료되면 해당 프레임을 제거[pop].
→ 프레임 내부에 로컬 변수 스택에 기본 타입 변수와 참조 타입 변수가 추가[push]되거나 제거[pop] 됨.
변수가 로컬 변수 스택에 생성되는 시점은 초기화 될 때.
변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거 됨.
기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 스택 영역에 값이 아니라 힙 영역이나
메소드 영역의 객체 주소를 갖음.
∴ 참조 타입은 스택 영역에서 메소드 영역 또는 힙 영역의 객체 주소를 값으로 가져 참조하는 타입을 말한다.
※ 기본 타입 변수의 ==, != 연산 : 값을 비교.
※ 참조 타입 변수의 ==, != 연산 : 힙 영역의 객체 주소를 비교.
※ null
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻을 null 값을 가질 수 있다.
→ 참조 타입 변수는 객체를 참조하지 않은 상태로는 사용할 수 없기 때문에 null 값을 가지고 있을 경우 해당 변수는
사용할 수 없다. NullPointerException이 발생한다.
null 값으로 초기화 된 참조 변수는 스택 영역에 생성된다.
1. String
문자열 저장 변수.
문자열 값은 힙 영역에 String 객체로 생성되고 스택 영역에 생성된 변수는 String 객체의 주소값을 갖는다.
자바는 문자열의 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다.
↔ 다른 String 객체를 참조하려면 new 연산자를 사용해서 직접 String 객체를 생성한다.
String strval1 = "na";
String strval2 = "na";
if(strval1 == strval2) {
System.out.println("strval1과 strval2는 같은 주소값을 갖음.");
} else {
System.out.println("strval1과 strval2는 다른 주소값을 갖음.");
}
if(strval1.equals(strval2)) {
System.out.println("strval1과 strval2는 문자열이 같음.");
}
String strval3 = new String("won");
String strval4 = new String("won");
if(strval3 == strval4) {
System.out.println("strval3과 strval4는 같은 주소값을 갖음.");
} else {
System.out.println("strval3과 strval4는 다른 주소값을 갖음.");
}
if(strval3.equals(strval4)) {
System.out.println("strval3과 strval4는 문자열이 같음.");
}
/*
실행 결과
strval1과 strval2는 같은 주소값을 갖음.
strval1과 strval2는 문자열이 같음.
strval3과 strval4는 다른 주소값을 갖음.
strval3과 strval4는 문자열이 같음.
*/
※ equals()
원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교하여 true, false를 리턴하는 메소드.
2. 배열
같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인텍스를 부여해 놓은 자료구조이다.
같은 타입의 데이터만 저장할 수 있다.
한번 생성된 배열은 길이를 늘리거나 줄일 수 없다.
배열 선언 방법
// 대괄호([])를 타입 뒤에 붙이거나, 변수 뒤에 붙인다.
int intArray[];
int[] intArray;
//값 목록으로 배열을 생성할 수 있다.
String[] names = {"na", "kim", "lee", ...};
//new 연산자로 배열을 생성할 수 있다.
//new 연산자로 배열을 처음 생성할 경우, 자동적으로 기본값으로 초기화 된다.
int[] intArry = new int[5];
//배열 변수를 먼저 선언한 후 값 목록들이 나중에 결정할 수 있다.
String[] books = null;
books = new String[] {"셜록 홈즈", "괴도 뤼팡", "제인 마플"};
//다차원 배열을 생성할 수 있다.
int[][] scores1 = new int[2][3]; //2차원 배열
//2차원 배열을 값 목록으로 생성
int[][] scores2 = {{95, 80}, {70, 85}};
int scores2_1 = scores2[0][0]; //95
int scores2_2 = scores2[1][1]; //85
//계단식 구조로 배열 생성
int[][] scores3 = new int[2][];
scores3[0] = new int[2];
scores3[1] = new int[3];
scores3[0].length; //2
scores3[1].length; //3
배열 변수인 scores는 길이 2인 배열 A를 참조.
배열 A의 scores[0]은 다시 길이 3인 배열 B를 참조.
배열 A의 scores[1]은 배열 C를 참조.
socres[0]과 scores[1]은 모두 배열을 참조하는 변수 역할 .
3. 열거 타입
한정된 값만을 갖는 데이터 타입.
몇 개의 열거 상수 중에서 하나의 상수를 저장하는 데이터 타입.
= enum 클래스
//Week.java
public enum Week { //Week는 열거 타입 이름
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
//블록 안에 선언된 값들은 열거 상수
//열거 상수는 모두 대문자로 작성
}
//열거 타입 Week로 변수 선언
Week today;
Week reservationDay;
//열거 타입 변수에 열거 상수 저장
Week today = Week.MONDAY;
열거 상수는 열거 객체로 생성된다.
→ 열거 상수 Week의 경우 MONDAY부터 SUNDAY까지의 열거 상수는 총 7개의 Week 객체로 생성.
→ 메소드 영역에 생성된 열거 상수가 해당 Week 객체를 각각 참조.
[참고 서적]
『이것이 자바다: 신용권의 Java 프로그래밍 정복 1』
'BackEnd > Java' 카테고리의 다른 글
StringBuffer와 StringBuilder (0) | 2022.11.07 |
---|---|
[Java 응용] char 타입 연산 (0) | 2022.07.15 |
[Java 기본] 객체 지향 프로그래밍 (0) | 2022.05.27 |
[Setting] Java 설치하기 (0) | 2022.05.17 |