본문 바로가기

Programming Language/JAVA

[JAVA] 오버라이딩(Overriding)과 final클래스

▶ 오버라이딩(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클래스에서 오버라이딩을 할수없게됩니다.