It's Ward

JAVA 자료형(Data type) 본문

Java/Java 기본

JAVA 자료형(Data type)

I'm ward 2022. 5. 26. 02:54

date: 2022-05-09 18:50:22 +0900 작성

  • 자료형은 Java는 동일하지만 프로그램 컴파일러마다 조금씩 다를 수 있고, 해당 자료는 Java 기준으로 작성하였습니다.
  • Java에서 변수를 선언할 때, 메소드를 선언할 때, 저장되는 값의 자료형을 선언합니다.
  • 기본타입은 데이터의 실제 값을 의미합니다. 타입에 따라 적용 가능한 연산이 다릅니다.

  • 기본 타입(primitive type)
    • 데이터의 실제 값을 의미합니다.
    • 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(Boolean)
  • 참조 타입(reference type)
    • 데이터가 저장된 주솟값을 의미합니다.
    • 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입

 

기본 타입(primitive type)

 

  • 논리형 : boolean을 제외한 나머지 7개의 기본형은 서로 연산이 가능합니다. 자바는 최소 단위가 1byte이므로, 1byte로 구성되어있습니다.( true, false)
  • 문자형 : 내부적으로 2byte 정수(유니코드)로 저장하기 때문에 정수형과 다르지 않으며 정수형, 실수형과 연산이 가능합니다. (일부 컴파일러의 아스키코드는 1byte)
  • 정수형 : 소수 점을 표현하지 않은 정수이며, 사용하는 목적에 따라 데이터 크기를 다르게 설정하여 선언합니다.
  • 실수형 : 부동 소수점 방식으로 표현되어있으며 소숫점의 자리 수와 오차가 다릅니다. (IEEE 754)

각 자료형의 범위는 -2^n-1 ~ 2^n-1 - 1이며, n은 자료형의 bit 수입니다.

ex) int의 경우 bit가 4byte * 8bit = 32bit 기 때문에 -2^31 ~ 2^31 - 1입니다.

해당하는 자료형보다 큰 값을 저장하려 하면 오류가 발생하며, 연산을 통해 값이 늘어나거나 적어지는경우 오버플로우/언더플로우가 발생 할 수 있습니다. 자세한 내용은 오버플로우, 언더플로우을 참조하세요.



자동 타입 변환

boolean을 제외한 기본 타입 7개는 서로 타입을 변환할 수 있습니다.

아래 두 경우에는 타입이 자동으로 변환됩니다.

  1. 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
  2. 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (ex. 정수 → 실수)
// 자동으로 타입 변환 할 수 있는 순서
//byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
// 괄호 안 숫자는 바이트 크기 표현

int intValue = 10;
long longValue = intValue;

System.out.println(longValue); // 10 출력
// 또는,  float이 표현할 수 있는 값이 더 정밀하기 때문에 8byte라고 하더라도 float으로 자동변환됨

float floatValue = longValue;
System.out.println(longValue); // 10.0 출력


## 수동 타입 변환(Casting)

메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않습니다. 이때 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장할 수 있습니다. 이를 캐스팅(casting)이라고 합니다.

캐스팅 연산자인 ()를 사용하고, 연산자 안에는 변환하고자 하는 타입을 적어주면 됩니다.

1. 형 변환 방법

doublue doublueValue = 32.33;
int intValue = (int)doublueValue;
// int 등 정수형은 소수점을 버립니다. intValue 에는 32가 저장되있음을 알 수 있습니다. 

 

char charater = '0';
int intValue = (int)charater;
System.out.println(intValue); //유니코드 '0'인 48이 출력됩니다. 



2. 정수형 간의 형 변환

  • 큰 타입에서 작은 타입으로 변환할 경우 값의 손실이 발생할 수 있습니다.
  • 큰 타입으로 변환할 경우 값의 손실이 없습니다.
  • 변환하고자 하는 값이 양수면 0, 음수면 1을 빈칸에 채워 넣습니다. (자세한 내용은 2의 보수를 확인하세요.)
//큰 타입에서 작은 타입으로 변환하는 경우
int intValue = 300;
byte byteType = (byte) 10; //0000 1010(10) -> 0000 1010(10)
byte byteType = (byte) intValue; //0000 0001 0010 1100(300) -> 0010 1100(44)
//데이터 크기가 다르기 때문에 저장 시 앞부분은 사라짐.



3. 실수형 간의 형 변환



**부동소수점 표현 방법**
S: 부호, E : 지수, M: 가수

실수중에는 파이(3.1415....) 와 같은 무한소수가 존재하므로 오차가 발생 할 수 있습니다.

그러므로 큰 타입에서 작은타입으로 변환 할 때, 가수부가 23을 넘는경우 반올림이 발생할 수 있습니다.




작은타입(float)에서 큰 타입(double) 변환하는 경우

  • float의 기저인 127을 빼고 double의 기저인 1023을 더한다.
  • float의 가수 23자리를 채우고 빈칸에 0을 채운다.

    큰 타입(double)에서 작은타입(float) 변환하는 경우

  • double의 기저인 1023을 빼고 float의 기저인 127을 더한다.
  • double의 가수 52자리 중 23자리만 저장하고 나머지는 버린다.



참조 타입(reference type)



기본 자료형은 사용하는 메모리가 정해져 있었던 반면 참조 자료형은 클래스를 타입으로 변수를 선언하는 자료형입니다. 그러므로 클래스에 따라 할당되는 메모리가 다릅니다.

대표적으로 String, Date, 등 이 있으며 또한 임의로 내가 원하는 클래스를 만들어 참조 자료형으로 사용할 수 있습니다.

클래스에 대한 자세한 내용은 객체지향 프로그래밍에서 다루도록 하겠습니다.



결론

Java <-> Java 끼리의 통신에서 형 변환 혹은 같은 방식을 가지고 있는 형 변환 방식끼리는 문제가 없지만, 다른 방식의 컴파일러 혹은 언어에서 주어진 데이터를 파싱하여 받는 경우 분명 문제가 생길 수 있습니다.

typeCasting에대해서 정확하게 이해하고 사용하는 것이 중요하다고 생각합니다.

Comments