Java 는 항상 pass by value 이다!

SweetDevPotato·2023년 1월 30일
0

StackOverflow Answer

출처
StackOverflow - Is Java "pass-by-reference" or "pass-by-value"?


스택오버플로우 스크린샷

코드로 테스트

여기로 가서 아래 코드 전체를 그대로 붙여넣고 Run 버튼으로 실행

// Online Java Compiler
// Use this editor to write, compile and run your Java code online
class Foo {
    String bar;
    
    Foo(String bar) { this.bar = bar; }
    
    String getBar() { return this.bar; }
    void setBar(String bar) { this.bar = bar; }
}

class HelloWorld {
    private void changeRef1(Foo b) {
        Foo c = new Foo("barC");
        b = c;
    }
    
    private void changeRef2(Foo b) {
        b.setBar("barB");
    }
    
    public static void main(String[] args) {
        HelloWorld ex = new HelloWorld();
        
        //
        Foo a = new Foo("barA");
        System.out.println(a.getBar()); // 출력 : "barA"
        
        // 아래에 의해,
        // 참조가 없는(null) b 변수는 a 와 동일한 참조를 바라보게 된다.
        // changeRef1 메서드 내에서, b 변수가 c 와 동일한 참조를 바라보도록 변경한다.
        ex.changeRef1(a);
        // 변수 a 는 여전히 barA 인 Foo 를 바라보고 있으므로
        // 아래 출력 시, barA 가 출력된다.
        System.out.println(a.getBar()); // 출력 : "barA"
        
        // 아래에 의해,
        // 참조가 없는(null) b 변수는 a 와 동일한 참조를 바라보게 된다.
        // changeRef2 메서드 내에서, b 변수가 참조하고 있는 Foo 의 bar 값이 barA 에서 barB 로 변경된다.
        ex.changeRef2(a);
        // 변수 a 와 b 가 함께 참조하고 있는 (barA 였던) Foo 의 bar 값이 barB 로 변경되었으므로,
        // 아래 출력 시, barB 가 출력된다.
        System.out.println(a.getBar()) // 출력 : "barB"
    }
}

그림으로 이해하기

0개의 댓글