1. 기본형 vs 참조형
1) 기본형
- int, long, double, boolean처럼 변수에 직접 사용할 수 있는 값
- 기본형은 들어있는 값을 그대로 계산한다.
int a = 10;
int b = 20;
int sum = a+b;
2) 참조형
- 참조형: Student student1, int[] students와 같이 데이터에 접근하기 위한 참조값을 저장하는 데이터 타입
- 참조형은 객체와 배열이 있고 .(주소 연산자)를 통해서 메모리 상에 객체 접근
- 들어있는 참조값을 그대로 사용한다. 연산 불가능
Student s1 = new Student();
Student s2 = new Student();
s1 + s2
Student s1 = new Student();
s1.grade = 100;
Student s2 = new Student();
s2.grade = 90;
int sum = s1.grade + s2.grade;
(1) String
2. 기본형vs참조형-변수 대입
1) 기본형
int a = 10;
int b = a;
package ref;
public class VarChange1 {
public static void main(String[] args) {
int a = 10;
int b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
a = 20;
System.out.println("a = " + a);
System.out.println("b = " + b);
b = 30;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
(1) 분석
- 10 값은 a에 대입되고 a의 10은 b값으로 대입한다.
- a값이 변경되었을때 a값은 변경된 값으로 b는 그대로 값을 유지한다.
- b값이 변경되었을때 b값은 변경된 값으로 a는 그대로 값을 유지한다.
2) 참조형
- 변수에 들어있는 참조값을 그대로 사용한다.
- 즉, 기본형처럼 실제 사용하는 값이 아닌 사용하는 위치의 참조값을 복사하여 대입됨
Student s1 = new Student();
Student s1 = s1;
package ref;
public class VarChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
Data dataB = dataA;
System.out.println("dataA 참조값: " + dataA);
System.out.println("dataB 참조값: " + dataB);
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
dataA.value = 20;
System.out.println("변경된 dataA value: " + dataA.value);
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
dataB.value = 30;
System.out.println("변경된 dataB value: " + dataB.value);
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
}
}
- 새 데이터를 생성하여 메모리에 참조값이 부여되고 그 참조값을 Data타입의 data1 변수에 대입
- dataA의 참조값은 dataB에 복사된다.
- 즉, 두개의 인스턴스가 아닌 하나의 인스턴스가 된다.
3. 기본형vs참조형-메서드 호출
- 자바에서는 변수의 값을 대입하는 것은 변수에 있는 값을 복사해서 대입한다.
- 메서드 호출도 사용하는 매개변수(파라미터)도 변수이다.
1) 기본형
package ref;
public class MethodChange1 {
public static void main(String[] args) {
int a = 10;
System.out.println("메서드 호출 전: " + a);
changePrimitive(a);
System.out.println("메서드 호출 후: " + a);
}
static void changePrimitive(int x) {
x = 20;
}
}
- 기본형은 메서드로 데이터를 전달하면 해당 값이 복사되어 전달되지만 파라미터 값을 변경해도 호출했을 때 영향이 없다.
2) 참조형
package ref;
public class MethodChange2 {
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
changeReference(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
static void changeReference(Data dataX) {
dataX.value = 20;
}
}
- 참조형은 하나의 인스턴스로 구성되어 있기 때문에 dataA값이 변경되었다면 호출했을 때 변경된 값으로 바뀐다.