기본형 vs 참조형 2

상곤·2024년 9월 20일

Java

목록 보기
9/22
post-thumbnail

변수 대입과 메서드 호출

자바에서 변수 대입과 메서드 호출은 기본형(Primitive Type)참조형(Reference Type)의 동작이 다르다. 기본형은 값을 직접 저장하고, 참조형은 객체의 메모리 주소를 저장하는 특성이 있기 때문이다.


1. 기본형과 참조형의 변수 대입

기본형 대입 방식

기본형 변수를 대입하면 값 자체가 복사되어 대입된다. 이는 대입 후 두 변수가 독립적으로 값을 유지한다는 뜻이다.

public class Main {
    public static void main(String[] args) {
        int x = 10;  // x에 10을 할당
        int y = x;   // x의 값(10)을 y에 복사
        System.out.println("초기 값: x = " + x + ", y = " + y);  // x = 10, y = 10
        
        // x의 값을 20으로 변경
        x = 20;
        System.out.println("값 변경 후: x = " + x + ", y = " + y);  // x = 20, y = 10
    }
}

참조형 대입 방식

참조형 변수를 대입하면 객체의 참조값(메모리 주소)이 복사된다. 따라서 두 변수는 같은 객체를 가리키며, 한 변수를 통해 객체의 값을 변경하면 다른 변수도 그 변화를 공유한다.

public class Main {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = c1;  // c1의 참조값이 c2로 복사됨
        c1.speed = 100;

        System.out.println(c1.speed); // 출력: 100
        System.out.println(c2.speed); // 출력: 100
    }

    // static으로 선언된 내부 클래스
    static class Car {
        int speed;
    }
}

참조형 변수는 같은 객체를 공유하게 된다.


2. 기본형과 참조형의 메서드 호출

기본형 메서드 호출

기본형을 메서드에 전달하면, 값이 복사되어 전달된다. 메서드 내에서 값을 변경해도, 호출자의 변수는 영향을 받지 않는다.

public class Main {
    public static void main(String[] args) {
        int num = 10;
        changeValue(num);
        System.out.println(num);  // 출력: 10
    }

    static void changeValue(int x) {
        x = 20;
    }
}

메서드 내부에서 x의 값이 20으로 바뀌었지만, 원래 변수 num은 그대로 10을 유지한다.
이는 값 자체가 복사되어 전달되기 때문이다.

참조형 메서드 호출

참조형을 메서드에 전달하면, 참조값이 복사되어 전달된다. 메서드 내에서 객체의 값을 변경하면, 호출자의 객체에도 그 변화가 반영된다.

class Car {
    int speed; // 자동차의 속도를 저장하는 필드
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();  // Car 객체 생성
        myCar.speed = 50;       // 초기 속도를 50으로 설정
        changeSpeed(myCar);     // myCar의 속도를 변경하는 메서드 호출
        System.out.println(myCar.speed);  // 출력: 100
    }

    static void changeSpeed(Car car) {
        car.speed = 100;  // 참조형 객체의 필드 값을 변경
    }
}

이 경우, myCar의 참조값이 메서드에 전달되어 메서드 내에서 speed 값이 변경되면, 호출자의 객체에도 그 값이 반영된다.


결론

기본형은 값 자체가 복사되어 전달되기 때문에, 메서드 내에서 값이 변경되어도 원래 변수에는 영향을 미치지 않는다.
참조형은 참조값이 복사되어 전달되기 때문에, 메서드 내에서 객체의 값이 변경되면 호출한 쪽의 객체에도 그 값이 반영된다.

profile
🫠

0개의 댓글