[개체지향] 다형성
다형성
- 어떤 개체가 다양한 형태로 변할 수 있는 능력
public class Sloth extends Animal{
public void shout(){
...
super.shout();
}
}
장점
- 캡슐화도 상승
- 유지 보수성 상승
- 새로운 클래스를 추가할 때 클래스 코드만 추가하면 됨
- 클라이언트가 작성할 코드가 줄어듦
늦은 바인딩 vs 이른 바인딩
- 다형적인 메서드는 실행중에 알 수 있음 late binding
- 이른 바인딩 : 컴파일 시간에 알 수 있음
- C에서 함수 포인터는 늦은 바인딩
C에 없는 기능은 하드웨어에 없다.
- 컴파일러와 jvm이 함수 포인터 같은 걸 대신 전달해주는게 전부
성능
- 이른바인딩이 cpu 최적화가 더 잘 될 가능성이 높음
- 자바에서도 이른 바인딩이 가능
public final int getHeight(){
...
}
public final class BsketballPlayer extends Athlete{
...
}
- cpp은 기본적으로 가상함수사용을 위해서는 따로 지정을 해줌
- C#,java는 모두 기본적으로 가상함수로 작동함
- class앞에 붙으면 더이상 상속못함
베스트 프랙티스 final은 기본적으로 붙인다.
Object class , toString()
- 자바의 모든 클래스는 Object로부터 상속을 받음
- 어떤 클래스에서도 Object메서드를 오버라이딩 할 수 있음
toString
- 사람이 읽기 편하게 해당 개체를 문자열로 표현
- 기본구현: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
equals()
- 오버라이딩 안할시 단순한 주소 비교: this == obj
- 실제 개체 속의 데이터를 일일이 비교하지 않음
- hashcode도 반드시 같이 오버라이딩해야함
public boolean equals(Object obj){
if(obj == this){
return true;
}
if(obj == null || !(obj instancof Person)){
return false;
}
Person p = (Person) obj;
return this.firstName.equals(p.firstName) && this.lastName.equals(p.lastName)
}
//많이 실수 할 수 있음
hashCode()
- 어떤 개체를 대표하는 해시값을 32비트 정수로 반환
- 동치인 두 개체는 해시값이 같음
- 동치가 아닌 두 개체도 해시값이 같을 수 있음
- Object 클래스안의기본 구현 : 개체의 주소를 반환
- 존재이유 : java가 제공하는 HashMap 클래스에서 사용하려고
- 빠른비교용으로 사용가능 : 같지 않음만 빠르게 판단가능
public int hashCode(){
return this.firstName.hashCode() ^ (this.lastName.hashCode() << 16);
}
public int hashCode(){
return this.x * 31 + this.y;
}
public int hashCode(){
int hash = 17;
hash = hash * 31 + this.p1.hashCode();
hash = hash * 31 + this.p2.hashCode();
return hash
}
hashCode를 구현하는 보편적인 방법은 없음 구글에 hashcode best practice로 검색해 볼 것