* 오버라이딩
- 상속받고있는 부모클래스의 메소드를 자식클래스에서 재정의하는 것
=> 부모가 제공하고있는 메소드를 자식이 일부 고쳐서 사용하겠다는 것을 의미
*오버라이딩 성립 조건
-부모클래스 메소드명과 동일
-매개변수 갯수, 자료형, 순서 동일
-부모메소드의 반환형 동일 (jdk버전 업 되면서 부모메소드 반환형의 자식 자료형들까지 가능)
-부모메소드의 접근제한자보다 같거나 커야함.
ex) 부모메소드가 protected일 경우 오버라이딩 메소드는 protected, public가능
*@Override 어노테이션
-생략가능함 , 크게 상관없음
-어노테이션 붙이는걸 권장
>> 자식메소드 기술시 오타가 있을경우 -> 오류발생
부모메소드가 변경됐을 경우 -> 오류발생
>> 단지 이 메소드가 오버라이딩 된 메소드임을 알리기 위함
@Override
public String toString() {//Object클래스의 toString메소드 오버라이딩
return "title: "+ title +", auhor: " + author +", price: " + price;
}
public class OverrideRun {
public static void main(String[] args) {
Book bk1 = new Book("자바의 정석","남궁성",30000);
Book bk2 = new Book("칭찬은 고래도 춤추게한다","고래",20000);
System.out.println(bk1.toString());
System.out.println(bk2/*toString*/);
- 출력문에 레퍼런스 변수제시할때
내부적으로 JWM이 자동으로 해당 레퍼런스 메소드.toString() 호출해서 이때 돌아온 결과를 출력
//오버라이딩 전 : object 클래스의 toString()실행 => 자료형(풀클래스명) + @ +주소값의 16진수 반환
//오버라이딩 후 : Book클래스의 toString()실행 => 해당 객체가 가지고 있는 모든 필드값을 한 문자열로 합쳐 반환
** object클래스의 equal 오버라이딩
//주소값 비교가 아닌 각각의 필드값들을 비교해서 모든 필드값이 일치하면 true/ 하나라도 틀리면 false
@Override
public boolean equals(Object obj){
// 외부에서 bk1.equals(bk3);
// bk1 bk3
// this(현객체) vs obj(전달받은 비교대상객체)
// Book타입 Object
Book other= (Book)obj;
// this vs other
if(title.equals(other.title)&& author.equals(other.author)&& price ==other.price) {
return true;
}else {
return false;
}
}
Book bk3 = new Book("자바의 정석","남궁성",30000); //bk1과 동일한 필드값 가진 bk3객체
System.out.println("bk1과 bk3가 같은 책입니까? " + (bk1 == bk3)); //false
//기본자료형간에 동등비교시에는 == 연산자 이용
//참조자료형(레퍼런스)간에 동등비교시에는 equals메소드 이용
System.out.println("bk1과 bk3가 같은 책입니까? " + bk1.equals(bk3));
//오버라이딩 전 :object 클래스의 equals()메소드 실행 => 두 주소값을 동등비교해서 반환
//오버라이딩 후 :Book클래스의 equals()메소드 실행=> 두 객체의 주소값 비교가 아닌 실제 "필드값"들이 다 같으면 true반환
//동일한 객체, 또는 중복된 객체인지 확인시 사용
**hashCode 메소드 오버라이딩
@Override
public int hashCode() {
return (title + author + price).hashCode();
// 자바의 정석남궁성30000 문자열 두개의 비교
}
//동일객체 (중복객체):실제 필드값들도 같고 (equals메소드 호출시 true), 해쉬코드값 일치할 경우
System.out.println("bk1의 해쉬코드 : "+ bk1.hashCode());
System.out.println("bk3의 해쉬코드 : "+ bk3.hashCode());
//오버라이딩 전 : Object클래스의 hashCode()메소드 실행 => 실제 "주소값"을 10진수로 계산한 결과 반환
//오버라이딩 후 : Book클래스의 hashCode()메소드 실행=> 실제 "필드값"을 가지고 10진수로 반환
'JAVA' 카테고리의 다른 글
9_2 . 다형성 _ 추상클래스/ 추상메소드 (0) | 2022.11.03 |
---|---|
9_1 .다형성 (0) | 2022.11.03 |
8. 상속 (0) | 2022.11.02 |
7. 객체 배열 (0) | 2022.10.31 |
6_8. 객체 _ 메소드 오버로딩 (0) | 2022.10.27 |