방어적 복사, 동일성, 동등성

1 분 소요

방어적 복사

public class Person {
    private List<Food> favoriteFoods;

    public Person(List<Food> favoriteFoods) {
        this.favoriteFoods = favoriteFoods;
    }

	public List<Food> getFavoriteFoods() {
		// return favoriteFoods; 원본의 참조를 그대로 반환하는 기존 코드.
		return new ArrayList<>(this.favoriteFoods); // 방어적 복사로 새로운 객체 생성.
	}
}

원본과 동등한 새로운 객체를 만들어 원본 데이터의 참조와 동일하지 않은 새로운 객체를 생성하여 반환하는 것이다. 이를 통해 원본 객체의 상태가 외부에서 변경되는 것을 방지하고 객체의 무결성을 유지할 수 있다.

getFavoriteFoods() 메서드를 호출하면 방어적 복사를 하여 원본의 참조와 동일하지 않은 새로운 참조를 지닌 동등한 값을 지닌 객체를 반환한다. 이렇게 되면 외부에서 getter를 호출하여 얻은 객체를 수정해도 원본 객체의 무결성을 유지할 수 있다.

  • 장점 : 가변적인 상태를 유지하면서도 클래스의 상태를 안전하게 보호할 수 있다. 따라서 상태가 자주 변화하는 클래스에서 유용하게 사용할 수 있다.
  • 단점 : 메모리 사용량이 증가하고, 성능이 저하될 수 있다. 각 getter 호출 시마다 새로운 객체를 생성하므로, 메모리와 CPU 시간을 추가로 사용.
  • 적합한 사용 경우 : 상태가 자주 변화하거나, 큰 데이터 구조를 가지고 있는 클래스에서 사용.
String str1 = new String("Hello");
String str2 = str1;
System.out.println(str1 == str2); // true
  • 동일성(Identity): 동일성은 두 객체가 같은 메모리 주소를 참조하고 있는지를 말한다. 즉, 두 참조가 실제로 같은 객체를 가리키고 있을 때, 그 두 객체는 동일하다고 말한다. Java에서는 두 참조를 == 연산자를 사용하여 동일성을 검사한다.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true
// 'new String("Hello")'를 통해 생성된 두 객체는
// 서로 다른 메모리 주소를 참조하므로 동일하지 않지만, 그 내용이 같으므로 동등하다.
  • 동등성(Equality): 동등성은 두 객체가 논리적으로 같은지를 말한다. 두 객체가 서로 다른 메모리 주소를 참조하더라도 그 내용이 같다면, 그 두 객체는 동등하다고 말한다. Java에서는 equals()를 사용하여 두 객체의 동등성을 검사한다.

댓글남기기