Override 와 Overload

devlsn96·2024년 8월 3일
0

java 언어 개념정리

목록 보기
9/27

1. Override

1-1. 오버라이드란

  • 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려진다.
  • 이렇게 부모의 기능을 재정의 하는 것을 메서드 Override라 한다.

1-2. 하나의 이름으로 다양한 효과 얻기

  • 모든 자식 클래스가 동일한 이름의 메서드를 갖게되므로 각 객체에 대하여 attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.

2. super 키워드

  • 클래스의 상속관계에서 자식클래스가 부모클래스를 가리키는 예약어

2-1. 사용방법

  • 멤버변수 이름앞에 명시
    : 부모 클래스의 멤버변수를 의미한다.
    하지만 부모클래스의 멤버변수는 이미 모두 상속되어있기 때문에, 이 경우 에는 this 키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않는다.

  • 메서드 이름앞에 명시하는 경우
    : 부모 클래스의 메서드를 의미

    • 재정의 되는 않은 메서드의 경우
      이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖는다.
    • 재정의된 메서드의 경우
      Override된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의 원본메서드를 의미한다.
  • 키워드 자체를 메서드처럼 사용
    : 부모 클래스의 생성자를 의미한다.

2-2. 상속을 통한 메서드의 기능확장 처리

  • Hello클래스가 Korean에 상속되고,
    Korean클래스가 say() 메서드를 Override 처리하게 되면
    Korean 클래스의 객체는 더 이상 부모의 say() 메서드에
    접근할 수 없게 된다.
  • 만약 부모클래스가 가진 say()메서드에 추가기능을 구현하고자 한다면,
    부모의 코드를 그대로 복사해 사용해야 할 것이다.
  • 원본기능에 대한 수정이 발생할 경우, 부모-자식 클래스 모두 수정해야 하기때문에 소스코드의 유지보수 효율성이 떨어지게 된다.
  • super 키워드는 부모 클래스의 메서드를 호출하는 기능을 가지고 있기 때문에, Override된 자식클래스의 메서드에서 super 키워드를 사용하면,
    재정의 되기 이전의 부모 클래스에 대한 메서드를 호출할 수 있다.
  • super키워드를 사용하여 부모의 메서드를 호출한 뒤에 추가적인 기능을 정의하고 있으므로 부모의 원본 메서드에 대한 기능확장 효과가 있다.

2-3. 상속관계에서의 생성자처리

  • 생성자가 정의된 클래스의 상속 제한
  • 생성자는 상속되지 않음
  • 하지만 생성자가 정의된 클래스는 객체생성을 위해
    생성자 파라미터를 반드시 전달받아야 하기 때문에
    파라미터를 갖는 생성자가 정의된 클래스를 상속받게되면
    에러가 발생한다.

어노테이션(Annotation)

  • 어노테이션은 다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석과 같은 의미를 가진다.
  • 어노테이션은 @를 사용하여 작성하며 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다.

3. @Override 옵션

  • 메서드 재정의 과정에서 오타가 발생한 경우
    부모클래스의 say() 메서드를 재정의하는 과정에서 개발자의 실수로 인해 "sai()" 라고 메서드가 추가되었다면 Java는 새로운 메서드를 추가한 것으로 인식하고, 특별한 에러표시 하지 않는다.

  • 메서드 재정의 과정에서의 오타방지옵션
    @Override는 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모클래스에 존재하지 않을 경우 구문을 애러 처리한다.

  • 부모클래스의 메서드를 재정의 하고자 할 경우
    의도치 않은 실수를 예방하기 위한 '오타 방지 옵션' 이다.

  • 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다.

4. 메서드 오버로드(Overload)

4-1. 메서드 오버로드란?

  • 원칙적으로 하나의 클래스안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만 이를 가능하게 하는 예외적 기법

4-2. 이름이 동일한 메서드 정의하기위한 조건

  • 메서드간의 파라미터가 서로 달라야한다.
    • 파라미터의 데이터타입이 다르다
      (데이터형이 동일하고 변수이름이 다른경우는 동일한 파라미터로 인식된다)
  • 파라미터 개수가 다른 경우
    서로 다른 데이터형을 갖는 파라미터들의 전달순서 다르다.
  • 리턴형이 다른 경우는 오버로드 성립에 아무런 영향을 주지 않는다.

4-3. 메서드 오버로드 예시

  • 파라미터의 데이터형이 서로 다르기 때문에 -> O

    	public void plus(int a){
    	}
    	public void plus(boolean a){
    	}
  • 파라미터 개수가 서로다르기 때문에 -> O

    	public void user(int a){
    	}
    	public void user(int a, int b){
    	}
  • 데이터형의 전달순서가 서로다르기 때문에 -> O

    	public void user(int a, boolean b){
    	}
    	public void user(boolean a, int b){
    	}
  • 오버로드 성립 불가

    	public void user(int a){

    }
    public void user(int b){
    }

4-4. 오버로드가 필요한 이유

  • 오버로드는 하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비해 놓음으로서, 메서드를 만드는 측은 번거로울 수 있지만
    메서드를 호출하는 측은 데이터 타입을 신경쓰지 않고 편리하게 사용할 수 있게 하기 위함이다

4-5. 객체생성 방법의 다양화

  • 생성자 역시 메서드의 한 종류이므로 Overload가 가능하다
  • 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체 생성하는 방법'을 다양하게 준비 할 수 있게 된다.

4-6. this 키워드를 사용한 생성자 Overload

  • this 키워드의 용법

    • 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미
  • this 키워드를 사용하여 생성자 Overload를 간결하게 처리하기

    • 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.
profile
Quantum Jump to class for java….

0개의 댓글