Override

9mond·2023년 7월 10일
0
post-thumbnail
post-custom-banner

1. 다형성을 구현하기 위한 Override

  • 예) 게임구현

    • 육군(Army), 해군(Navy), 공군(AirForce)
    • Unit이라는 클래스를 통해서 공통 속성을 정의한다.
      -> 이름(멤버변수, getter, setter), 공격(attack())
    • 같은 이름이지만 다른 동작을 수행해야 하는 필요성
      -> 모든 군대는 '공격'이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야 한다.
    • 부모 클래스가 갖고 있는 기능을 자식 클래스가 재정의
      -> 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려진다.
      -> 이렇게 부모의 기능을 재정의 하는 것메서드 Override라고 한다.
	public class Unit {
	private String name;
	
	public Unit(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void attack() {
		System.out.println(this.name + " >> 공격 준비");
	}
}
    
    public class Army extends Unit{
	public Army(String name) {
		super(name);
	}
	public void tank() {
		System.out.println(super.getName() + " >> 탱크공격");
	}
	// Override 된 메서드
	// @ : 언오테이션
	@Override
	public void attack() {
		super.attack();
		System.out.println(super.getName() + " >> 지상공격 실행함");
	}
}
    
    public class Navy extends Unit{
	public Navy(String name) {
		super(name);
	}
	@Override
	public void attack() {
		super.attack();
		System.out.println(this.getName() + " >> 어뢰발사");
		System.out.println(this.getName() + " >> 지상상륙");
	}
	// nucleus()
	public void nucleus() {
		System.out.println(this.getName() + " >> 핵공격");
	}
}
    
    public class AirForce extends Unit {
	public AirForce(String name) {
		super(name);
	}
	@Override
	public void attack() {
		super.attack();
		System.out.println(this.getName() + " >> 이륙");
		System.out.println(this.getName() + " >> 공중공격 실행함");
	}
	// bombing()
	public void bombing() {
		System.out.println(this.getName() + " >> 폭격");
	}
}
    
    public class Main02 {
	public static void main(String[] args) {
		Army am = new Army("육군");
		am.attack();
		am.tank();
		
		// Navy
		Navy nv = new Navy("헤군");
		nv.attack();
		nv.nucleus();

		// AirForce
		AirForce af = new AirForce("공군");
		af.attack();
		af.bombing();
	}
}
결과:	육군 >> 공격 준비
		육군 >> 지상공격 실행함
		육군 >> 탱크공격
		해군 >> 공격 준비
		해군>> 어뢰발사
		해군>> 지상 상륙
		해군>> 핵미사일
		공군 >> 공격 준비
		공군 >> 이륙
		공군 >> 공중공격 실행함
		공군 >> 폭격

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

  • 모든 자식 클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여 attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다.
    • 기술면접에서 많이 물어봄. Override는 무엇인가?, Override와 Overlode의 차이점은?

1-2. super 키워드

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

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

    -> 메서드 이름 앞에 명시
    : 부모 클래스의 메서드를 의미한다.
    재정의 되지 않은 메서드 -> 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖는다.
    재정의된 메서드 -> Override 된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의 원본 메서드를 의미한다.

    -> 키워드 자체를 메서드처럼 사용
    : super()
    부모 클래스의 생성자를 의미한다.
    super(x, y)

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

	public class Korean extends Hello {
	public void say() {
		System.out.println("안녕하세요");
	}
	public void sayHello() {
		super.say();
		this.say();
	}
}

	public class Main01 {
	public static void main(String[] args) {
		Korean k = new Korean();
		k.sayHello();
	}
}

1-3. 생성자가 정의된 클래스의 상속 제한

  • 생성자는 상속되지 않는다.
  • 하지만 생성자가 정의된 클래스는 객체 생성을 위해서 생성자 파라미터를 반드시 전달받아야 하기 때문에, 파라미터를 갖는 생성자가 정의된 클래스를 상속 받게 되면 에러가 발생한다.
  • 부모 생성자의 강제 호출
    -> 생성자가 정의된 클래스를 상속받은 경우 자식 클래스의 생성자를 통해서 부모 생성자를 강제로 호출해야 한다.
    -> 부모의 생성자를 호출하는 방법은 super 키워드메서드 이름으로 사용하는 것이다,
    -> 부모와 동일한 파라미터를 받도록 생성자를 정의하고, 전달받은 파라미터를 부모에게 재전달 한다.
	// 부모 클래스
public class Hello2 {
	Hello2(	String msg){
		System.out.println(msg);
	}
    
    // 자식 클래스
public class Korean2 extends Hello2{
	/*
	 *  부모 생성자의 강제 호출
	 *   - 생성자가 정의된 클래스를 상속받은 경우 자식 클래스의 생성자를 통해서
     *		부모 생성자를 강제로 호출해야 한다.
	 *   - 부모의 생성자를 호출하는 방법은 super 키워드를 메서드 이름으로 사용하는 것이다,
	 *   - 부모와 동일한 파라미터를 받도록 생성자를 정의하고, 전달받은 파라미터를 부모에게 재전달 한다.
	 */
	public Korean2( String msg) {
		super(msg);
	}
}

1-4. @Override

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

1-5. 자바 최상위 클래스

  • Object 클래스
  • Java가 자동으로 extends Object를 하고 있음
  • 그래서 Create getters and setters 했을 때 super();가 나왔던 것
profile
개발자
post-custom-banner

0개의 댓글