Published 2022. 11. 2. 16:17

* 오버라이딩

- 상속받고있는 부모클래스의 메소드를 자식클래스에서 재정의하는 것 
 => 부모가 제공하고있는 메소드를 자식이 일부 고쳐서 사용하겠다는 것을 의미
 
 *오버라이딩 성립 조건

-부모클래스 메소드명과 동일 
-매개변수 갯수, 자료형, 순서 동일
-부모메소드의 반환형 동일 (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
복사했습니다!