day06 Override

JTH·2023년 1월 30일
0

gb_jth

목록 보기
15/56

3. 다형성 - Override

3-1. Override 란

  • 부모 클래스가 갖고 있는 기능을 자식 클래스가 재정의
  • 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려진다.
  • 이렇게 부모의 기능을 재정의 하는 것을 메서드 Override라 한다.
  • 하나의 이름으로 다양한 효과 얻기
  • 모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여 attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.

3-2. Super 키워드

  • 클래스의 상속관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
  • 사용방법
    -> 멤버변수 이름 앞에 명시
    부모클래스의 멤버변수를 의미한다.
    하지만 부모클래스의 멤버변수는 이미 모두
    상속되어 있기때문에 이 경우에는 this키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지않는다.
	-> 메서드 이름 앞에 명시
	 - 부모 클래스의 메서드를 의미한다. 
	 - 재정의 되지 않은 메서드
		->이미 상속되어 있기 때문에
		this 키워드를 사용하는 것과 동일한 결과를 갖는다.
	 - 재정이된 메서드
		-> override된 메서드 이름앞에 사용하게 되면 재정의 되기이전의 원본메서드를 의미한다.

	class Hello{
		public void say(){
			System.out.println("Hello");
		}
	}

	class Korean extends Hello{
		public void say(){
			System.out.println("안녕하세요");
		}
		public void sayHello(){
			super.say();   //super say는 위에 부모에게서 가져오고
			this.say();     // this는 지금 윗블록에게서 가져옴
		}


	-> 키워드 자체를 메서드처럼 사용
	 - 부모클래스 의 생성자를 의미
	 - super();

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

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

3-4. 부모 생성자의 강제호출

  • 생성자가 정의된 클래스를 상속받은 경우에는 자식 클래스의 생성자를 통해서 부모 생성자를 강제로 호출해야한다.
  • 부모의 생성자를 호출하는 방법은 super키워드를 메서드 이름으로 사용하는것이다.

3-5. @Override

  • 메서드 재정의 과정에서의 오타 방지 옵션
  • @Override는 키워드가 명시된 위치 아래에 정의되는 메서드가 부모 클래스에 존재하지 않을 경우 구문 에러로 처리한다.
  • 부모 클래스의 메서드를 재정의 하고자 할 경우 , 의도치 않은 실수를 예방하기 위한 '오타방지 옵션'
  • 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야한다.
package override;


class Hello3{  // 기본생성자는 괜찮으나
	public Hello3(String name) {  //파라미터를 가진 생성자는 문제가잇다
		System.out.println(name);
	}
}
class Korean3 extends Hello3 {  //Hello3 라는 부모클래스를 상속받으려는데 객체에 오류가있다 이유는... 
	/*
	 * 부모와 동일한 파라미터를 받도록 생성자를 정의하고,
	 * 전달받은 파라미터를 부모에게 재전달 한다.
	 */
	public Korean3(String name) {  //파라미터가있는 생성자 부모클래스를 상속받아 객체를 생성한 자식클래스는 자식클래스의 생성자도 파라미터를 갖춰서 반드시 정의를 해줘야한다. 
		super(name);				// 그 후 super라는 키워드를 메소드처럼 사용해야한다.
	}
}
public class Main03 {

	public static void main(String[] args) {
			Korean3 k = new Korean3("안녕");     //Korean3 자식클래스의 생성자를 가져온것이지만 그 자식클래스의생성자도 부모클래스의 파라미터를 가진 생성자로부터 가져왔다.
	}
}

여러번보자

profile
//

0개의 댓글