HwangHub

자바 변수 톺아보기 본문

DEV-STUDY/Java

자바 변수 톺아보기

HwangJerry 2024. 1. 15. 19:22

이번엔 자바에서의 변수에 대해 자세히 알아보려 합니다. 변수는 자바에서 데이터를 저장하고 관리하는 데 중요한 역할을 합니다. 이 글을 통해 변수의 종류와 활용법에 대해 이해하시고, 실제 코딩에서 더 효율적으로 활용하시기 바랍니다.

변수란?

변수는 자바에서 메모리 공간에 값(value)를 할당하여 데이터를 활용할 수 있도록 도와주는 도구입니다. 이를 통해 우리는 데이터를 저장하고, 읽고, 변형하는 데 사용됩니다. 변수는 크게 기본형(primitive type)과 참조형(reference type) 두 가지로 구분합니다.

기본형 변수

기본형 변수는 타입에 따라 정해진 크기의 메모리 공간을 할당받고, 그 공간에 '값'을 직접 저장합니다. 기본형 변수는 다음과 같이 8가지가 있습니다.

  • boolean (1byte ; 개인적으론 의아했던 포인트였는데, 자바는 데이터를 다루는 최소 단위가 byte라서 boolean도 1byte로 관리합니다.)
  • byte (1byte)
  • short (2byte)
  • int (4byte)
  • long (8byte)
  • float (4byte)
  • double (8byte)
  • char (2byte)

참조형 변수

참조형 변수는 할당된 공간에 참조값(데이터가 저장된 힙 주소와 매핑되는 hash code)이 저장됩니다. 클래스의 인스턴스 뿐만 아니라 배열 변수도 참조형 변수입니다.

int[] arr = new int[10];
System.out.println(arr); // [I@7ef20235

값 전달 방식

자바는 함수의 인자 값이나 반환값을 전달할 때 메모리의 값을 전달한다고 해서 'pass by value'라고 말합니다. 그러나 변수의 타입에 따라 실제 값이 전달되는지, 아니면 참조값이 전달되는지가 다릅니다.

  • 기본형 변수: 메모리에 저장된 '실제 값'이 전달됩니다. (pass by value)
  • 참조형 변수: 메모리에 저장된 참조 값(hash code)이 전달됩니다. (pass by value)

여기서 많이들 오해하는게, 참조형 변수가 실제 값이 아니라 참조 값을 전달하기 때문에 pass by reference 아니냐, 혹은 call by reference랑 똑같은 거 아니냐 하는 사람이 많습니다. 하지만 이는 분명히 다른 개념이며, 이를 다룬 게시글을 이전에 올렸으니 헷갈리시는 분은 참고해보시길 바랍니다.

 

자바 변수가 pass by reference를 사용한다고요?

자바에서는 기본형 변수외에 참조형 변수를 활용할 때 'pass by value'라는 용어를 사용하곤 합니다. 그러나 이 'pass by value'는 기본형 변수를 전달할 때의 'pass by value'와는 다소 차이가 있습니다. 기

hwanghub.tistory.com

주의할 점

  1. 변수의 범위: int의 범위는 기본적으로 2^(-31) ~ (2^31 - 1)이므로 약 -20억 ~ 20억까지 커버할 수 있습니다. 오버플로우를 방지하기 위해 각 데이터 타입의 범위를 주의하며 설정해야 합니다.
  2. 실수 연산의 정확성: 컴퓨터는 0과 1만을 인식하기 때문에 float 또는 double 타입의 연산은 정확하지 않습니다. 이를 해결하기 위해 int 형변환을 적절하게 사용하거나, 자바에서 제공하는 BigDecimal 클래스를 사용하여 정확한 실수 연산을 수행할 수 있습니다.
float f1 = 2.0f;
float f2 = 1.1f;
float f3 = f1 - f2;
System.out.println(f3); // 0.9

double d1 = 2.0;
double d2 = 1.1;
double d3 = d1 - d2;
System.out.println(d3); // 0.899999999999999...

System.out.println(((int) (d1 * 100) - (int) (d2 * 100)) / 100.0); // 0.9

BigDecimal b1 = new BigDecimal("2.0");
BigDecimal b2 = new BigDecimal("1.1");
System.out.println("BigDecimal을 이용한 빼기 : " + b1.subtract(b2)); // 0.9

잘 아는 것 같다가도 가끔은 특정 부분이 헷갈리기도 하는 순간이 오더라고요. 이번 기회에 저의 뇌에도 잘 각인되길 바라며, 이 글이 도움이 될 모두에게도 잘 이해되길 바랍니다.

Comments