본문 바로가기
Backend/Java

[Java] 기본 자료형 & 참조 자료형

by unknownomad 2023. 12. 5.

자료형 종류

  • 기본 자료형(Primitive Type)
  • 참조 자료형(Reference Type)

https://sublivan.tistory.com/4


기본 자료형

  • 자바 컴파일러에 의해 해석되는 자료형
  • 총 8가지의 기본형을 미리 정의 및 제공
  • 사용 전, 반드시 선언(Declared)되어야 함
  • OS (운영체제)에 따라 자료형 길이 달라지지 않음
  • 비객체 타입이기에 null 값을 가질 수 없음. 만약 기본형에 null 을 넣으려면 Wrapper Class 활용
  • 스택(Stack) 메모리에 저장됨
동적타이핑(Dynamic typing) 정적타이핑(Static typing)
  • 코드 작성 시간 빠름
  • 코드 실행 속도 느림
  • 코드 내용 및 로직 파악 쉬움
  • 속도 중요한 작업에는 다소 부적합 / 작고 단순한 프로젝트에 적합
  • 동적 타이핑 언어 : Python, Ruby, PHP 등
  • 코드 작성 시간 느림
  • 코드 실행 속도 빠름
  • 코드 구조 파악 쉬움
  • 크고 복잡하며 다수가 참여하는 프로젝트에 적합
  • 정적 타이핑 언어 : C, C++, Java 등

 

기본 자료형 종류

https://vanslog.io/posts/language/java/primitive-type-and-reference-type/


논리형 : 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 에 일종의 포인터 역할인 참조값을 가지고 있음 ➡️ 메서드나 인터페이스에서 접근 시, 이를 통해 인스턴스 핸들

https://sublivan.tistory.com/4


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

댓글