Early Binding과 Late Binding은 성능에서 어떤 차이가 나는가? 실제로는 어떻게 사용하는가? 알게 모르게 당연하게 사용하고 있는 다형적 메서드는 무엇이 있을까?
final
키워드를 달면, 이른 바인딩으로 처리할 수 있다."더이상 수정할 수 없어. 그대로 가져다 사용해"
final에 어긋나는 코드를 작성하면 모두 컴파일 오류
public final int MAX_STUDENT = 10
public void save(final Person person) {
person = new Person();
entityManager.persist(person);
}
final
을 붙인다.Object
에 있다.Object
에서 상속받는다.Object
에 있는 메서드들은 어떤 클래스에서도 오버라이딩이 가능하다.getClass().getName() + '@' + Integer.toHexString(hashCode())
hashCode()
는 뒤에서 알아보자.this == obj
)Person person0 = new Person("wansik", "choi");
Person person1 = new Person("wansik", "choi");
Person person2 = person0;
System.out.println(person0.equals(person1)); // false
System.out.println(person0.equals(person2)); // true
hashCode()
도 반드시 같이 오버라이딩해야 한다.public boolean equals(Object obj) {
if (obj == this) { // 아예 주소가 같은 경우
return true;
}
if (obj == null || !(obj instanceof Person)) { // null || Person이 아닌 경우 - 사실 여기에 hashCode도 있어야 함
return false;
}
Person p = (Person) obj;
return this.firstName.equals(p.firstName) && this.lastName.equals(p.lastName); // 내용 비교
}
Person person0 = new Person("wansik", "choi");
Person person1 = new Person("wansik", "choi");
Person person2 = person0;
System.out.println(person0.equals(person1)); // true
System.out.println(person0.equals(person2)); // true
equals()
를 오버라이드했다면 이녀석도 챙겨주어야 완벽한 것.HashMap
에서 사용하려고.equals()
와 pair로 구현해주어야 함public int hashCode() {
return this.firstNAme.hashCode() ^ (this.lastName.hashCode() << 16); // XOR, Shift 사용
}
public boolean equals(Object obj) {
if (obj == this) { // 아예 주소가 같은 경우
return true;
}
if (obj == null || !(obj instanceof Person || this.hashCode() != obj.hashCode())) { // null || Person이 아닌 경우 || HashCode가 다른 경우
return false;
}
Person p = (Person) obj;
return this.firstName.equals(p.firstName) && this.lastName.equals(p.lastName); // 내용 비교
}
Person person0 = new Person("wansik", "choi");
Person person1 = new Person("wansik", "choi");
Person person2 = person0;
System.out.println(person0.equals(person1)); // true
System.out.println(person0.equals(person2)); // true
HashSet<Person> people = new HashSet<>();
people.add(person0)
System.out.println(people.contains(person0)); // true : 주소가 같음
System.out.println(people.contains(person1)); // true : 내용이 같음
equals()
에 hashCode()
까지 반영된 버전이다.