어려울 거 같아서 미뤄뒀던 프로그래밍 공부 이번에 숨 딱 참고 Java 다이브 💦


💡 오버라이드

📎 다형성을 구현하기 위한 Override

  • 육군(Army), 해군(Navy), 공군(Airforce) 은 Unit이라는 클래스를 통하여 공통 속성을 정의하고 있어요.
  • 공통속성 : 이름(멤버변수 및 getter, setter), 공격(attack() 메서드)
  • attack은 모두 같은 이름이지만 다른 동작을 수행해야하는 필요성있어요. : 모든 군대는 '공격' 이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이 서로 다르게 처리되어야돼요.

    이렇게 부모클래스가 갖고 있는 기능을 자식 클래스가 재정의 하도록 하는 것을 오버라이드라고 해요.

📎 오버라이드 하는 방법

  • 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려져요.
  • 이렇게 부모의 기능을 재정의 하는 것을 메서드 Override라고 해요.
  • 하나의 이름으로 다양한 효과 얻을 수 있어요. : 모든 자식클래스가 동일한 이름의 메서드를 갖게 되므로 각 객체에 대하여 attack()이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 돼요.
  class Hello{
      public void say() {
          System.out.println("Hello");
      }
  }

  class English extends Hello{ }

  class Korean extends Hello{

      public void say() { 
          // 부모클래스 Hello에 정의되어있는 say() 메서드를 재정의 
          // => 오버라이드(Override)
          System.out.println("안녕하세요");
      }

  }

  public class Main03 {

      public static void main(String[] args) {
          English e = new English();
          e.say(); // 자식 클래스에 구현된 메서드가 없기 때문에, 
                   // 부모 클래스에 정의된 메서드를 찾아가게 된다.

          Korean k = new Korean();
          k.say();  // 자식 클래스가 부모와 같은 이름의 메서드를 정의하고 있기 때문에,
                    // k 객체에게는 부모 클래스가 정의하고 있는 say()메서드가 가려지게 된다.
      }

  }
  



💡 super

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

📎 사용방법

⚫️ 멤버변수 이름 앞에 명시

  • 부모클래스의 멤버변수를 의미해요. 하지만 부모클래스의 멤버변수는 이미 모두 상속되어 있기 때문에 이 경우에는 this 키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않아요.
   class User{
      private int age;

      public int getAge(){
          return age;
      }
      public void setAge( int age ){
          this.age = age;
      }
   }

   class A extends User{
      public void print( int age ){
      		//  super.age는 부모클래스인 User의 멤버변수 age를 뜻한다. 
          super.age = age;           
      }
   }

   class B extends User{
      public void print( int age ){
      		//  this.age는 부모클래스인 User의 멤버변수 age를 뜻한다. 
          this.age = age;
      }
   }

⚫️ 메서드 이름 앞에 명시

  • 부모 클래스의 메서드를 의미해요.
  • 재정의 되지 않은 메서드 : 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖어요.
   class Calc{
      public void plus(int x, int y){
      	System.out.println(x + y);
      }
   }

   class A extends Calc{
   	  public void plus(int x, int y){
      	super.plus();
      }
   }

   class B extends Calc{
      public void plus(int x, int y){
      	this.plus();
      }
   }
  • 재정의된 메서드 : Override된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의 원본 메서드를 의미해요.
   class Hello{
      public void say(){
      	System.out.println("Hello");
      }
   }

   class Korean extends Hello{
      // Korean 클래스에 의해 say()메서드가 Override 된 경우
      public void say() { 
          super.say(); // 부모 클래스에 say()의 원본 메서드를 의미
          System.out.println("안녕하세요."); // 부모 클래스에 say()를 오버라이드 하여 재구현
      }

      public void sayHello() {
          super.say(); // 부모클래스(Hello)의 say() 호출
          this.say(); // 나 자신(Korean)의 say()호출 
	}
}

⚫️ 키워드 자체를 메서드처럼 사용

  • 부모 클래스의 생성자를 의미한다.
  class Hello{
      Hello(){
      	... 
      }
  }

  class Korean extends Hello{
      Korean() {
          super(); // 부모 클래스의 생성자 Hello(){}를 의미
      }
  }

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

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

부모 생성자의 강제 호출

  • 생성자가 정의된 클래스를 상속받은 경우에는 자식클래스의 생성자를 통해서 부모 생성자를 강제로 호출해야 해요.
  • 부모의 생성자를 호출하는 방법은 super 키워드를 메서드 이름으로 사용하면 돼요.
  class Hello{
      Hello( String input ){
      	System.out.println(input);
      }
  }

  class Korean extends Hello{
       // 파라미터가 없으므로 에러
       //Korean() {
       //   super(); 
       //}
      Korean( String input ) {
      	  //super 키워드를 사용하여 부모의 생성자 강제 호출
          super(input); 
      }
  }



💡 메서드 재정의 과정에서 오타가 발생한 경우

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

메서드 재정의 과정에서의 오타 방지 옵션

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

    (1) 자바 어노테이션(Java Annotation) : 자바 소스 코드 사이에 @ 기호를 앞에 붙여서 사용하는 주석이다.

	class Hello{
    	public void say(){
        	System.out.println("Hello");
        }
    }
    
    class korean extends Hello{
    	@Override
    	public void say(){
        	System.out.println("안녕하세요.");
        }
    }



다음 다이브에서 또 만나요 🌊




출처
https://media.giphy.com/media/l2Je1bFuOpkNpyqYM/giphy.gif
https://media.giphy.com/media/Jbb3KS22397YQ/giphy.gif

0개의 댓글