Java

[Java] 기본형과 참조형

공대생안씨 2024. 7. 8. 11:44

1. 기본형, 참조형

  • 기본형 (Primitive Type)
    • 사용하는 값을 변수에 직접 넣음
    • int, long, double, boolean
  • 참조형 (Reference Type)
    • 객체가 저장된 메모리의 위치를 가리키는 참조값(주소)를 넣음
    • 클래스(객체), 배열, String

 

2. 기본형 vs 참조형

2-1. 전체적인 차이점

 

  기본형 참조형
이름 모두 소문자로 시작 (int, long, double … ) 클래스는 대문자로 시작 (Student, Person … )
사용자 정의 사용자가 정의 불가 클래스만 직접 정의 가능

 

2-2. 차이점 - 변수 대입

📌 자바 대원칙

"자바는 항상 변수의 값을 복사해서 대입한다"
  • 변수 대입
  기본형 참조형
변수 대입 변수에 들어있는 실제 값을 복사해서 대입 변수에 들어있는 참조값을 복사해서 대입
Student student1 = new Student();
student1.name = "학생1";

Student student2 = student1;

System.out.println("student1 참조값 = " + student1);
System.out.println("student2 참조값 = " + student2);

/* 실행결과
student1 참조값 = week2.ch2_3.Student@a09ee92
student2 참조값 = week2.ch2_3.Student@a09ee92
*/

📌 student1의 참조값을 복사해서 student2에 대입한 것을 확인!

 

  • 데이터 변경
Student student1 = new Student();
student1.name = "학생1";

Student student2 = student1;

student1.name = "변경학생";

System.out.println("student1.name = " + student1.name);
System.out.println("student2.name = " + student2.name);

/* 실행결과
student1.name = 변경학생
student2.name = 변경학생
*/

📌 student1과 student2의 참조값이 동일하므로 name 필드가 동일하게 변경됨을 확인!

 

2-3. 차이점 - 메서드 호출

  • 매개변수
    • 매개변수 또한 변수일 뿐
    • 따라서 메서드 호출 시 매개변수에 값을 전달하는 것도 값을 복사해서 전달하는 것!
  • 기본형과 메서드 호출
public static void main(String[] args) {
	int a = 10;
	System.out.println("메서드 호출 전 : a = " + a);
	changePrimitive(a);
	System.out.println("메서드 호출 후 : a = " + a);
}

static void changePrimitive(int x) {
	x = 20;
}

/* 실행결과
메서드 호출 전 : a = 10
메서드 호출 후 : a = 10
*/

=> 매개변수에 값 전달 : 값을 복사해서 대입함 ( int x = a 라고 생각 가능!)

 

  • 참조형과 메서드 호출
public static void main(String[] args) {
	Data dataA = new Data();
	dataA.value = 10;
	System.out.println("메서드 호출 전 : dataA.value = " + dataA.value);
	changePrimitive(dataA);
	System.out.println("메서드 호출 후 : dataA.value = " + dataA.value);
}

static void changePrimitive(Data dataX) {
	dataX.value = 20;
}

/* 실행결과
메서드 호출 전 : dataA.value = 10
메서드 호출 후 : dataA.value = 20
*/

=> 매개변수에 값 전달 : 참조값을 복사해서 대입함 (dataX = x001(dataA의 참조값) 라고 생각 가능!)

 

자바에서 메서드의 매개변수 => 항상 값에 의해 전달됨!

값이 실제 값이냐, 참조값이냐에 따라 다름
  • 기본형 : 매개변수에 실제 값이 복사되어 대입(전달)
    ⇒ 메서드 내부에서 매개변수 값을 변경해도 호출자의 값에는 영향 없음!
  • 참조형 : 매개변수에 참조값이 복사되어 대입(전달)
    ⇒ 메서드 내부에서 매개변수로 전달된 객체의 멤버변수 변경하면 호출자의 객체도 변경됨!