Daily coding

Java Basic : day 9 - Inheritance 상속 3 - Overriding 오버라이딩 본문

Language/Java_basic

Java Basic : day 9 - Inheritance 상속 3 - Overriding 오버라이딩

sunnnkim 2019. 11. 29. 17:42

오버라이딩 Overriding 

// 부모클래스

public class ParentClass {
       // 부모클래스의 메소드
       public void ParentMethod() {
              System.out.println("ParentClass ParentMethod() 호출");
       }
}

// 자식1 Jane

public class JaneClass extends ParentClass {
       // ParentClass의 ParentMethod 상속 + 오버라이딩 
       public void ParentMethod() {
              System.out.println("JaneClass ParentMethod");
       }
}

 

// 자식2 Tom 

public class TomClass extends ParentClass {
       // ParentClass의 ParentMethod 상속 + 오버라이딩 
       public void ParentMethod() {
              System.out.println("TomClass ParentMethod");
       }
       public void func() {
              System.out.println("TomClass 에만 있는 메소드");
       }
}

 

* 자식 객체의 메소드 오버라이딩


        
// 자식 객체는 부모 객체의 메소드를 상속받아 쓸 수 있으나
        // 자식 객체에서 메소드를 재정의 (오버라이딩) 해서 사용할 수 있다.
        // 자식 객체에서 메소드를 오버라이딩 한 후, 자식 객체의 인스턴스를 생성하면
        // 오버라이딩한 메소드의 결과가 출력된다.
        TomClass tc = new TomClass();
        JaneClass jc = new JaneClass();


        tc.ParentMethod();
        jc.ParentMethod();

        // 결과 출력 :
        // TomClass ParentMethod
        // JaneClass ParentMethod




      오버라이딩의 목적 : 

        하나의 인스턴스 형으로 관리를 용이하게 하기위해 사용한다.
        아래는 parentClass 와 자식이 공통으로 가지고 있는 필드와 메소드를 관리하기 용이하다.


        ParentClass p1 = new TomClass();
        ParentClass p2 = new JaneClass();


        // p1.func();
        // 위의 코드 중 p1은 자식 클래스 (TomClass) 의 인스턴스

        (자식클래스를 동적할당 받아 자식클래스의 정보를 가지고 있음) 


        // p1은 TomClass에 있는 필드와 메소드 중 ParentClass로 부터 상속받은 영역에만 접근이 가능하다

        // ( 데이터 타입이 ParentClass이기 때문에 포인터가 ParentClass로 되어있다 )
        // TomClass에서 독자적으로 선언한 메소드에는 자동으로 접근이 불가능하다
        // 부모 클래스로 데이터타입을 선언했으나 

        // 자식 클래스로 동적할당한 경우에서
        // 자식 클래스의 고유한 메소드를 사용하고 싶으면
        // 명시적으로 Type Casting(형변환)을 해주어야 한다.


        // 아래는 예시
        TomClass t1 = (TomClass) p1;
        t1.func(); // func는 TomClass에만 있는 메소드임

        // 위의 코드는 아래의 코드와 비슷하다
        Object a[] = new Object[3];
        a[0] = "배고파";
        a[1] = 1;
        a[2] = '3';
        // int sum = a[1] + 3; // 오류
        int sum = (int)a[1] + 3;
        // String str = a[0]; // 오류
        String str = (String)a[0];
        // char c = a[2]; // 오류
        char c = (char)a[2];


        // 아래의 코드도 비슷한 예시이다 
        Object o = new String("   배고파.. ");
        // String a = o; --> 오류
        // o.trim; --> 오류 (trim은 스트링 메소드이기 때문)
        String str1 = ((String)o).trim();



        TomClass tomArr[] = new TomClass[5];
        JaneClass janeArr[] = new JaneClass[5];
        // 위에는 각각 클래스를 배열로 받는 방법이다

        // 위의 방법은 각각 배열 할당 개수를 정확하게 정해야 한다.

 

 


        ParentClass parArr[] = new ParentClass[10];
        parArr[0] = new TomClass();
        // 부모클래스를 배열로 잡으면
        // 자식객체이면 모두 할당할 수 있다.




        }

}