[One-Day Tech Talk] Java의 데이터 타입

황제연·2025년 2월 14일

CS학습

목록 보기
4/194
post-thumbnail

서론

저번 2차원 배열의 복사 방법에 대해 다뤘던 글에서
얕은 복사는 객체의 주소를 복사해서 동일한 주소를 바라보고
깊은 복사는 객체의 데이터를 복사해서 새로운 주소를 바라본다고 정리했습니다.

그렇다면 Java에서 주소를 복사하지 않는 경우도 있을까요?
객체가 아닌 타입도 있지 않을까요? 이 경우는 어떻게 복사할까요?

이 의문을 해결하려면 Java의 데이터 타입에 대해 정리해야합니다

Java의 데이터 타입

자바의 데이터 타입은 크게 두가지로 나뉩니다

  • 기본형(Primitive) 데이터 타입
  • 참조형(Reference) 데이터 타입

기본형 데이터 타입

기본형 데이터 타입은 변수를 선언할 때 일반적으로 사용하는 타입들을 떠올리면 됩니다

다음 타입을 생각하면 됩니다

  • boolean
  • char
  • byte
  • short
  • int
  • long
  • float
  • double

자주 사용하던 변수 타입입니다. 이것들은 모두 기본형 데이터 타입입니다
더 세부적으로 나누면 논리형, 문자형, 정수형, 실수형으로 나눕니다.

특징

모두 소문자로 시작합니다.
또한 객체 타입이 아니라 null값을 가질 수 없습니다

기본값이 정해져 있습니다
boolean은 false가 기본값이며 나머지는 0입니다

착각하면 안 되는게, 기본값이 있다고 초기화가 필요없는 것은 아닙니다
지역변수로 데이터타입을 사용한다면 반드시 초기화해야합니다

안하면 위와같이 컴파일 에러가 발생합니다

static 변수로 선언하면 자동으로 초기화됩니다. 이때 초기화되는 값은 기본값입니다

  
public class Main {  
  
    static int a;  
    static boolean b;  
    public static void main(String[] args){  
        
  
        System.out.println(a);  
        System.out.println(b);  
    }  
}

실행결과는 아래와 같습니다

기본값으로 출력되는 것을 확인할 수 있습니다

기본형 데이터 타입은 변수 선언과 동시에 메모리에 생성됩니다
해당 데이터 타입은 메모리의 스택에 저장되며, 실제 자료값을 가집니다

이후에 GC와 자바의 메모리 구조에 대해서 다룰 때, 기본형의 특징에 대해 한번 더 다룰 것입니다

기본형 데이터 타입과 깊은 복사

깊은 복사는 객체의 데이터 값을 복사하는 것입니다
마치 기본형 데이터 타입의 복사 방식도 값을 복사하기 때문에 비슷해보이는데,
둘은 엄밀히 말하면 다릅니다.

기본형 데이터 타입의 복사는 그냥 값 복사고,
깊은 복사는 객체를 대상으로 하며, 그 데이터 값을 복사해서 새로운 주소로 만드는 것입니다

참조형 타입

참조형 타입은 앞선 기본형 타입을 제외한 나머지를 생각하면 됩니다
기본적으로 클래스나 배열, Enum 타입등 모두 참조타입라고 할 수 있습니다

지난번에 다룬 배열도 참조타입입니다.
따라서 객체의 주소나 데이터 값을 복사하는 얕은 복사와 깊은 복사를 다룰 수 있었습니다

특징

기본형과는 다르게 실제값이 저장되지 않습니다. 단지 실제 값이 저장된 공간의 주소를 지정합니다

즉 해당 값을 가져올 때, 실제 값이 있는 주소로 실제 값을 가져옵니다
참조형은 메모리의 힙에 실제 값을 저장하고 주소값은 스택에 저장합니다

기본형 타입과는 다르게 null로 초기화할 수 있습니다

public class Main {  
  
    public static void main(String[] args) throws IOException {  
       
        int[] arr = null;  
  
        System.out.println(arr);  
  
    }  
}

해당 코드를 정상적으로 컴파일 할 수 있고 출력해도 null이 출력되는 것을 확인할 수 있습니다
static 변수로 선언했을 때는 null로 초기화됩니다

public class Main {  
  
    static int[] arr;  
    public static void main(String[] args){
  
        System.out.println(arr);  
    }  
}

해당 코드를 출력하면 null이 나옵니다

결론

자바의 데이터 타입은 기본형 데이터 타입과 참조형 데이터 타입으로 구분할 수 있습니다

기본형 데이터 타입은 기본값을 가지며, 메모리의 stack 영역에 데이터가 저장됩니다.
또한 null로 초기화할 수 없습니다.

기본형 데이터 타입의 복사는 값복사로 깊은 복사랑은 다른 개념입니다

참조형 데이터 타입은 null로 초기화할 수 있으며 null을 기본값으로 가집니다
메모리의 stack 영역에는 실제 값이 있는 주소값이 저장되며, 실제 값은 heap 영역에 저장합니다

참고

profile
Software Developer

0개의 댓글