어쩌다 보니 일 수가 점점 안맞는 것 같은데,
뭐 무슨 상관인가 싶습니다.
아무튼 오늘은 수업에서는 클래스를 진행했고,
예습을 했지만 헷갈린 부분이 있어서 적어보겠습니다.
아래의 코드가 오늘 내용에서 헷갈렸던 부분입니다.
package ch06.lecture.p2method;
public class C06CallByValue {
public static void main(String[] args) {
C06Car car = new C06Car();
car.name = "tesla";
car.printName();
C06CarCenter center = new C06CarCenter();
center.changeName(car);
car.printName(); // "kia"? "tesla"?
}
}
class C06CarCenter {
void changeName(C06Car car) {
car = new C06Car();
car.name = "kia";
}
}
class C06Car {
String name;
void printName() {
System.out.println(name);
}
}
코드를 쭉 읽다보면 주석처리된 부분의 줄이
kia 로 출력될지 tesla 로 출력될지 맞히는 건데,
그냥 딱 봐도 kia로 출력될것 같이 보입니다.
왜냐면,
그 윗줄에서 center.changeName() 메소드를
호출해서 그 안에 car라는 인자값을 넣어주었고,
class C06CarCenter {
void changeName(C06Car car) {
car = new C06Car();
car.name = "kia";
}
}
뭔지 잘 모르겠지만
car.name = "kia"; 라는 줄이 있어서,
그냥 kia로 출력되겠거니~ 싶습니다.
근데 실행해보면 tesla가 출력됩니다.
이유가 뭔지 알기 위해 이것저것 실험한 결과,
class C06CarCenter 클래스 내부의
chaneName() 메소드의 매개변수는
C06Car 을 타입으로 하고,
그 타입에 해당하는 변수만 인자로 받을 수 있습니다.
그래서 메인 메소드에서
center.changeName() 을 호출했을 때,
인자값으로 준 car는
그 위에 작성한 코드들 중에서
C06Car car = new C06Car();
이라고 인스턴스를 생성한 게
오직 이거 하나기 때문에,
인자값도 car밖에 할당이 안됩니다.
만약,
C06Car car2 = new C06Car();
라는 코드가 위에 또 있었다면,
center.changeName() 의 인자값은
car2도 줄 수 있던 것입니다.
그리고 이제,
void changeName(C06Car car){
car = new C06Car();
car.name("kia");
}
이 메소드의 매개변수인 C06Car car는,
메인 메소드의 car와는 이름만 같고,
그저 인자값을 전달하기 위한 변수입니다.
(확인하는 방법은,
이 안의 car는 3개가 보이는데,
전부 asd로 바꿔도 정상 작동합니다.)
그리고 두번째 car는 인자값으로 받은
C06Car car 변수에
new C06Car() 객체를 생성해서 할당 한것입니다.
저건 마치
int[] i; -> 초기화
i = new int[123]; -> 할당
이것과 비슷한 방식입니다.
그리고 3번째 car는,
2번째 car가 메소드 내부에서 생성된
객체의 변수명이 car이기 때문에,
그걸 참조해서
그 객체가 지닌 속성인 name에
"kia" 를 할당한 것입니다.
따라서,
3번째 car 아랫줄에
System.out.println(car.name);
을 추가해서 실행해본다면
kia 가 출력됩니다.
또 만약,
changeName(C06Car car) 메소드 내부에서
객체를 새로 생성하지 않았다면,
이 car는 메인메소드에서 생성된
car를 참조하기 때문에
이것 역시도 kia로 출력됩니다.
이는 같은 변수명을 가지면
클래스보다 메소드 내부가 먼저인
우선순위 때문에 그렇습니다.
이것으로 오늘 헷갈렸던 것 정리를 마치겠습니다.
ps. 혹시 다 읽으셨는데
이해 안되시거나 제가 틀린부분이 있다면
꼭 알려주시면 감사하겠습니다!
'개발자 과정 기록 및 일기' 카테고리의 다른 글
중앙정보기술인재개발원 개발자 과정 24일차 기록입니다. (0) | 2024.03.06 |
---|---|
중앙정보기술인재개발원 개발자 과정 23일차 기록입니다. (0) | 2024.03.06 |
오늘의 기록입니다. (0) | 2024.03.03 |
오늘의 기록입니다. (0) | 2024.03.03 |
중앙정보기술인재개발원 개발자 과정 21일차 기록입니다. (0) | 2024.02.28 |