0. 들어가기
자바의 자료형(Java data type 자바 데이터 타입)은 기본 자료형과 참조 자료형으로 나뉜다.
이번 글에서는 자바의 기본 자료형(primitive types)에 대해 다룬다.
0.0 자료형(Data type)은 왜 있을까?
우리는 Java를 처음 배울 때 자연스럽게 int, double 등의 자료형을 사용하는 법부터 배운다. 존재 이유가 궁금하지 않은가?
자연과학과 비교하여 컴퓨터공학의 공부가 재밌는 이유는 어떤 개념이 누군가의 의도에 의해 도입되었고, 이를 항상 설명할 수 있기 때문이다. 발견을 거듭하는 과학과 다르게 사람이 만들어 발전만을 거듭하는 컴퓨터공학은 어떠한 것의 존재이유를 설명하기 쉽고 이를 설명하는 것이 이해도를 높이는 데 도움이 된다. 호기심 충족으로 인한 재미는 덤이다.
다시 돌아와서 자료형은 왜 있는걸까? 왜 data를 type별로 나누어 놓았을까? 왜 컴퓨터에게 정수인지, 실수인지, 문자인지, 세부적으로 몇 바이트인지 알려줘야 하나?
이에 대해서는 크게 메모리 효율성과 개발자의 실수를 도와주기 위함으로 설명할 수 있다.
1. 메모리 효율성
우리는 프로그램을 실행하고 출력값을 바로 확인하기에 잊기 쉽지만 코드가 실행될 때, 실행할 공간이 필요하다.
우리의 프로그램을 실행하면
1) 보조기억장치(SSD, 하드디스크)에 있던 프로그램이 메모리에 올라가고
2)CPU에 있는 메모리 주소 레지스터(MAR)를 통해 메모리 버퍼 레지스터(MBR)에 메모리 데이터를 담아 레지스터로 가져와
3) 연산하고
4) 다시 메모리에 저장한다
CPU 레지스터 > 메모리 > 보조기억장치 순으로 속도가 빠르다. 이 차이는 엄청난 수준이라 각 단계가 꼭 필요하다.
제일 빠른 레지스터에 모든 파일을 집어넣으면 좋겠으나 기술적으로 힘들고 가격이 비싸다.
여기서 우리는 1)에 집중해 보자.
보조기억장치에 저장되어있는 프로그램을 우리의 주기억장치(메모리)로 통째로 load할 수 없다. 메모리의 용량이 부족하기 때문이다.
컨트롤러 칩과 데이터 버퍼 등의 구성 요소를 통해 지속적으로 메모리에 필요한 데이터가 없으면 보조기억장치에서 가져오고, 메모리 용량이 부족하면 다른 데이터로 교체된다.
우리가 기본 자료형을 사용할 때 stack 메모리에 직접 값을 저장하고, 값을 복사하여 처리한다. 메모리에 값을 저장하기 위해 운영체제에게 메모리를 할당받는데 할당받아야 할 메모리의 크기를 컴파일러가 미리 지정해둔 것이 데이터 타입이다.
1byte만으로 전체 데이터(ex:날짜)를 다룰 수 있는 경우도 있고, 8byte가 필요한 경우(double실수)도 있다. 서로 다른 형태와 크기의 데이터를 저장하기 위해 다양한 자료형을 사용하면, 모든 변수 각각에 큰 메모리 공간을 할당하지 않아도 되어 메모리 공간을 더 효율적으로 사용할 수 있다.
2. 개발자의 오류 가능성
개발자는 사람이므로 실수할 가능성이 매우 높다. 타입을 지정하고 이를 통해 오류를 내지 않으면 개발자가 디버깅 하기 매우 힘들 것이다.
1) 타입 안정성
자바는 정적 타입 언어로서, 컴파일 시에 타입 검사를 수행한다. 이 떄 자료형을 명시함으로써 컴파일러가 코드를 분석해 잠재적인 타입 관련 오류를 찾아준다.
2) 코드 가독성
자료형을 명시적으로 지정하면 가독성을 향상시켜 프로그램을 이해하고 유지보수하는데 도움을 준다.
3) 연산의 의미 결정
각 자료형은 다양한 연산을 지원하며, 연산의 결과에 대한 정확성 및 범위가 다르다.
예를들어 문자와 숫자의 연산은 그 의미가 다르며, float와 double은 정밀도와 범위가 다르다.
1. 기본 자료형의 종류
자바의 기본 자료형은 영어로는 primitive data type이고, 직역하여 원시 자료형으로도 불린다. 총 8개가 있다.
크기/종류 | 정수형 | 문자형 | 실수형 | 논리형 |
1byte | byte | - | - | boolean |
2byte | short | char | - | - |
4byte | int | - | float | - |
8byte | long | - | double | - |
정수형 8개, 문자형 1개, 실수형 2개, 논리형 하나가 있다. 문자열 String의 경우 data type이 아니라 자바에서 제공하는 class이다.
기본 자료형에 대해 하나씩 자세히 알아보기 전에, 세 가지 개념만 챙기고 가자.
1. 1byte는 8bit이다.
2. 1byte는 컴퓨터가 정보를 처리하는 가장 작은 단위이다.
3. 컴퓨터는 음수의 표현으로 2의 보수체계를 사용한다.
컴퓨터가 자료를 이진수로 받아들인다 하여 정보 단위를 2가지 경우의수인 bit로 설정하면 너무 작아 복잡하기에, 256가지 경우의수인 byte 단위를 정보처리의 가장 작은 단위로 쓴다.
음수 표현 체계에 대해서는 다른 글에서 설명하겠다. 지금은 음수의 표현으로 2의 보수체계를 사용하기 때문에, 경우에 수에서 음수와 0, 그리고 양수 부분을 나눌 때 -의 절댓값이 1 크다고 이해하면 되겠다.
예를들어 1byte 256가지 경우의 수의 경우 범위가 -128에서 0을 지나 127까지가 된다.
1.0 정수형
기본 자료형은 1,2,4,8byte가 있는데, 정수형은 모든 크기마다 다르게 존재한다.
기본적으로 4byte의 int를 사용한다.
1. byte
byte는 말 그대로 1 byte를 의미한다. 2^8이므로 256가지의 경우의 수를 표현할 수 있다.
정수이므로 음수까지 범위를 할당해 -128~127이다.
2. short
short는 정수의 기본형 int의 크기를 줄인 것이다. 2byte이므로 2^16, 즉 65536가지의 경우의 수를 표현할 수 있다.
범위는 -32768~32767이다.
3. int
정수를 다룰 때 기본이 되는 자료형이다. 정수 리터럴의 경우 기본적으로 int type이 된다.
4byte이므로 2^32, 즉 약 42억의 경우의 수를 표현할 수 있다.
범위는 약 -21억~21억이다.
4. long
절댓값으로 크기가 21억 이상의 정수를 표현하고 싶을 때 long타입을 사용한다.
8byte이므로 2^64, 즉 약 1840경의 경우의 수를 표현할 수 있다.
범위는 약 -920억 ~ 920억이다.
*참고) 자바에는 unsigned 키워드가 없다
자바를 만든 제임스 고슬링이 c++에서 unsigned로 인한 오류를 너무 많이 겪어 포함시키지 않았다.
하지만 Java8부터 Integer나 Long클래스에서 unsigned를 다루는 메소드가 추가되었다.
1.1 실수형
실수형은 2진 부동소수점수로 표현하는데, 기본적으로 double형을 쓴다.
부동소수점수는 표현 범위에 따라 단일정밀도, 2배정밀도 등의 표현 방법이 있다.
실수는 부호, 지수 부분, 가수 부분으로 나누어 진다.
1. float
단정밀도(single precision)이다. 4byte, 32bit크기이다.
부호비트 1비트, 지수 8비트, 가수23비트로 이루어진다.
범위는 ±3.4E-45 ~ ±3.4E+38, 유효자리수(정밀도) 6~7이다.
2. double
배정밀도(double precision)표현 방법을 사용하고 실수형의 기본이다. 8byte, 64bit크기이다.
부호비트 1비트, 지수 11비트, 가수 52비트로 이루어진다.
범위는 ±4.9E-324 ~ ±1.8E+308, 유효자리수(정밀도) 15~16자리이다
1.2 문자형
Java에서 문자형 타입은 char 하나를 사용한다.
char
ASCII code를 사용하여 문자 하나에 1byte만 사용하는 c/c++과 다르게 Java의 char는 2byte를 할당한다.
ASCII의 경우 한글을 표현할 수 없어, Java는 영어 외 글자도 지원하는 UNICODE를 사용한다.
유니코드의 크기인 2byte이며 65,536가지의 경우의수이고 음수는 없다.
0~65535의 범위로 단위 유니코드 문자를 저장한다.
문자열의 경우 String class에서 제공하는 문자열을 사용한다.
1.3 논리형
논리형은 참 거짓만을 다룬다.
boolean
true와 false값만을 다루므로 1bit만으로 충분하지만, Java에서 정보를 처리하는 가장 작은 단위는 1byte이므로 1byte를 할당한다. 하지만 true와 false만을 할당한다.
*c/c++과 다르게 숫자를 사용하지 않고 true,false만 사용한다.
반복문 while(1)의 경우 c언어는 무한루프가 돌아가지만 Java의 경우 오류가 난다. true를 사용하자.
마무리
Java에서 다루는 자료형 중 기본 자료형 8개에 대해 공부하였다.
자료형을 공부했으면 같이 딸려나오는 리터럴, 타입 변환에 대해 다음 글에서 알아보겠다.
'개발 > Java' 카테고리의 다른 글
[Java]자바의 반복문 (0) | 2023.07.21 |
---|---|
[Java] 자바 조건문: If-else, Switch-case, Switch Expression (0) | 2023.07.21 |
[Java]자바의 연산자 (0) | 2023.07.19 |
[안드로이드 스튜디오] View뷰가 뭐야? 레이아웃은 뭐야? 빠르게 보자 (1) | 2023.06.09 |
Java에서 컴파일(compile)이란 무엇일까? JVM,JDK,JRE? 바이트코드? (0) | 2023.05.27 |