JAVA/about java

[type] 자료형, 기본 자료형 (Primitive type) vs 참조 자료형(Reference type)

dev_rosieposie 2023. 8. 21. 16:10

Goal

  1. 자바의 자료형에 대해 알아본다
  2. 기본 자료형에 대해 알아본다
  3. 참조 자료형에 대해 알아본다
  4. 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 이상민

https://coder-in-war.tistory.com/entry/Java-13-Java%EC%9D%98-%EC%9E%90%EB%A3%8C%ED%98%95-Primitive-type-Reference-type

https://gbsb.tistory.com/6