개발 일지/Java

[Java] 타입(Type)

미숫가루설탕많이 2022. 12. 21. 21:34

 타입(Type)은 어떤 값의 유형 및 종류를 나타내며, 타입에 따라 값이 차지하는 메모리 공간의 크기와 값이 저장되는 방식이 결정된다.

 

 예를 들어, 정수형 타입의 데이터는 4byte, 문자형 타입의 데이터는 1byte이다.

 

 자바의 타입은 실제 값을 의미하는 기본 타입(primitive type)과 어떤 값이 저장된 주소를 값으로 갖는 참조 타입(reference type)으로 분류된다.

  • 기본 타입 (primitive type) : 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)
  • 참조 타입(reference type) : 객체의 주소를 저장하며 8개의 기본형을 제외한 나머지 타입이다.

 

 

 

정수 타입


 정수 타입은 숫자를 나타내는 타입으로 byte, short, int, long의 총 4가지 타입으로 분류된다. 이들이 각각 차지하는 메모리 크기는 서로 다르며 그에 따라 나타낼 수 있는 숫자의 범위가 다르다.

 

 예전에는 메모리의 용량이 넉넉하지 않아서 필요에 따라 변수의 자료 범위를 변경해야 했다. 그래서 적은 메모리를 사용하는 short, 가장 많은 메모리를 사용하는 long, 중간 정도의 메모리를 사용하는 int로 나누어 사용했지만 근래에는 메모리 용량이 부족한 경우가 거의 없으므로 정수형을 사용할 때는 일반적으로 int형을 사용한다.

 

타입 메모리 표현 범위
byte 1byte -128(-2^7) ~ 127(2^7 - 1)
short 2byte -32,768(-2^15) ~ 32,767(2^15 - 1)
int 4byte -2,147,483,648(-2^31) ~ 2,147,483,647(2^31 - 1)
long 8byte -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 - 1)

 

 정수형 리터럴은 정수형 변수에 할당할 수 있다. long 타입 리터럴의 경우에는 리터럴 뒤에 접미사 L 또는 l을 붙여줘야 하는데 숫자 1과 혼동을 방지하기 위해 일반적으로 대문자 L을 붙인다.

 

 작성한 코드가 실행중일 때, 어떤 값이 실수로 작성한 코드에 의해 각 타입의 표현 범위를 넘어서는 경우가 발생할 수 있다. 예를 들어, byte형 값 100에 50을 더하면 150이 되지만 byte형의 표현 범위는 -128 ~ 127이므로 150은 byte형의 표현 범위를 넘어서는 값이 된다. 이 때 오버플로우가 발생한다. 반대로 byte형 값 -100이 있는데 50을 더 빼면 그 값은 -150이 된다. -150은 byte형의 표현 범위 중 최소값을 넘어서는 값이므로 언더플로우가 발생한다.

 

  • 오버플로우
    - 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현할 경우 발생
    - 최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환
    ex) byte형 값 127에 1을 더하면 128이 아니라 -128이 된다.

  • 언더플로우
    - 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현할 경우 발생
    - 최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환
    ex) byte형 값 -128에 1을 빼면 -129가 아니라 127이 된다.

 

 

 

 

실수 타입

 


 실수는 소수점을 가지는 값을 의미하며 float형과 double형으로 분류된다.

 

타입 메모리 표현 범위 정밀도
float 4byte 음수 : -3.4 * 10^38 ~ -1.4 * 10^-45
양수 : 1.4 * 10^-45 ~ 3.4 * 10^38
7자리
double 8byte 음수 : -1.8 * 10^308 ~ -4.9 * 10^-324
양수 : 4.9 * 10^-324 ~ 1.8 * 10^308
15자리

 

 double형 리터럴을 double형 변수에 할당할 때는 접미사 d를 붙여도 되고 붙이지 않아도 되지만, float형 리터럴을 float형 변수에 할당할 때는 반드시 접미사 f를 붙여줘야 한다.

 

 컴퓨터에서 실수는 저장할 때는 부동소수점 표현 방식으로 저장하는데, 이러한 방식은 효율적이지만 약간의 오차를 가진다. 이 오차는 실수를 더 정밀하게 표현할수록 줄어들며, 실수를 얼마나 정밀하게 나타낼 수 있는지를 정밀도라고 한다. 정밀도는 데이터 타입의 크기가 클수록 높아지기 때문에 double형은 float형보다 정밀도가 높다. 따라서 double형은 float형보다 더 큰 실수를 저장할 수 있고 더 정확하게 저장할 수 있다.

 

 실수형에서도 정수형과 마찬가지로 오버플로우와 언더플로우가 발생한다. 다만, 발생했을 때의 결과가 다르다.

 

  • 오버플로우
    - 값이 음의 최소 범위 또는 양의 최대 범위를 넘어갔을 때 발생하며, 이 때 값은 무한대가 된다.
  • 언더플로우
    - 값이 음의 최대 범위 또는 양의 최소 범위를 넘어갔을 때 발생하며, 이 때 값은 0이 된다.

 

 

 

 

논리 타입


논리 타입의 종류는 boolean형 한가지 뿐이다. boolean형은 참 또는 거짓을 저장할 수 있는 데이터 타입으로 true 혹은 false만 값으로 가진다.

 

 단순히 참과 거짓을 표현하기 위해서는 1bit만 있으면 되지만 JVM이 다룰 수 있는 데이터의 최소 단위가 1byte이기 때문에 boolean형은 1byte(8bit)의 크기를 가진다.

 

 

 

 

문자 타입


 문자 타입은 char형 한가지 뿐이고 크기는 2byte이다. 문자 타입 변수를 선언하면 해당 변수에 오직 하나의 문자형 리터럴을 저장할 수 있다.

 

 문자형 리터럴을 작성할 때는 반드시 큰 따옴표(")가 아니라 작은 따옴표(')를 사용해야 한다. 큰 따옴표를 사용한 리터럴은 문자형 리터럴이 아니라 문자열 리터럴로 인식되기 때문이다.

char letter1 = 'a';
char letter2 = 'ab'; // error : 단 하나의 문자만 할당할 수 있다. 
char letter3 = "a"   // error : 작은 따옴표를 사용해야 한다.

 

'개발 일지 > Java' 카테고리의 다른 글

[Java] 콘솔 입출력(I/O)  (0) 2022.12.22
[Java] 연산자(Operator)  (0) 2022.12.22
[Java] 문자열(String)  (0) 2022.12.21
[Java] 변수(Variable)와 상수(Constant)  (0) 2022.12.21
[Java] Java란?  (0) 2022.12.21