Develop Artifacts/Java

Java - 06. inheritance and polymorphism

equals를 override하면 hashCode도 해야 하는 이유 — 상속과 다형성의 계약해시맵에 객체를 넣었다. 같은 키로 조회했는데 null이 돌아온다. equals()로 비교하면 true인데. 원인은 hashCode()를 함께 override하지 않았기 때문이다.쉽게 말하면: HashMap은 객체를 넣을 때 hashCode()로 "몇 번 서랍에 넣을지"를 결정한다. 그런데 equals()는 "같은 사람이야"라고 하는데, hashCode()는 "다른 서랍 번호"를 돌려준다 — 서랍이 안 맞으니 찾을 수 없다. 이것이 equals와 hashCode의 계약 위반이다.이 현상은 다형성(polymorphism)과 동적 디스패치(dynamic dispatch)의 결과다. 이 글은 상속, override, O..

Develop Artifacts/Java

Java - 05. class and object

private 필드에 public setter를 붙이면 캡슐화가 아니다 — 클래스 설계의 함정많은 Java 튜토리얼이 "캡슐화 = 필드를 private으로 하고 getter/setter를 만드는 것"이라고 가르친다. 이 설명은 틀렸다.생각해 보자: private int balance;에 public void setBalance(int b) { this.balance = b; }를 붙였다. 외부에서 balance = -1000000을 직접 못 할 뿐, setBalance(-1000000)으로 똑같이 음수 잔액을 만들 수 있다. 비밀번호를 자물쇠로 걸어두고 열쇠를 현관에 두는 것과 같다.진짜 캡슐화는 "객체가 자신의 상태를 스스로 보호하는 것"이다. 이 글은 클래스와 객체의 생성, 접근 제어, 생성자 설계를..

Archive

'Object' 2

Develop Artifacts/Java

Java - 06. inheritance and polymorphism

equals를 override하면 hashCode도 해야 하는 이유 — 상속과 다형성의 계약해시맵에 객체를 넣었다. 같은 키로 조회했는데 null이 돌아온다. equals()로 비교하면 true인데. 원인은 hashCode()를 함께 override하지 않았기 때문이다.쉽게 말하면: HashMap은 객체를 넣을 때 hashCode()로 "몇 번 서랍에 넣을지"를 결정한다. 그런데 equals()는 "같은 사람이야"라고 하는데, hashCode()는 "다른 서랍 번호"를 돌려준다 — 서랍이 안 맞으니 찾을 수 없다. 이것이 equals와 hashCode의 계약 위반이다.이 현상은 다형성(polymorphism)과 동적 디스패치(dynamic dispatch)의 결과다. 이 글은 상속, override, O..

댓글
Develop Artifacts/Java

Java - 05. class and object

private 필드에 public setter를 붙이면 캡슐화가 아니다 — 클래스 설계의 함정많은 Java 튜토리얼이 "캡슐화 = 필드를 private으로 하고 getter/setter를 만드는 것"이라고 가르친다. 이 설명은 틀렸다.생각해 보자: private int balance;에 public void setBalance(int b) { this.balance = b; }를 붙였다. 외부에서 balance = -1000000을 직접 못 할 뿐, setBalance(-1000000)으로 똑같이 음수 잔액을 만들 수 있다. 비밀번호를 자물쇠로 걸어두고 열쇠를 현관에 두는 것과 같다.진짜 캡슐화는 "객체가 자신의 상태를 스스로 보호하는 것"이다. 이 글은 클래스와 객체의 생성, 접근 제어, 생성자 설계를..

댓글

wall

방명록

방문 흔적을 남겨주세요. 질문이나 인사 모두 환영합니다.