본문 바로가기

IT일반과목/java

메소드 재정의(상속에서 super과 this)

부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수 있다. 이 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야 한다. 자바는 이런 경우를 위해 메소드 오버라이딩 기능을 제공한다.


메소드 재정의(@Override)

메소드 오버라딩은 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재정의하는 것을 말한다.

이럴경우 메소드가 오버라이딩 되면 부모객체의 메소드는 숨겨지기때문에, 자식객체에서 메소드를 호출하면 무조건 자식메소드가 호출된다.


메소드 오버라이딩 할때의 규칙

1. 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개변수 리스트)를 가져야 한다.

2. 접근 제한을 더 강하게 오버라이딩 할 수 없다.

3. 새로운 예외(Exception)를 throw할 수 없다.(예외는 나중에 공부하자.)


접근제한을 더 강하게 오버라이딩 할 수 없다는 것은 부모메소드가 public을 가지고 있을경우 자식메소드는 default나 private 접근제한으로 수정할수 없다는 것이다.



package jongkyu.calculator;


import java.util.Scanner;


public class main {


public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("반지름 값 입력 :");

int r=sc.nextInt();


Calculator c = new Calculator();

System.out.println("원면적 : " + c.areaCircle(r));

System.out.println();

Computer d = new Computer();

System.out.println("원면적 : "+ d.areaCircle(r));

}

}


----------------------------------------------------------------------------------------------------

package jongkyu.calculator;

public class Computer extends Calculator {
@Override
public double areaCircle(double r) {
// TODO Auto-generated method stub
System.out.println("Computer 객체의 arearCircle() 실행");
return Math.PI * r *r ;
}
}

--------------------------------------------------------------------------------------------------
package jongkyu.calculator;

public class Calculator {
public double areaCircle(double r) {
System.out.println("Calculator 객체의 arearCircle() 실행");
return 3.14159*r*r;
}
}
-------------------------------------------------------------------------------------------------
이거일경우 두개를 다 호출해서 사용해 보았다.



====================================================================================
=====================================================================================
=====================================================================================
자바 클래스에서 부모 클래스의 메소드를 오버라이딩 하게 되면, 부모클래스의 메소드는 숨겨지고 오버라이딩 된 자식 메소드만 사용한다. 그러나 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super 키워드를 붙여서 부모 메소드를 호출할 수 있다. super은 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.
ex) 예시

---------------------------------------------------------------------------------------------------------
package jongkyu.airplane;

public class Airplane {
public void land() {
System.out.println("착륙합니다.");
}
public void fly() {
System.out.println("일반비행합니다.");
}
public void takeOff() {
System.out.println("이륙합니다.");
}
}

----------------------------------------------------------------------------------------------------------

package jongkyu.airplane;


public class SupersonicAirplane extends Airplane{

public static final int NORMAL = 1;

public static final int SUPERSONIC = 2;


public int flyMode = NORMAL;


public void fly() {

if(flyMode==SUPERSONIC) {

System.out.println("초음속비행입니다.");

}else {

//Airpanle 객체의 fly() 메소드 호출

super.fly();

}


}

}


--------------------------------------------------------------------------------------------------------
package jongkyu.airplane;

public class main {
public static void main(String[] args) {
SupersonicAirplane s = new SupersonicAirplane();
s.takeOff();//부모클래스에서 갖고옴 ->이륙합니다.
s.fly();//자식클래스에서 else일경우를 갖고옴 ->일반비행합니다.
s.flyMode = SupersonicAirplane.SUPERSONIC;
//자식클래스에서 flyMode값을 바꿔줌.
s.fly();//값이 바껴서 초음속 비행입니다로 문구가 뜸.
s.flyMode = SupersonicAirplane.NORMAL;//다시 원래대로 되돌려 놓음
s.fly();//일반비행한다는 말로 바뀜
s.land();//착륙한다.
}
}


'IT일반과목 > java' 카테고리의 다른 글

Student 만들기  (0) 2018.07.23
Student 객체의 이해(과제)  (0) 2018.07.23
자바 상속에 대하여4  (0) 2018.07.22
자바 상속에 대하여3(this와 super)의 의미  (0) 2018.07.22
자바 상속에 대하여2  (0) 2018.07.22