본문 바로가기

프로그래밍언어/Java

[Java 중급] 공유 참조와 사이드 이펙트

공유 참조와 사이드 이펙트


사이드 이펙트(Side Effect)는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다. 

 

b.setValue("부산");
System.out.println("b -> 부산");
System.out.println("a = " + a);
System.out.println("b = " + b);

 

=> b의 값만 변경하려고 했으나 a의 값도 변경되는 사이드 이펙트가 발생했다. 

프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용되는데, 특정 부분에서 발생한 변경이 의도치 않게 다른 부분에 영향을 미치는 경우에 발생한다. 디버깅이 어려워지고 코드의 안정성이 저하된다. 

 

사이드 이펙트의 해결 방안


사이드 이펙트는 어떻게 해결할까? 사실 처음부터 다른 객체를 생성하면 해결될 일이 아닌가?

 

 

public class RefMain1_2 {
    public static void main(String[] args) {
        //참조형 변수는 하나의 인스턴스를 공유할 수 있다.
        Address a = new Address("서울");
        Address b = new Address("서울");;
        System.out.println("a = " + a);
        System.out.println("b = " + b);

        b.setValue("부산");
        System.out.println("b -> 부산");
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
}

 

=> a와 b는 다른 인스턴스를 참조하기 때문에 의도한 결과가 나온다. 

 

여러 변수가 하나의 객체를 공유하는 것을 막을 방법은 없다. 

이전에 발생한 문제는 a, b가 객체를 공유하기 때문에 발생했다. 따라서 서로 다른 객체를 참조하면 문제가 해결한다. 

그러나 여기서 문제가 있다. 하나의 객체를 여러 변수가 공유하지 않도록 강제로 막을 수 있는 방법이 없다는 것이다. 

위의 코드는 간단하지만 실제로는 훨씬 더 복잡하게 코드가 구현되어 있다. 아래 예제를 보자 .

public class RefMain1_2 {
    public static void main(String[] args) {
        //참조형 변수는 하나의 인스턴스를 공유할 수 있다.
        Address a = new Address("서울");
        Address b = new Address("서울");;
        System.out.println("a = " + a);
        System.out.println("b = " + b);

        change(b, "부산");
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    
    private static void change(Address address, String changeAddress) {
    	address.setValue(changeAddress);
        
    }
}

=> a의 값이 변경되는 이유를 찾기 어렵다. 

 

여러 변수가 하나의 객체를 참조하는 공유 참조를 막을 수 있는 방법은 없다. 그렇다면 공유 참조가 발생하면 개발자는 어떻게 해결해야 할까? 

불변객체에 대해 알아보면서 위 문제의 해결방법을 찾아보자. 

 

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다. 

'프로그래밍언어 > Java' 카테고리의 다른 글