기본형 vs참조형
자바는 데이터 타입을 크게 기본형과 참조형으로 분류할 수 있다.
- 기본형(Primitive Type): int, long, double, boolean처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형이라고 한다.
- 참조형(Reference Type): Car c, Account user, Student[] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라고 한다. 참조형은 객체 또는 배열에서 사용된다.
다시 말해, 기본형은 변수에 사용할 값(숫자, true, false 등)을 직접 넣을 수 있는 타입을 기본형이라 하고 데이터에 접근하기 위한 주소를 가지고 있는 타입을 참조형이라 한다.
참조형 변수는 데이터 값에 바로 접근하는 게 아니고 값이 존재하는 참조값(주소)의 위치로 이동한다.
배열은 []을 통해 메모리 상 생성된 배열에 접근한다.
객체는 .을 통해 메모리 상 생성된 인스턴스(객체)에 접근한다.
int a = 5, b = 5;
int sum = a+b;
Account ac1 = new Account();
Account ac2 = new Account();
System.out.println(ac1+ac2);
a, b는 기본형 ac1, ac2는 참조형이다.
기본형은 실제 값을 저장하고 있어 사칙연산을 통해 바로 연산이 가능하다.
참조형은 객체주소(참조값)를 저장하고 있어 연산 기능을 수행할 시 에러가 발생한다.
System.out.println(ac1.money+ac2.money);
참조형 객체는 . 을 통해 객체에 접근 후 실제 값에 접근해 연산 기능을 수행한다.
결론
기본형을 제외한 나머지는 모두 참조형이다.
기본형은 키워드가 소문자로 시작한다.
참조형은 (객체, 배열)이 대표적이다.
참고
String은 사실 클래스이다. String은 기본형처럼 실제 값을 바로 대입할 수 있게 Java에서 편의 기능을 지원해 주는 것이다.
String은 참조형이다.
참조형 값 복사
자바는 대입 연산은 값을 복사해서 대입하는 것이다.
참조변수의 복사는 참조값(객체주소)를 복사해서 값을 넣는 것이다.
예시 코드를 보자.
public class Computer {
int modelNumber;
public static void main(String[] args) {
Computer com1 = new Computer();
Computer com2 = com1;
System.out.println("##참조값 비교##");
System.out.println(com1);
System.out.println(com2);
com1.modelNumber = 578;
System.out.println(com1.modelNumber);
System.out.println(com2.modelNumber);
com2.modelNumber = 77777;
System.out.println(com1.modelNumber);
System.out.println(com2.modelNumber);
}
}
com1과 com2는 같은 인스턴스의 객체주소(참조값)를 저장하고 있어서 두 변수는 같은 객체를 가리키는 것이다.
두 변수 중 아무나 modelNumber 멤버 변수(필드)의 값을 수정하면 객체에 있는 modelNumber가 수정된다.
두 변수는 같은 객체를 참조하고 있으므로 수정된 값이 동일한 것이다. 같은 객체 주소이기 때문.
겉으로 봤을 때는 다른 변수처럼 보여도 같은 변수라고 볼 수 있다.
'Java > OOP' 카테고리의 다른 글
절차 지향 프로그래밍VS객체 지향 프로그래밍 (1) | 2024.11.20 |
---|---|
[Java] Argument로 참조값을 보내면? (0) | 2024.11.16 |
[Java] 객체 배열 (0) | 2024.11.13 |
[Java] 객체 사용 방법 (OOP) (0) | 2024.11.11 |
[Java] 객체와 class_OOP (2) | 2024.11.10 |