티스토리 뷰

Java

오버라이딩, Super, Super()

Alledy 2019. 5. 8. 14:50

오버라이딩(overriding)

  • def: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
  • 오버로딩과 오버라이딩은 명칭이 비슷하지만, 오버로딩은 기존에 없는 새로운 메서드를 만드는 것(new)이고 오버라이딩은 기존의 조상클래스의 메서드를 수정(modify)하는 것이다.

 

Super

  • def: 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수. this처럼, 상속받은 멤버와 자신의 클래스에 정의된 멤버 이름이 같을 때에는 super로 구별할 수 있다.

  • 예시1 : 조상클래스 변수를 super로 호출

    class SuperTest {
        public static void main(String[] args) {
            Child c = new Child();
            c.method(); 
        }
    }
    
    class Parent {
        int x = 10;
    }
    
    class Child extends Parent {
        int x = 20; 
        void method() {
            System.out.println(x);
            System.out.println(this.x);
            System.out.println(super.x);  // prints 10
    	}
    }
    

     

  • 예시2 : 조상클래스 메서드를 super로 호출

    class Point {
        int x;
        int y;
        
        String getLocation() {
            return "x: " + x + ", y: " + y; 
        }
    }
    
    class Point3D extends Point {
        int z;
        String getLocation() { // 오버라이딩
            return super.getLocation() + ", z:" + z; 
    	}
    }
    

    오버라이딩할 때에 특히 super을 써주는 것이 좋다. 이 후 조상 메서드가 변경되어라도 이가 자동적으로 자손 메서드에도 반영될 것이기 때문이다.

 

Super()

  • super()은 this()와 마찬가지로 생성자이다. super()는 조상클래스의 생성자를 호출하는 데 사용된다.

    class PointTest {
        public static void main(String args[]) {
            Point3D p3 = new Point3D(1,2,3);
        }
    }
    
    class Point {
        int x, y;
        
        Point(int x, int y) {
            this.x = x;
            this.y = y;
    	}
    	String getLocation() {
            retrun "x: " + x + ", y:" + y;
        }
    }
    
    class Point3D extends Point {
        int z;
        
        Point3D(int x, int y, int z) {
            // 컴파일러가 자동으로 super(); 추가
            this.x = x; // Error
            this.y = y; 
            this.z = z; 
    	}
    }
    

    자손클래스가 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 모두 합쳐진 하나의 인스턴스가 생성된다. 그래서 자손 클래스의 인스턴스가 조상 클래스의 멤버를 사용할 수 있는 것이다. 이 때 조상클래스 멤버의 초기화 작업이 수행되어야 하기 때문에 자손클래스의 생성자에서 조상클래스의 생성자가 호출되어야 한다.

    위 예시에서는 조상클래스 생성자를 호출하지 않았기 때문에 컴파일러가 자동으로 super()를 호출하는데, super()는 조상클래스의 기본 생성자인 Point()와 동일하다. 그런데 Point()가 정의되어 있지 않기 때문에 에러가 난다.

    이를 해결하려면 Point3D(int x, int y, int z) 첫줄에 Point(int x, int y)를 호출해주거나, 아니면 Point클래스에 Point()를 정의해줘야 한다.

    // 조상클래스의 멤버변수는 조상생성자에 의해 초기화되도록 해야 한다. 
    Point3D(int x, int y, int z) {
        super(x, y); // 조상클래스 생성자 Point(int x, int y)를 호출
        this.z = z; 
    }
    

     

  • Point3D()로 인스턴스 생성시 생성자 호출 순서

    // 생성자 호출 순서
    Point3D() => Point3D(int x, int y, int z) => Point(int x, int y) => Object()
    

     

'Java' 카테고리의 다른 글

다형성  (0) 2019.05.12
제어자  (0) 2019.05.09
클래스 상속, 포함  (0) 2019.05.07
메서드 호출  (0) 2019.05.07
참조형 매개변수, 참조형 반환  (0) 2019.05.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함