오버라이딩

생성일: 2021년 9월 7일 오후 4:07
태그: 발표자료, 자바스터디

오버라이딩의 조건

오버라이딩을 사용하기 위해서는 조건이 존재한다.

자식클래스와 부모클래스의 오버라이딩하는 메서드와

  • 이름이 같아야한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야한다.

결국 오버로딩과 달리 선언부는 부모클래스와 일치해야한다라는 것을 볼 수 있다.

하지만 접근제한자와 예외는 제한된 조건 하 다르게 변경이 가능하다.

제한된 조건들

  1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
  2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
  3. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 있다.

첫번째 조건은, 에서의 접근제어자의 범위를 좁은것 부터 나열한다면

public → protected → (default) → private 순이다.

만약, 부모 메서드가 private라면 자식 메서드는 public 으로 변경하여 오버라이드 할 수 있다.

두번째 조건은, 말그대로 조상 클래스 메서드의 예외보다 자식 클래스 메서드의 예외가 더 작아야만 한다. 근데 갯수가 문제가 아니다. 개수가 작아야한다고는 명시하지 않았다.

class Child extends Parent {
    void method() throws Exception{
        /....
    }
}

이러한 메서드는 오류가 난다. 왜냐하면 Exception모든 종류의 예외를 포함한다.

예외의 최고봉 👍이다 그렇기 때문에 잘못된 오버라이딩 이다.

오버로딩 vs 오버라이딩

오버로딩오버라이딩은 이름부터 비슷해서 자주 헷갈리는 개념이다.

오버라이딩의 조건

오버라이딩을 사용하기 위해서는 조건이 존재한다.

자식클래스와 부모클래스의 오버라이딩하는 메서드와

  • 이름이 같아야한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야한다.

결국 오버로딩과 달리 선언부는 부모클래스와 일치해야한다라는 것을 볼 수 있다.

하지만 접근제한자와 예외는 제한된 조건 하 다르게 변경이 가능하다.

제한된 조건들

  1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
  2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
  3. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 있다.

첫번째 조건은, 에서의 접근제어자의 범위를 좁은것 부터 나열한다면

public → protected → (default) → private 순이다.

만약, 부모 메서드가 private라면 자식 메서드는 public 으로 변경하여 오버라이드 할 수 있다.

두번째 조건은, 말그대로 조상 클래스 메서드의 예외보다 자식 클래스 메서드의 예외가 더 작아야만 한다. 근데 갯수가 문제가 아니다. 개수가 작아야한다고는 명시하지 않았다.

class Child extends Parent {
    void method() throws Exception{
        /....
    }
}

이러한 메서드는 오류가 난다. 왜냐하면 Exception모든 종류의 예외를 포함한다.

예외의 최고봉 👍이다 그렇기 때문에 잘못된 오버라이딩 이다.

오버로딩 vs 오버라이딩

오버로딩오버라이딩은 이름부터 비슷해서 자주 헷갈리는 개념이다.

오버로딩이란 기존에 없는 새로운 메서드를 정의하는 것이다. (새로만듦)
오버라이딩이란 상속받은 메서드의 내용을 변경하는 것이다. (변경, 수정)

만약, 매개변수의 종류가 다르다 라고 하면 오버로딩일 가능성이 크다.

Super & Super()

super은 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.

this는 자기 자신을 가리키듯 super는 부모클래스를 가리킨다.

superthis는 닮은 점이 많다. 근본적으로는 다른 값을 가르키지만 쓰임이 비슷하다.

class Parent{
    int x = 1;
}

class Child extends Parent{

    int x = 2;    

    void printX(){
        System.out.println("x =" + x); // 2가 출력된다
        System.out.println("this.x =" + this.x); // 2가 출력된다.
        System.out.println("super.x =" + this.x); // 부모의 값인 1이 출력된다.
    } 
}

또한, 변수 뿐만이 아니라 부모의 메서드를 호출할때도 super가 사용된다.

superthis와 닮은 점이 많다고 했다 . this()는 생성자를 다시 호출할 때 사용했듯이

부모 클래스의 생성자를 호출할때 super()가 사용된다.

super()는 특징이 있다.

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 , this() , super()를 쓰지 않으면 컴파일러가 자동적으로 super();를 생성자의 첫줄에 추가한다.

그래서 만약 자식 클래스의 부모클래스의 생성자가 없고 특별히 다른것을 명시해주지 않으면 오류가 난다.

class Parent{
    int x;
    int y;
}

class Child extends Parent{
    int z;
    Child(int x, int y, int z){
        // 명시를 안했기 때문에 자동으로 컴파일러가 **super();** 가 들어감
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

위와 같은 코딩을 하면 오류가 나게된다.

그렇기 때문에 상속관계에서는 어떤 생성자를 사용할것이지 명시해 두는것이 중요하다.

이렇게 복잡하게 쌓였을 때 생성자의 호출순서가 어려울수가 있다.

생성자의 호출 순서는 다음과 같다.

자식 생성자 → 부모 생성자 → Object()

Reference

  • 자바의 정석

'Java > Java' 카테고리의 다른 글

[Java/Study] 제어자  (0) 2021.09.09
[Java/Study] Package 와 Import 및 터미널로 자바 실행방법  (0) 2021.09.08
[Java/Study] 상속  (0) 2021.09.07
[Java/Study] 생성자  (0) 2021.09.07
[Java/Study] 변수와 메서드  (0) 2021.09.07

+ Recent posts