일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 깃
- 다리를 지나는 트럭
- 스프링 OAuth
- 백엔드 개발자 뭐해?
- BufferedReader
- 리눅스 서버시간 변경
- 예외처리
- RESTful웹서비스
- Spring
- .ppk만들기
- Java
- 인스타그램만들기
- 백엔드
- 프로그래머스
- @RestCotroller
- Scanner
- RESTful
- 개발 뭐하지
- 클론코딩
- 개발자
- 인텔리제이
- 스프링
- 스프링부트
- springboot
- Git
- 입력
- 서비스 계층
- 깃허브
- string
- git hub
- Today
- Total
It's Ward
JAVA 자료형(Data type) 본문
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개는 서로 타입을 변환할 수 있습니다.
아래 두 경우에는 타입이 자동으로 변환됩니다.
- 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
- 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (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에대해서 정확하게 이해하고 사용하는 것이 중요하다고 생각합니다.
'Java > Java 기본' 카테고리의 다른 글
JAVA Scanner 와 BufferedReader 차이점 (0) | 2022.05.26 |
---|---|
JAVA - 유용한 String Method (0) | 2022.05.26 |
JAVA - 형 변환 및 출력 (Int to String & String to int.. 등) (0) | 2022.05.26 |
JAVA String 입력 - BufferedReder (0) | 2022.05.26 |
JAVA String 입력 - Scanner (0) | 2022.05.26 |