▶ 오버라이딩(Overriding)과 final클래스
● 오버라이딩(Overriding)
: 상속받은 메소드의 내용을 재정의하는것입니다. 즉, 자신에 맞게 변경해서 사용하는 것입니다.
● 오버라이딩 조건
- 이름이 같아야 한다.
- 매개변수가 같아야한다.
- 리턴타입이 같아야 한다.
- 자식의 접근제한자는 부모의 접근제한자보다 작을수없다. (private < package < protected < public)
package Test;
class Ferrari{
private int ye;
public Ferrari(int ye) {
this.ye = ye;
}
public int getYe() {
return ye;
}
public void speed() {
System.out.println(getYe()+"년식 페라리 속도 : 300Km");
}
}
class NewFerrari extends Ferrari{
public NewFerrari(int ye) {
super(ye);
}
public void autoSystem() {
System.out.println("자동 운전 모드를 시작합니다.");
}
@Override
public void speed() {
System.out.println(getYe()+"년식 페라리 속도 : 400Km");
}
}
public class Test {
public static void main(String[] args) {
NewFerrari fe = new NewFerrari(2018);
fe.speed();
fe.autoSystem();
}
}
위에서 보면 기존 페라리클래스에서는 시속이 300km이었습니다.
하지만 New페라리 클래스에서 페라리클래스를 상속받고 @Override라는 어노테이션이 붙으면서 부모클래스인 페라리에서 speed()메소드를 다시 재정의해서 400km라고 메소드를 만들어줍니다.
그리고 Main메소드에서 New페라리의 객체를 생성해주고 speed()메소드를 호출하면 400km가 출력됩니다.
● final
: 한번 값을 정해주면 그뒤로 값을 변경할수 없습니다. 또한, 클래스앞에 붙게되면 상속을 받지못하게합니다.
package Test;
class A {
public void getName() {
System.out.println("이름 : 고길동");
}
public void getPwd() {
System.out.println("부모 getPwd");
}
}
class B extends A {
public void getPwd() {
System.out.println("자식 getPwd");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.getPwd();
}
}
final을 사용하기전 소스입니다.
실행하게되면 getPwd()메소드는 자식 메소드가 출력되게됩니다.
package Test;
final class A {
public void getName() {
System.out.println("이름 : 고길동");
}
public void getPwd() {
System.out.println("부모 getPwd");
}
}
class B extends A {
public void getPwd() {
System.out.println("자식 getPwd");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.getPwd();
}
}
만약 클래스를 만들고 다른 클래스들이 상속을 하지못하게 하려면 A클래스 앞에 final을 붙여주면
상속받게되면 에러가 발생하게됩니다.
package Test;
class A {
public void getName() {
System.out.println("이름 : 고길동");
}
public final void getPwd() {
System.out.println("부모 getPwd");
}
}
class B extends A {
public void getPwd() {
System.out.println("자식 getPwd");
}
}
public class Test {
public static void main(String[] args) {
B b = new B();
b.getPwd();
}
}
특정 메소드만 오버라이딩을 방지하고싶다면 getPwd()메소드처럼 앞에 final키워드를 붙여줌으로써,
상속받은 B클래스에서 오버라이딩을 할수없게됩니다.
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA] 파일 입출력 (0) | 2019.07.30 |
---|---|
[JAVA] Object 클래스 - 오브젝트 클래스 (0) | 2019.07.29 |
[JAVA] 업캐스팅(Up-Casting)과 다운캐스팅(Down-Casting) (0) | 2019.07.28 |
[JAVA] 래퍼 클래스(Wrapper class) 및 제네릭(Generic) (0) | 2019.07.27 |
[JAVA] 쓰레드(thread)와 프로세스(process),멀티쓰레드, 멀티프로세싱, 데몬쓰레드(Daemon),동기화(Synchronized) (0) | 2019.07.25 |
[JAVA] 예외(exceptional event) 강제예외,예외전가,예외처리 try-catch, finally (0) | 2019.07.24 |
[JAVA] 상속( inheritance ) (0) | 2019.07.23 |
[JAVA] 생성자(Constructor) (0) | 2019.07.22 |