변수가 무엇인지와 자료형에 대해 글을 작성한 적이 있는데, 그때 기본타입만 작성했었다.
기본타입과 참조타입에 대해 비교하며 정리하고자 글을 작성한다.
자료형(데이터 타입)에는 기본 타입(Primitive type)과 참조 타입(reference type)이 있다.
기본 타입(Primitive type)
정수 타입, 실수 타입, 논리 타입이 있다.
변수와 자료형에 대해 쓰면서 작성했던 표를 가져왔다.
타입 | 분류 | 메모리크기 | 표현 및 저장 가능 범위 |
byte | 정수 | 1byte (=8bit) | -128 ~ 127 |
short | 정수 | 2byte | -32,768 ~ 32,767 |
char | 문자 | 2byte | Unicode |
int | 정수 | 4byte | -2,147,483,648 ~ 2,147,483,647 |
long | 정수 | 8byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
float | 실수 | 4byte | -3.4E38 ~ 3.4E38 |
double | 실수 | 8byte | -1.7E308 ~ 1.7E308 |
boolean | 논리 | 1bit | true, false |
각 타입들이 표현 가능한 범위를 벗어나서 값을 저장하게 되면 오버플로우(범위초과), 언더플로우(범위미달)가 발생해서 잘못된 값이 저장될 수 있다. 자바에서는 오버플로우, 언더플로우가 발생한다고 해서 컴파일에러가 생기지 않는다.
따라서 고려해서 작성해야 한다. 그래서 알고리즘 문제를 풀 때, 이 부분을 놓쳐서 틀리는 경우가 있다.
참조타입(reference type)
참조타입은 객체의 메모리 번지를 참조한다고 해서 참조 타입이라 한다.
배열 타입, 열거 타입, 클래스, 인터페이스가 있다.
기본타입과 참조타입의 차이
- 기본타입 : 값 자체를 저장한다.
- 참조타입 : 값 자체가 아닌 객체가 생성된 메모리 번지를 저장한다.
변수는 스택이라는 메모리 영역에 저장되는데, 이때 기본타입 변수는 값을 저장하게 되고, 참조 타입 변수는 객체의 번지를 저장하게 된다. 실제 참조 타입 변수는 힙 메모리 영역에 생성된다.
그렇기 때문에 Integer타입에 200을 저장한 두 변수가 있다면 매번 새로운 객체를 생성해서 메모리 번지를 저장되기 때문에 아래와 같이 된다. ==은 주소 값을 비교하는 연산이다.
참조타입 변수 예시
Integer A = 200;
Integer C = 200;
if (A == C) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과
//false
앞서 말했듯이 ==는 주소 값 즉, 메모리 번지가 같은지 비교하는 연산이다. !=도 마찬가지이다.
두 연산을 객체 비교시 사용하게 되면 메모리 번지가 같은지 비교하는 것이 된다. 객체의 값을 비교하고 싶다면 값 자체를 비교하는 equals()를 사용해야 한다.
Integer A = 200;
Integer C = 200;
if (A.equals(C)) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과
//true
다음과 같은 경우는 B가 A와 같은 메모리 번지를 저장하기 때문에 true가 된다.
Integer A = 200;
Integer B = A;
if(A == B) {
System.out.println("true");
} else {
System.out.println("false");
}
//결과
//true
댓글