[JAVA] 데이터 타입 (Primitive Type, Reference Type, Literal)

chaeyeong·2025년 2월 1일

자바 이론

목록 보기
2/9

데이터타입(Data Type)이란?

💡 Data type이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 것이다.

➡️ 자바에서 타입은 크게 기본형 타입(Primitive Type)과 참조형 타입(Reference Type)이 있다.

1. Primitive Type

  • 실제 데이터의 값을 저장하는 타입으로, 스택(Stack) 영역에 저장된다.

  • 총 8가지의 기본형 타입을 미리 정의하여 제공한다.

  • 입력값으로 null을 받을 수 없다.

  • 제네릭 타입(Generic Type)에서 사용할 수 없다.

  • 값의 범위를 벗어나면 컴파일 에러가 발생한다.


타입크기기본값데이터 표현 범위
boolean1 bytefalsetrue / false
byte1 byte0-128 ~ 127
short2 byte0-32,768 ~ 32,767
int4 byte0 -2,147,483,648 ~ 2,147,483,647
long8 byte0L-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float4 byte0.0F (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
double8 byte0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
char2 byte\u0000' 0 ~ 65,535


2. Reference Type

  • 메모리의 번지 값을 통해 객체를 참조하는 타입으로, 힙(Heap) 메모리에 저장된다.

  • 입력값으로 null을 받을 수 있다.

  • 제네릭 타입(Generic Type)에서 사용할 수 있다.

  • 문법상으로는 에러가 없지만 실행을 시켰을 때 런타임 에러가 발생할 수 있다.


타입크기기본값
Array4 bytenull
Enumeration4 bytenull
Class4 bytenull
Interface4 bytenull


3. Literal

💡 데이터 그 자체, 변하지 않는 데이터를 의미한다.

➡️ 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.

(1) 정수 리터럴

  • 소수점이 없는 정수 리터럴 : 10진수
int a = 10;
  • 0으로 시작하는 정수 리터럴 : 8진수
int a = 010;
  • 0x 또는 0X로 시작하고 0~9, A~F 또는 a~f로 구성된 리터럴 : 16진수
int a = 0xA;

(2) 실수 리터럴

  • 소수점이 있는 리터럴 : 10진수 실수
double d = 2.52;
  • E 또는 e가 숫자 뒤에 존재하는 리터럴 : 10진수 지수와 가수 표현
float f = 0.1111f;

(3) 문자 리터럴

  • ' '로 묶인 하나의 텍스트
char c = 'A';
char c = 'a';
  • 이스케이프 문자

    문자용도유니코드
    '\t'수평탭0x0009
    '\n'줄바꿈0x000a
    '\r'리턴0x000d
    '\"'" 표시0x0022
    '\'' 표시0x0027
    '\'\ 표시0x005c
    '\u16진수'16진수에 해당하는 유니코드0x0000~0xfff

(4) 논리 리터럴

  • booolean 논리 기본 데이터 타입에 저장될 수 있으며 true/false 값을 가진다.
boolean isTrue = true;

5. 스코프(Scope)와 라이프타임(Lifetime)

💡 스코프란 변수에 접근할 수 있는 유효 범위이다.
변수는 선언된 블록 내에서만 접근 가능하며, 블록은 중괄호 { } 로 구분된다.

💡 라이프타임이란 변수가 메모리에서 살아 있는 기간이다.

public class test { 
	int a; // 인스턴스 변수 static int 
    b; // 클래스 변수 
    void method() { 
	    int c; // 지역 변수 
    } 
}
  • 클래스 변수 (Class Variable) : 클래스 내부, 모든 블록 외부에서 선언되고 static으로 표시된 변수
    • 스코프 : 클래스 전체
    • 라이프타임 : 프로그램이 끝날 때까지 또는 클래스가 메모리에 로드되는 동안
  • 인스턴스 변수 (Instance Variable) : 클래스 내부와 모든 메소드 및 블록 외부에서 선언된 변수
    • 스코프 : 정적 메소드를 제외한 클래스 전체
    • 라이프타임 : 객체가 메모리에 남아 있을 때까지
  • 지역 변수 (Local Variable) : 인스턴스 및 클래스 변수가 아닌 모든 변수

    • 스코프 : 선언된 블록 내에 있음
    • 라이프타임 : 컨트롤이 선언된 블록을 떠날 때까지


6. 타입 변환

💡 타입 변환은 하나의 타입을 다른 타입으로 바꾸는 것이다. 자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있다.

➡️ 데이터 손실 문제 때문에 작은 타입에서 큰 타입으로의 변환은 가능하나 큰 타입에서 작은 타입으로의 변환은 불가능하다.


(1) 묵시적 타입 변환

💡 묵시적 타입 변환은 연산 시에 컴파일러가 자동으로 수행해주는 타입 변환이다.

➡️ 자바에서는 데이터 손실이 발생하는 대입 연산을 허용하지 않기 때문에 묵시적 타입 변환은 데이터의 손실이 발생하지 않거나 최소화 되는 방향으로 진행된다.

int a = 10;
double b = 5.5;

double c = a + b;

위의 예시에서 자바는 변수 a를 묵시적으로 double로 변경하기 때문에 오류없이 잘 작동한다.


(2) 명시적 타입 변환

💡 명시적 타입 변환은 연산 시에 사용자가 강제적으로 타입을 변경하는 것을 말한다.

➡️ 변환 시키고자 하는 데이터 앞에 (타입)을 작성하는데, 이것을 타입캐스트 연산자라고 한다.

int a = 10;
double = 5.5;

double c = (int)a + (int)b; // c = 15
double d = (int)a + (double)b; // d = 15.5
double e = (double)a + (double)b; // e = 15.5

7. 타입 추론 / var

💡 타입추론이란 타입이 정해지지 않은 변수에 대해서 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것이다. 개발자가 타입을 명시하지 않아도 되어 코드량을 줄일 수 있으며 코드의 가독성을 높일 수 있다.

  • 대표적인 타입추론 언어는 Javascript , kotlin , swift 등이 있다.

  • var

    • Java 10 버전부터는 var이라는 키워드가 생겼다.
    • 컴파일러는 개발자가 입력한 초기화 값을 통해 타입을 유추하는데, var는 컴파일러가 타입을 유추할 수 있도록 초기화값이 있는 지역변수(Local Variable)로만 선언이 가능하다.
    • var은 다이아몬드 연산자 <> 와는 함께 사용할 수 없다.
profile
그래도 해야지 어떡해

0개의 댓글