일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 알고리즘
- JUnit
- 코딩테스트
- 코드트리
- 그래프
- SSAFY
- 부분수열의합2
- 다시보기
- Spring
- 다익스트라
- 백준
- Java
- 완탐
- 싸피
- 자바
- SWEA
- 그리디
- 코테
- Union Find
- 코딩테스트실력진단
- DFS
- 트러블슈팅
- 유니온파인드
- DP
- BFS
- 기본유형
- database
- 완전탐색
- 알고리즘기본개념
- JPA
- Today
- Total
HwangHub
자바 변수 톺아보기 본문
이번엔 자바에서의 변수에 대해 자세히 알아보려 합니다. 변수는 자바에서 데이터를 저장하고 관리하는 데 중요한 역할을 합니다. 이 글을 통해 변수의 종류와 활용법에 대해 이해하시고, 실제 코딩에서 더 효율적으로 활용하시기 바랍니다.
변수란?
변수는 자바에서 메모리 공간에 값(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
랑 똑같은 거 아니냐 하는 사람이 많습니다. 하지만 이는 분명히 다른 개념이며, 이를 다룬 게시글을 이전에 올렸으니 헷갈리시는 분은 참고해보시길 바랍니다.
주의할 점
- 변수의 범위:
int
의 범위는 기본적으로 2^(-31) ~ (2^31 - 1)이므로 약 -20억 ~ 20억까지 커버할 수 있습니다. 오버플로우를 방지하기 위해 각 데이터 타입의 범위를 주의하며 설정해야 합니다. - 실수 연산의 정확성: 컴퓨터는 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
잘 아는 것 같다가도 가끔은 특정 부분이 헷갈리기도 하는 순간이 오더라고요. 이번 기회에 저의 뇌에도 잘 각인되길 바라며, 이 글이 도움이 될 모두에게도 잘 이해되길 바랍니다.
'DEV-STUDY > Java' 카테고리의 다른 글
조건문 짚고 넘어가기 (0) | 2024.01.15 |
---|---|
비트 비교연산자 짚고 넘어가기 (1) | 2024.01.15 |
자바 변수가 pass by reference를 사용한다고요? (0) | 2024.01.15 |
게시글 body(문자열)에 이미지 태그 내용 제거하여 반환하기 (0) | 2024.01.09 |
LocalDateTime 형식 파싱 (ofPattern & ofLocalizedDate) (1) | 2024.01.09 |