Goal
- 자바의 자료형에 대해 알아본다
- 기본 자료형에 대해 알아본다
- 참조 자료형에 대해 알아본다
- String 클래스에 대해 알아본다
자바의 자료형
타입(Data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 것이다. 자바에서 타입은 크게 기본형 타입과 참조형 타입이 있다.
기본 자료형이란?
- 기본 자료형은 8개로 우리가 추가로 만들 수 없다
- 정수형, 소수형, 논리 타입이 존재한다
- 반드시 기본값을 지정해야 한다
- 지역변수는 꼭 지정해야하며, 인스턴스, 클래스, 매개 변수는 지정하지 않아도 컴파일 되지 않지만 권장 x
- null이 허용 x
- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
- 각종 연산자들은 대부분 기본 자료형을 위하여 존재
- == 연산자를 통한 비교를 한다
타입 | 할당 메모리 크기 | 기본값 | 데이터 표현 범위 | |
논리형 | boolean | 1 byte | false | true, false |
정수형 | byte | 1 byte (8bit) | 0 | (-2의7 ~ -2의7-1) -128 ~ 127 |
short | 2 byte (16bit) | 0 | (-2의15 ~ -2의15-1) -32,768 ~ 32,767 | |
int(기본) | 4 byte (32bit) | 0 | (-2의31 ~ -2의31-1) -2,147,483,648 ~ 2,147,483,647 | |
long | 8 byte (64bit) | 0L | (-2의63 ~ -2의63-1) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
char | 2 byte (유니코드) | '\u0000' | 0 ~ 65,535 | |
소수형 | float | 4 byte | 0.0F | (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 |
double(기본) | 8 byte | 0.0 | (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 |
- 정수형 중에서 unsigned(부호가 없는) 것은 단지 char
8비트와 byte타입
- 1byte = 8비트
- 8비트는 0과 1로 표현할 수 있는 공간이 8개라는 것
- 음수와 양수를 표현하기 위해, 맨 앞에 있는 값 0이면 양수, 1이면 음수
- 가장 왼쪽의 공간 2의 7은 음수와 양수를 구분하는 공간
- 따라서 byte의 범위가 127이다
- 각 타입이 나타낼 수 있는 숫자의 범위가 2배씩 증가됨
byte형은 왜 만들었을까?
동영상, 이미지 저장할 때 int 타입일 경우, 단순히 숫자 하나 표현을 위해 32개의 0과 1을 표시하기 위한 공간이 필요하다. 즉, byte대비 4배의 저장공간이 더 필요하게 되는 것이다. 그래서, 많은 부분에서 데이터를 저장할 때 byte 값들을 조합해서 사용한다. 그래야 적은 공간에 보다 많은 내용을 저장할 수 있다. (ex. 네트워크통신에서 주고 받기 위한 binary 데이터 상호변환)
다른 정수형 타입들은 어떻게 활용하는가?
- short - byte로 표현하기로 부족하고 int로 표현하기엔 공간 낭비가 심할 때 사용
- int - 아주 큰 숫자를 계산하지 않는 한 int를 사용
- long - int만으로 부족할 때는 long 사용
- long 타입의 숫자를 명시적으로 지정해 줄 때는 반드시 숫자 뒤 L를 붙여주어야 한다
소수점을 처리하고 싶을 때는?
- float, double 소수점 값을 처리하기 위해 사용
- float - 32bit
- single-precision 32-bit IEEE 754 floating point (from Oracle)
- 단일 정확도를 가지는 32비트 IEEE 754 부동 소수점
- IEEE 국제표준(아이트리플이), 754 표준 번호
- float : 부호(1자리)+지수(8자리)+가수(23자리) = 32비트
- double - 64bit
- double-precision 64-bit IEEE 754 floating point (from Oracle)
- double : 부호(1자리)+지수(11자리)+가수(52자리) = 64비트
- 돈 계산과 같이 계산이 요구될 때에는 java.math.BigDecimal 클래스를 사용해야 한다. double은 32비트와 64비트로 제공할 수 있는 범위를 넘어서면 그 값의 정확성을 보장하지 못하기 때문이다.
참조 자료형이란?
- 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference type)
- JAVA에서 최상인 java.lang.Object 클래스를 상속하는 모든 클래스
- 참조 자료형은 new를 통해 객체를 생성한다
- new 없이도 객체를 생성할 수 있는 참조 자료형은 오직 String 뿐
- 값을 할당하기 위한 등호(=)만 사용할 수 있다
- +는 String 클래스만 사용가능하며 나머지 클래스에서 사용할 수 없다.
- null이 허용된다
- 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙(Heap) 메모리에 저장된다.
- gc의 대상이 된다
- 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException(NPE)이 발생하므로 변수값을 넣어야 한다.
타입 | 할당 메모리 크기 | 기본값 | 예시 |
배열(Array) | 4 byte (객체의 주소값) | Null | int[] arr = new int[5] |
열거(Enumeration) | |||
클래스(Class) | String str = "test"; Student student = new Student(); |
||
인터페이스(Interface) |
조금 특별한 String Class
- 참조형에 속하지만 기본적인 사용은 기본형처럼 사용한다
- 불변(immutable)한 객체
- String 문자열을 더하면 새로운 String 객체가 생성되고 기존 객체는 버려진다. 그러므로, String을 만들어 계속 더하는 작업을 하면 계속 쓰레기를 만드는 것과 같다 = gc의 대상
- 이 점을 보완하기 위해 StringBuffer, StringBuilder클래스가 나왔다.
- StringBuffer - Thread safe
- StringBuilder - Thread unsafe
- String 객체간 비교는 .equals()로 한다
- 더하기 연산이 가능한 유일한 클래스
- 객체에 더하기를 하면 toString() 메소드가 호출되고 그 결과를 더하는 것
불변(immutable)객체 참고
[Muatable and Immutable] 가변 객체와 불변 객체
Goal Mutable한 객체와 Immutable한 객체는 무엇이고 또 그 차이를 알아보자 Mutable한 객체를 Immutable한 객체로 만드는 방법은 무엇인지 알아보자 Mutable한 객체란 ? 가변객체로 초기화 후, 값이 변경될
dev-rosiepoise.tistory.com
참고
자바의 신 by 이상민
'JAVA > about java' 카테고리의 다른 글
[java] java.lang, java.util 패키지와 Object 클래스 (0) | 2023.08.24 |
---|---|
[String] String vs StringBuffer vs StringBulider (0) | 2023.08.22 |
[variables] 지역변수, 클래스변수, 인스턴스 변수 (0) | 2023.08.20 |
[Polymorphism] 다형성과 오버라이딩(overriding) vs 오버로딩(overloading) (0) | 2023.08.18 |
[Class Loader] 클래스 로딩 시점 / 클래스 로딩 / 클래스 초기화 (0) | 2023.07.02 |