예) 게임구현
public class Unit {
private String name;
public Unit(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void attack() {
System.out.println(this.name + " >> 공격 준비");
}
}
public class Army extends Unit{
public Army(String name) {
super(name);
}
public void tank() {
System.out.println(super.getName() + " >> 탱크공격");
}
// Override 된 메서드
// @ : 언오테이션
@Override
public void attack() {
super.attack();
System.out.println(super.getName() + " >> 지상공격 실행함");
}
}
public class Navy extends Unit{
public Navy(String name) {
super(name);
}
@Override
public void attack() {
super.attack();
System.out.println(this.getName() + " >> 어뢰발사");
System.out.println(this.getName() + " >> 지상상륙");
}
// nucleus()
public void nucleus() {
System.out.println(this.getName() + " >> 핵공격");
}
}
public class AirForce extends Unit {
public AirForce(String name) {
super(name);
}
@Override
public void attack() {
super.attack();
System.out.println(this.getName() + " >> 이륙");
System.out.println(this.getName() + " >> 공중공격 실행함");
}
// bombing()
public void bombing() {
System.out.println(this.getName() + " >> 폭격");
}
}
public class Main02 {
public static void main(String[] args) {
Army am = new Army("육군");
am.attack();
am.tank();
// Navy
Navy nv = new Navy("헤군");
nv.attack();
nv.nucleus();
// AirForce
AirForce af = new AirForce("공군");
af.attack();
af.bombing();
}
}
결과: 육군 >> 공격 준비
육군 >> 지상공격 실행함
육군 >> 탱크공격
해군 >> 공격 준비
해군>> 어뢰발사
해군>> 지상 상륙
해군>> 핵미사일
공군 >> 공격 준비
공군 >> 이륙
공군 >> 공중공격 실행함
공군 >> 폭격
- 기술면접에서 많이 물어봄. Override는 무엇인가?, Override와 Overlode의 차이점은?
클래스의 상속관계에서 자식 클래스가 부모 클래스를 가리키는 예약어
사용방법
-> 맴버변수 이름 앞에 명시
: 부모 클래스의 멤버변수를 의미한다. 하지만 부모 클래스의 멤버변수는 이미 모두 상속되어 있기 때문에 이 경우에는 this 키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않는다. (멤버변수는 this로 )
-> 메서드 이름 앞에 명시
: 부모 클래스의 메서드를 의미한다.
재정의 되지 않은 메서드 -> 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 동일한 결과를 갖는다.
재정의된 메서드 -> Override 된 메서드 이름 앞에 사용하게 되면 재정의 되기 이전의 원본 메서드를 의미한다.
-> 키워드 자체를 메서드처럼 사용
: super()
부모 클래스의 생성자를 의미한다.
super(x, y)
public class Hello {
public void say() {
System.out.println("Hello");
}
}
public class Korean extends Hello {
public void say() {
System.out.println("안녕하세요");
}
public void sayHello() {
super.say();
this.say();
}
}
public class Main01 {
public static void main(String[] args) {
Korean k = new Korean();
k.sayHello();
}
}
// 부모 클래스
public class Hello2 {
Hello2( String msg){
System.out.println(msg);
}
// 자식 클래스
public class Korean2 extends Hello2{
/*
* 부모 생성자의 강제 호출
* - 생성자가 정의된 클래스를 상속받은 경우 자식 클래스의 생성자를 통해서
* 부모 생성자를 강제로 호출해야 한다.
* - 부모의 생성자를 호출하는 방법은 super 키워드를 메서드 이름으로 사용하는 것이다,
* - 부모와 동일한 파라미터를 받도록 생성자를 정의하고, 전달받은 파라미터를 부모에게 재전달 한다.
*/
public Korean2( String msg) {
super(msg);
}
}