값 복사와 주소 복사

자바에서 기본 타입의 변수는 값 자체가 복사되고, 참조 타입의 변수는 주소가 복사된다.

이 개념은 메소드를 호출할 때도 동일하게 적용된다.

 

값 복사

메소드의 매개변수가 기본 타입인 경우는 인자로 전달된 값이 매개변수에 복사되어 전달된다.

public class Main {
    public static void main(String[] args) {
        int firstScore = 99;
        int secondScore = 33;

        System.out.println("before(firstScore) : " + firstScore);
        System.out.println("before(secondScore) : " + secondScore);

        swapScore(firstScore, secondScore);

        System.out.println("after(firstScore) : " + firstScore);
        System.out.println("after(secondScore) : " + secondScore);
    }

    private static void swapScore(int score1, int score2) {
        int temp = score1;
        score1 = score2;
        score2 = temp;

        System.out.println("swqpScore() 에서 score1 : " + score1);
        System.out.println("swqpScore() 에서 score2 : " + score2);
    }
}

 

메소드가 호출되면서 매개변수를 통해 값이 복사되면서 main() 메소드 안에서 선언된 firstScore, secondScore 값이 swapScore() 메소드가 호출되는 순간 매개변수에 해당되는 score1, score2 변수에 복사되어 전달된다.

 

swapScore() 메소드에서 temp 변수를 이용하여 score1과 score2의 값을 교환하면 swapScore() 메소드에서는 값이 당연히 바뀌지만 main() 함수에서는 firstScore와 secodScore의 값이 바뀌지 않는다.

 

주소 복사

// 1. 클래스 선언부
public class Student {

    // 2. 멤버 변수
    public String name = "MillPRE";
    public int score = 52;
    public int firstScore;
    public int secondScore;
	
    
    // ~ 생략 ~
}
public class Main {
    public static void main(String[] args) {
        Student millpre = new Student();
        millpre.firstScore = 90;
        millpre.secondScore = 33;

        System.out.println("before(firstScore) : " + millpre.firstScore);
        System.out.println("before(secondScore) : " + millpre.secondScore);

        swapScore(millpre);

        System.out.println("after(firstScore) : " + millpre.firstScore);
        System.out.println("after(secondScore) : " + millpre.secondScore);
    }

    private static void swapScore(Student std) {
        int temp = std.firstScore;
        std.firstScore = std.secondScore;
        std.secondScore = temp;

        System.out.println("swqpScore() 에서 firstScore : " + std.firstScore);
        System.out.println("swqpScore() 에서 secondScore : " + std.secondScore);
    }
}


이전에 값 복사와는 다르게 millpre.firstScore와 millpre.secondScore 의 값이 maind에서도 바뀌는 것을 확인할 수 있다.

이는 main() 함수에서 swqpScore() 메소드를 호출할 때 millpre라는 참조변수가 참조하고 있는 Student 객체의 주소가 매개변수로 선언된 std 변수에 복사되기 때문이다.

swapScore 메소드가 호출되는 시점에 Student 객체는 millpre와 std 두 개의 참조 변수에 의해 공유되고 있는 상태가 된다.

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Getter/Setter  (0) 2023.11.02
[JAVA] 생성자  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24
[JAVA] 메소드 Method  (0) 2023.10.19

+ Recent posts