Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

탄탄대로

[Java 기본] 데이터 타입 본문

BackEnd/Java

[Java 기본] 데이터 타입

nvvs 2022. 5. 18. 16:39

· 자바 데이터 타입

 - 기본 타입 (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