개발자 과정 기록 및 일기

중앙정보기술인재개발원 개발자 과정 22일차 기록입니다.

킹갓왕동현 2024. 3. 4. 23:47

어쩌다 보니 일 수가 점점 안맞는 것 같은데,

뭐 무슨 상관인가 싶습니다.

 

아무튼 오늘은 수업에서는 클래스를 진행했고,

예습을 했지만 헷갈린 부분이 있어서 적어보겠습니다.

 

아래의 코드가 오늘 내용에서 헷갈렸던 부분입니다.

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. 혹시 다 읽으셨는데

이해 안되시거나 제가 틀린부분이 있다면

꼭 알려주시면 감사하겠습니다!