자료형 종류
- 기본 자료형(Primitive Type)
- 참조 자료형(Reference Type)
기본 자료형
- 자바 컴파일러에 의해 해석되는 자료형
- 총 8가지의 기본형을 미리 정의 및 제공
- 사용 전, 반드시 선언(Declared)되어야 함
- OS (운영체제)에 따라 자료형 길이 달라지지 않음
- 비객체 타입이기에 null 값을 가질 수 없음. 만약 기본형에 null 을 넣으려면 Wrapper Class 활용
- 스택(Stack) 메모리에 저장됨
동적타이핑(Dynamic typing) | 정적타이핑(Static typing) |
|
|
기본 자료형 종류
논리형 : boolean
- type
- false (default)
- true
- 두 가지 값만 표현하면 되어 1 bit만으로도 충분하나, 자바에서는 데이터를 다루는 최소 단위가 byte 이기에 boolean 의 크기는 1 byte
문자형 : char
- 단 하나의 문자만 저장
- 사실은 문자가 아닌, 문자의 유니코드(정수)가 저장됨
- 문자 리터럴 대신, 문자의 유니코드를 직접 저장할 수도 있음
char ch = 'A';
char ch = 65;
특수문자
char line = '\n'; // 빈 한줄 추가
char backspace = '\b'; // 한 글자 지워짐
char backslash = '\\'; // \
char singleQuote = '\''; // '
char doubleQuote = '\"'; // "
System.out.println("\"Hello\""); // "Hello"
short vs char
- 16 비트로 표현할 수 있는 정수의 개수 : 216개(65536개)
- short 타입의 표현 범위 : -215 ~ 215 - 1 (-32768 ~ 32767)
- char 타입의 표현 범위 : 0 ~ 216 - 1 (0 ~ 65535)
char ch = 'A';
short s = 65;
/*
둘 다 2진수로 똑같은 값 저장되나
println()은 변수 타입이 정수형이면 10진수로 출력
문자형이면 저장된 숫자에 해당하는 유니코드 문자 출력
*/
System.out.println(ch); // A
System.out.println(s); // 65
인코딩(Encoding) & 디코딩(Decoding)
아스키(ASCII)
- American Standard Code for Information Interchange
정수형 : byte, short, int, long
- JVM 피연산자 스택이 피연산자를 4byte 단위로 저장하기에,
- 크기가 4 byte 보다 작은 자료형(byte, short) 값 계산 시, 4 byte 로 변환하여 연산이 수행됨
- ➡️ int 사용이 더 효율적
정수형의 오버플로우
- 오버플로우(Overflow) : 타입이 표현할 수 있는 값의 범위를 넘어서는 것
최대값 + 1 ➡️ 최소값
최소값 - 1 ➡️ 최대값
short sMin = -32768;
short sMax = 32767;
char cMin = 0;
char cMax = 65535;
System.out.println((short) (sMin - 1)); // 32767
System.out.println((short) (sMax + 1)); // -32768
System.out.println((int) --cMin); // 65535
System.out.println((int) ++cMax); // 0
실수형 : float, double
- 실수형은 소수점 단위도 표현해야 하므로
- '얼마나 큰 값을 표현할 수 있는가' 뿐만 아니라
- '얼마나 0에 가깝게 표현할 수 있는가'도 중요함
오버플로우
- 실수형도 정수형처럼 변수의 값이 표현범위의 최대값을 벗어나면 오버플로우 발생
- 그러나 정수형과 달리, 오버플로우 발생 시 변수 값은 무한대가 됨
언더플로우
- 정수형에는 없는 언더플로우(Underflow)가 있음
- 실수형으로 표현할 수 없는 아주 작은 값, 즉 양의 최소값보다 작은 값이 되는 경우를 말하는데, 이때 변수 값은 0
정밀도
- double 타입은 float 타입보다 정밀도가 약 2배인, 10진수로 15자리의 정밀도를 가짐
- float 가 아닌 double 타입 변수 사용하는 경우 : 대부분 저장하려는 '값의 범위' 때문이 아닌, '보다 높은 정밀도'가 필요해서임
float | double |
연산 속도 향상이나 메모리 절약에 좋음 | 더 큰 값의 범위나 더 높은 정밀도에 좋음 |
형변환(Casting)
- 변수 또는 상수 타입을 다른 타입으로 변환
- 기본형에서 boolean 제외, 나머지 타입들은 서로 형변환 가능
- 기본형과 참조형 간의 형변환 불가능
변환 | 수식 | 결과 |
int ➡️ char | (char) 65 | 'A' |
char ➡️ int | (int) 'A' | 65 |
float ➡️ int | (int) 1.6f | 1 |
int ➡️ float | (float) 10 | 10.0f |
char ➡️ String | '3' + "" | "3" |
String ➡️ char | "3".charAt(0) | '3' |
int ➡️ char | 3 + '0' | '3' |
char ➡️ int | '3' - '0' | 3 |
int ➡️ String | 3 + "" | "3" |
String ➡️ int | Integer.parseInt("3") | 3 |
참조 자료형
- 기본 자료형을 기초로 하여 만들어진 자료형(기본 자료형 제외한 모든 자료형)
- 자바의 String, Array, Map, Set 등과 같은 클래스(Class)와 , 인터페이스(Interface), 배열(Array), 열거(Enum) 등
- 필요에 따라 사용자가 참조형 타입 정의할 수 있음
- 빈 객체를 의미하는 Null 존재
- 런타임 에러(문법상으로는 이상 없으나 실행 시 잡히는 에러) 발생
- 예) 객체나 배열을 Null 값으로 받으면 NullPointException 발생하므로 변수값 넣어야 함
- new 로 만들어지는 것 : 메모리 영역인 Heap 영역에 생성 ➡️ Garbage Collector 가 돌면서 메모리를 해제함
- Heap 메모리에 생성된 인스턴스 : JVM 의 Stack 영역에 존재하는 Frame 에 일종의 포인터 역할인 참조값을 가지고 있음 ➡️ 메서드나 인터페이스에서 접근 시, 이를 통해 인스턴스 핸들
Object
- 모든 Class / Enum 은 Object 클래스를 상속함
- 다시말해 Object 는 모든 Class / Enum 의 일반화된 타입
- 주의점 : Interface 는 Object 상속 X (인터페이스의 조상은 인터페이스)
String
- char의 배열로 구현된 참조 자료형
- 참조형에 속하나, 기본형처럼 사용
- 불변(immutable) 객체
- String 클래스에는 값을 변경해주는 메소드들이 존재함
- 그러나 메소드 통해 데이터 변경하면 무조건 새로운 String 클래스 객체 만들어냄
- 일반적인 기본 자료형 비교 : == 연산자 사용
- 그러나 String 객체 간 비교 : .equals() 메소드 사용
- equals() : 객체 간의 값(value) 비교 / == : 대상의 주소(reference) 비교
- 자바가 C/C++과 달리 String 형을 따로 제공하는 이유 : 문자열에 유용한 메서드 제공하기 위함
- 문자열 조작 메서드 예시 : charAt(), concat(), equals(), indexOf(), split() 등
Array
- Array 또한 Object 의 상속 클래스
int[] array = new int[10];
System.out.println(array instanceof Object); // true
Wrapper 클래스
- 기본 자료형을 감싼 클래스
- 대표 종류 : Byte, Short, Integer, Long, Float, Double, Character, Boolean
- String 사용하듯, 기본 자료형을 클래스로 랩핑하여 유용한 메서드 제공 가능
- 제네릭(Generic)에 사용되는 매개변수 T는 Object 자료형만 받을 수 있음 = 클래스로 정의된 객체만 전달받음
- 그러나 제네릭을 기본 자료형에 적용해야 하는 경우 발생 시, Wrapper Class 사용하면 됨(유연한 프로그래밍 가능)
기본 자료형 vs 참조 자료형
- 참조 자료형은 기본 자료형과 달리 메서드를 가질 수 있음
- 참조 자료형의 기본값 : Null
- 참조형 객체가 초기화되지 않으면 NullPointerException 발생
출처
https://junior-datalist.tistory.com/215
https://seongonion.tistory.com/16
https://vanslog.io/posts/language/java/primitive-type-and-reference-type/
'Backend > Java' 카테고리의 다른 글
[Java] Enum (0) | 2023.12.05 |
---|---|
[Java] Pass by Value vs. Pass by Reference (0) | 2023.12.05 |
[자바의 신] 29장 (ongoing) (0) | 2022.08.31 |
[자바의 신] 28장 (ongoing) (0) | 2022.08.31 |
[자바의 신] 27장 (ongoing) (0) | 2022.08.18 |
댓글