기본형 타입은 위 표와 같이 총 8개의 타입들이 존재한다. 자바에서 미리 형식을 정의하여 제공하고 있으며, 기본값이 존재하기 때문에 Null
개념이 존재하지 않으므로 만약 기본형 타입에 Null
을 넣고 싶다면 래퍼 클래스를 활용하면 된다.
기본형 타입은 실제 값을 저장하는 공간으로, 스택(Stack)
메모리에 저장된다.
참조형 타입은 기본형 타입을 제외한 모든 타입들을 말한다. 참조형 타입은 기본형 타입과 달리 빈 객체를 의미하는 Null
개념이 존재한다.
참조형 타입은 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로, 힙(Heap)
메모리에 저장된다.
자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입이 기본형 일 때는 기본형 값이 복사되겠지만, 참조형이면 인스턴스의 주소가 복사된다.
메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값
만 얻는다. 하지만 참조형으로 선언하면 값이 저장된 곳의 주소
를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경 하는 것도 가능하다.
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)
class Data {
int x;
}
public class Main {
public static void main(String[] args) {
Data d = new Data(); // (heap)
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) { // 기본형 매개변수 (stack)
x = 100;
System.out.println("change() : x = " + x);
}
}
출력
main() : x = 10
change() : x = 100
After change(d.x)
main() : x = 10
'd.x'의 값이 변경된 것이 아니라, change()메서드의 매개변수의 x 값이 변경된 것이다. 즉, 원본이 아닌 복사본이 변경된 것이라 원본에는 아무런 영향을 미치지 못한다. 이처럼 기본형 매개변수는 변수에 저장된 값만 읽을 수 만 있을 뿐 변경할 수는 없다. (read only)
class Data {
int x;
}
public class Main {
public static void main(String[] args) {
Data d = new Data(); // (heap)
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d);
System.out.println("After change(d)");
System.out.println("main() : x = " + d.x);
}
static void change(Data d) { // 참조형 매개변수 (heap)
d.x = 100;
System.out.println("change() : x = " + d.x);
}
}
출력
main() : x = 10
change() : x = 100
After change(d)
main() : x = 100
기본형 매개변수 예제와 달리, change메서드의 매개변수를 참조형으로 선언했기 때문에, x의 값이 아닌 주소
가 매개변수 d에 복사 되었다. 이제 main메서드의 참조변수 d와 change메서드의 참조변수 d는 같은 객체를 가리키게 된다. 그래서 매개변수 d로 x의 값을 읽는 것과 변경하는 것이 모두 가능한 것이다. (read & write)
class Data {
int x;
}
public class Main {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
Data d2 = copy(d);
System.out.println("d.x = " + d.x);
System.out.println("d2.x = " + d2.x);
}
static Data copy(Data d) {
Data tmp = new Data(); // 새로운 객체 tmp 생성한다.
tmp.x = d.x; // d.x 값을 tmp.x에 복사한다.
return tmp; // 복사한 객체의 주소를 반환한다.
}
}
반환타입이
참조형
이라는 것은 메서드가객체의 주소
를 반환한다는 것을 의미한다.