
❗해당 포스팅은 인프런에서 제공해 주는 강의 내용을 개인적으로 정리하였음을 알려드립니다.
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문
www.inflearn.com
자바는 항상 변수의 값을 복사해서 대입한다.
기본형 = 변수에 값이 들어감 (소문자로 시작하는 것들, int, long, double 등..)
참조형 = 변수에 참조(주소)가 들어감 (객체, 배열 등.. String도 참조형임)
기본형이면 변수에 들어있는 실제 사용하는 값을 복사해서 대입하고
참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.
변수 대입을 통해 기본형과 참조형의 차이점을 알아보자.
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의 값이 변경되지않고,
b를 변경한다고 a의 값이 변경되지 않는다.
a와 b 서로 아무런 영향을 주지 않음을 알 수 있다.
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 = 20;
System.out.println("변경 dataA.value = 20");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
//dataB 변경
dataB.value = 30;
System.out.println("변경 dataB.value = 30");
System.out.println("dataA.value = " + dataA.value);
System.out.println("dataB.value = " + dataB.value);
}
}
참조형에 변수를 대입하면,
dataA와 dataB는 서로 영향을 준다.
dataB에 dataA의 주소(참조값)가 복사되면 결국 dataA와 dataB는 같은 주소를 갖고 있게 된다. (같은 객체 인스턴스를 참조한다.)
그러므로 dataA.value = 20;으로 값을 바꾸게 되면 dataB.value의 값도 20이 된다.
이번에는 메서드 호출을 통해 기본형과 참조형의 차이점을 알아보자.
public class MethodChange1 {
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;
}
}
위 결과를 보면 메서드 호출 전과 후의 값이 같다.
그 이유는 int x에 a의 값이 전달되고, x의 값이 20으로 바뀌는 거지 a의 값에는 영향이 없다.
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;
}
}
참조형의 경우
dataX에 dataA의 객체 인스턴스 참조값이 복사되므로 dataX.value의 값이 바뀌면 dataA.value의 값이 바뀌는 것과 같다.
멤버 변수 : class 내 선언되는 변수(=필드)
지역 변수 : 메서드 내 선언되는 변수, 매개변수
멤버 변수 예시
public class Student {
String name;
int age;
int grade;
}
name, age, grade는 멤버 변수이다.
지역 변수 예시
public class ClassStart3 {
public static void main(String[] args) {
Student student1;
student1 = new Student();
Student student2 = new Student();
}
}
student1, student2는 지역 변수이다.
지역변수는 이름 그대로 특정 지역에서만 사용되는 변수, 메서드가 끝나면 제거된다.
멤버변수는 초기값을 입력하지 않아도 자동 초기화 되지만 지역변수는 초기값이 없으면 오류가 난다.
C 같은 과거 프로그래밍 언어는 개발자가 직접 명령어를 사용해서 인스턴스를 메모리에서 제거해야 했다.
실수로 제거가 누락되면 메모리에 사용하지 않는 객체가 쌓여서 메모지 부족 오류가 발생한다.
자바는 이런 과정을 차동 처리하고, 아무도 참조 하지 않는 인스턴스는 JVM의 가비지 컬렉션이 더 이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해준다.
'Back-end > Java' 카테고리의 다른 글
[Java] static 메서드 (1) | 2024.12.20 |
---|---|
[Java] static 변수 (0) | 2024.12.16 |
[Java] 자바 메모리 구조 (0) | 2024.12.14 |
[Java] 배열의 도입 (2) | 2024.11.27 |
[Java] 클래스의 도입 (5) | 2024.11.25 |