본문 바로가기

Java

메소드 재정의(Override)와 몇가지..

메소드 재정의 Override에 대해 배워보자

항상 오버로딩(Overoding), 오버라이딩(Overriding)이 헷깔릴때가많다. 

메소드 재정의 Override

자식 클래스에서 부모를 상속받았을 때 부모의 메소드가 자식메소드에서도 쓸 수 있다면 좋겠지만 그것이 아닌경우

부모메소드를 자식메소드에서 재정의 해서 사용할 수 있다.

간단히 상송받은 메소드를 자식클래스에서 수정 후 사용할수있다는 이야기

오버라이딩 조건?

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

-접근 제한을 더욱 강하게 할수없음

예를 들어 부모 메소드가 default접근제한자라면 그것보다 더 강한 private로 변경이 불가 하다.     

반대로 접근 제한을 더욱 낮추는 것은 가능한데 만약 부모 메소드가 default접근 제한자라면

public 으로 변경 할 수 있다.

- 새로운 예외(Exception)를 throws할수없다. <<이건 아직 뭔지 모르겠다.

- @Override 어노테이션

이클립스에서는 오버라이딩을 자동으로 해줄때가있다. 그때마다 같이나오는 @Override< 이녀석이 뭔지 항상궁금했다.

그냥 지워도 코드는 잘 돌아가기 때문에 그냥 자막 같은 놈인가 했는데 이 @Override 어노테이션은 부모의 메소드와 현재 재정의 하려는 자식 메소드가 위의 조건에 맞는지 컴파일러에 검사를 지시한다. 간단하게 말하면 그냥 코드가 제대로 되있는지 검사해주는 것.

 그래서 왠만하면 이녀석을 붙이고 진행하자.

부모 메소드 호출(super)

지난번에 상속에서 super를 했었다. 자기자신을 가르키는this,와는 달리 부모객체를 가르키는 느낌의 자식 클래서의 생성자에 자동 생성되서 자식객체가 만들어질때 자동으로 부모의 생성자를 불러와 부모객체를 만드는 녀석

부모 메소드가 자식 메소드에서 재정의 되면 부모 메소드는 숨겨지고 자식메소드가 사용된다.  하지만 그래도 부모 메소드를 써야 하는 경우가 온다면?? 어떻게 호출할 것인가. 

바로 super를 사용헤서 숨겨진 부모 메소드를 호출할 수 있다.

사용법은 간단하다.   super.부모메소드();

예를 들어

public class Parent{

void method1(){...}

void method2(){

System.out.println("나는 부모메소드");

}

}

public class Child extends Parent{

void method2(){

System.out.println("나는 재성의된 자식메소드");

} << 오버로딩 

void method3(){...}

method2();

super.method2();

}

이때 method2()를 호출하면 어떻게 될까?? 

일단 부모 메소드 대신 자식 메소드가 호출되서 콘솔에는

나는 재정의된 자식메소드 라는 텍스트가 뜰것이다 

그 뒤 부모 메소드가 호출되어 나는 부모메소드 라는 텍스트가 불리게된다. 

어떤 경우에 이걸 많이 쓸까 인강의 예로들자면

void 자식method2(){<< 오버로딩된 메소드

super.부모method2();

System.out.println("나는 재정의 된 자식 메소드");

}

이런식의 코드에 많이 쓰인다고 한다. 이럴경우 콘솔의 출력은 부모메소드의 내용먼저 출력하고 자식 메소드의 내용을 출력한다.


final 클래스와 final메소드

지난번 상수 에서 final을 필드에 붙여 사용했을때를 보았다. 필드에 final이 붙으면 그 필드의 값은 변경이 불가한 상수가 된다고 final은 필드뿐만 아니라 메소드, 클래스에서도 사용이 가능하다. 그러면 클래스, 메소드에,final이 붙으면 어떤 기능을 하게될까??

클래스의 경우

클래스 선언시 final을 붙이게 되면 해당 클래스는 상속이 불가능한 클래스가 된다. 자식 클래스 생성이 불가능 하다는 이야기.

대표적으로는 자바API에서 제공하는 String 클래스가 있다. 

public final String {...}

이러한 형대로 되어있고 다른 클래스에서 상속이 불가능하다.


메소드의 경우

메소드에 final을 붙이게 되면 해당 메소드는 더이상 재수정, Overriding이 불가능하게된다. 자식 클래스에서 부모클래스를 상속받더라도 부모메소드가 final이면 오버라이딩이 불가능하다.

protected

접근제한자에서 protected를 잠깐 보았었다. 왜 지금 이녀석만 따로 보느냐 하면 상속에 관련이 있기때문이다.

public 을 제외한 다른 접근제한자들은 패키지가 다르면 접근이 불가능해진다. 

이녀석도 마찬가지 패키지가 다른 클래스의 접근은 불가능하다. 하지만 패키지가 다른 클래스끼리 상속관계에있다면 

자식클래스는 패키지가 다른 부모클래스에 접근이 가능하다.

chap07.zip


위의 내용과 예제는 모두 이것이 자바를 참고하고있습니다.

'Java' 카테고리의 다른 글

자동타입변환(Promotion)  (0) 2018.12.20
타입변환. 다형성  (0) 2018.12.20
상속이란?  (0) 2018.12.05
접근 제한자 ,Getter/Setter  (0) 2018.11.22
정적인 자식 Static  (0) 2018.11.21