[내배캠/TIL(6/7)]동일성 비교 vs 동등성 비교

손홍서·2022년 6월 7일
1

Java

목록 보기
7/11

day32 TIL

day32 느낀점

좀 쉬다가 오니깐 공부가 더 잘되는 느낌이다.
오늘 사용하지도 않는 WAF때문에 aws 과금이 계속 되고있는 걸 발견^^
필터링을 잘못해놓고 다 삭제했다고 생각했다. 잘 확인하자~~

객체 타입 특징

  • 객체 타입은 공유 참조를 피할 수 없다! 즉, 객체 타입은 참조를 전달한다.
  • 코드 예시
int a = 10;
int b = a;//기본 타입은 값을 복사 
b = 4;

이 경우는 값을 전달하므로 b의 값을 4로 변경하여도 a의 값은 여전히 10이다.

Address a = new Address(“Old”);
Address b = a; //객체 타입은 참조를 전달 
b.setCity(“New”)

하지만 객체 타입은 참조를 전달하기 때문에 b의 city값을 "New"로 변경하면 a의 city 값도 의도하지 않았지만 "New"로 변경된다.

이러한 부작용을 원천 차단하기 위해서 객체 타입을 수정할 수 없게 만들어야한다.
즉, 객체타입을 불변 객체로 만들어야된다. 불변객체는 생성 시점 이후 절대 값을 변경할 수 없는 객체이다.
따라서 생성자로만 값을 설정하고 setter를 만들지 않거나 private으로 만들면 된다.

  • 참고: Integer와 String은 자바가 제공하는 대표적인 불변객체

동일성 비교 vs 동등성 비교

동일성 비교: 인스턴스 참조 값(reference)을 비교, ==사용
동등성 비교: 인스턴스 값(value)을 비교, equals()사용

Address a = new Address(“Old”);
Address b = new Address("Old");
System.out.println(a == b) //false
System.out.println(a.equals(b)) //true

객체타입은 ==을 사용하여 비교하면 값은 같더라도 false이다.
값이 같은 경우 true를 얻고싶으면 equals 함수를 사용하여야한다.

  • 참고 equals함수 예시
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Address address = (Address) o;
        return Objects.equals(city, address.city) && Objects.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
    }

    @Override
    public int hashCode() {
        return Objects.hash(city, street, zipcode);
    }

==으로 되어있기때문에 꼭 override 해줘야한다.

profile
Hello World!!

0개의 댓글