김영한의 실전자바 기본편을 듣고 학습내용을 정리한 글입니다.
모든 자료의 출처는 김영한 실전자바 기본편 입니다.
자바에는 데이터 타입을 크게 두 가지로 분류 할 수 있다.
기본형: int, long, double, boolean, float 등등
참조형: 객체, 배열 등에 사용된다.
(기본형이 아니면 다 참조형이라고 생각해도 될 것 이다.)
기본형은 변수를 직접 연산이 가능하다.
참조형은 변수를 직접 연산이 불가능하다.
int a =1;
int b= 2;
int sum = a+b;
//기본형인 int는 이런 계산이 가능하지만,
Car sportsCar1 = new Car();
Car sportsCar2 = new Car();
sportsCar1 + sportsCar2 //오류 발생
//배열과 객체등의 참조형은 불가능
기본형과 참조형을 비교하기전에 알아야 할 것이 있다.
자바의 대원칙
자바는 변수의 값을 복사해서 대입한다
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 변경
a = 20;
System.out.println("변경 a = 20");
System.out.println("a = " + a);
System.out.println("b = " + b);
//b 변경
b = 30;
System.out.println("변경 b = 30");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
위 코드의 값을 생각해보자.
처음 프린트 된 a, b는 10이 출력 될 것이다.
두 번째 프린트문은 a=20, b=10
세 번째 프린트문은 a=20, b=30이 출력된다.
이것은 아주 간단한 형식이다.
int b = a; 라는게 a 변수 자체를 b에 대입하는 것이 아니고 a변수안의 값을 복사해서 대입하는 것이기 때문이다.
즉,
int b = a; (a=10)
int b = 10; //와 같은 식이며, 10이라는 정수가 b에 대입 된 것
a = 20; // 또한 a 에 20을 대입해도 변수 b에는 아무런 영향을 주지않는다.
b = 30;// 변수 b에 30을 대입해도 변수 a에는 아무런 영향을 주지않는다.
참조형 예시
package ref;
public class Data {
int value;
}
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 변경
dataA.value = 30;
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
//dataB 변경
dataB.value = 320;
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
}
}
이 코드는 실행 값이 어떻게 나올까?
첫 프린트 문은 dataA를 dataB에 대입 했으니 참조값과 value 값이 같을 것이다.
그럼 두 번째 프린트 문과 세 번째 프린트문은 각각 dataA의 값과 dataB의 값이 변해서 출력값이 다를까???
아니다. 출력값은 똑같다.

Data dataA = new Data();
dataA.value = 10;
/* dataA라는 변수를 선언하고. dataA는 Data클래스를 통해서 만들어 졌기 때문에 참조형이다.
새로운 Data객체를 생성하고 dataA에 저장했다.
여기서 dataA에 저장된 것은 dataA의 참조값이다 ref.Data@2f4d3709 라는 참조값 이다*/
Data dataB = dataA;
/* 변수의 대입은 변수에 들어있는 값을 복사해서 대입한다. dataA에는 참조값 ref.Data@2f4d3709이 들어있다.
이 참조값을 복사해서 dataB에 대입한다.
dataA가 가르키는 객체를 복사하는 것이 아닌 참조값을 복사하기 때문에, dataA와 dataB는 같은 참조값인 ref.Data@2f4d3709를 가르킨다.
*/
dataA.value = 30;
System.out.println("dataA = " + dataA.value);
System.out.println("dataB = " + dataB.value);
/* 이 코드는 dataA가 가르키는 ref.Data@2f4d3709의 객체 value 값을 20으로 변경한다.
또한 dataA와 dataB는 같은 참조값인 ref.Data@2f4d3709를 가르키기 때문에 dataA와 dataB의 value는 같은 값인 20을 출력한다.*/
dataB.value = 320;
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
/*이 코드 또한 dataB가 가르키는 참조값의 객체인 value 값을 320으로 변경하였다. 그런데 dataA와 dataB는 같은 참조값을 가르키고 있기 때문에 dataA와 dataB의 value값이 같이 320으로 변경되는 것이다.