[JAVA] 메소드 재정의(메소드 오버라이딩) / 상속

이현경·2021년 4월 22일
0

JAVA

목록 보기
47/77
  • 메소드 재정의
    부모로부터 받은 메서드를 재정의 : 메소드 오버라이딩
    메소드를 재정의 하게되면 부모 메소드를 사용할 수 없다.
package package1;

public class Ex01 {

	int num1;
	int num2;
	
	public Ex01() {
		num1 = 20;
		num2 = 10;
	}
	public Ex01(int num1) {
		this.num1 = num1;
	}
	public Ex01(int num1, int num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	public int mul() {
		return num1 * num2;
	}
	public int div() {
		return num1 / num2;
	}
}
package package1;

public class Ex02 extends Ex01 {

	public Ex02() {
		super();	// 부모 클래스의 default 생성자를 실행시킴
	}
	public Ex02(int num1) {
		super(num1);
		num2 = 20;
	}
	public Ex02(int num1, int num2) {
		super(num1, num2);
	}
	public int add() {
		return num1 + num2;
	}
	public int sub() {
		return num1 - num2;
	}
	public int div() {	// 부모로부터 받은 메소드를 재정의 : 메소드 오버라이딩
		if(num2 == 0) {
			return 0;
		} else {
			return num1 / num2;
		}
	}
}
package package1;

public class Ex02Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Ex02 ex = new Ex02();	// 자식 클래스의 default 생성자 실행
		int result = ex.add();
		System.out.println(result);
		
		Ex02 ex1 = new Ex02(30);	// 매개변수가 하나인 생성자 실행
		result = ex1.mul();
		System.out.println(result);
		
		Ex02 ex2 = new Ex02(20, 10);
		result = ex2.div();
		System.out.println(result);
		
		Ex02 ex3 = new Ex02(0, 20);
		result = ex3.div();
		System.out.println(result);
		
		Ex02 ex4 = new Ex02(20, 0);
		result = ex4.div();
		System.out.println(result);	// 불능
	}

}

package package4;

public class Airplane {

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

public class KoreaAirplane extends Airplane {

	static final int NORMAL = 1;	// 일반 비행
	static final int SUPERSONIC = 2;	// 초음속 비행
	
	int flyMode = NORMAL;
	
	public void fly() {	// 메소드 오버라이딩
		if(flyMode == SUPERSONIC) {
			System.out.println("초음속 비행입니다.");
		}else {
			super.fly();	// 부모 클래스에 있는 메소드 실행
		}
	}
}
 
package package4;

public class KoreaAirplaneTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		KoreaAirplane ka = new KoreaAirplane();
		ka.fly();
		
		ka.flyMode = KoreaAirplane.SUPERSONIC;
		ka.fly();
		
		ka.flyMode = KoreaAirplane.NORMAL;
		ka.fly();
	}

}

  • 부모 클래스에 있는 메소드에 final이라고 주면 재정의를 할 수 없다.
package package5;

public class Ex05 {

	int num1;
	int num2;
	
	Ex05(int num1, int num2){
		this.num1 = num1;
		this.num2 = num2;
	}
	
	public int add() {
		return num1 + num2;
	}
	
	// 자식 클래스에서 재정의 할 수 없는 메소드
	public final int sub() {
		return num1 - num2;
	}
}
package package5;

public class Ex06 extends Ex05 {

	Ex06(int num1, int num2) {
		super(num1, num2);
	}

	public int mul() {
		return num1 * num2;
	}

	public double div() {
		return num1 / num2;
	}
	/*
	 * 부모 클래스에 있는 매소드에 final이라고 주면 재정의를 할 수 없다. public int sub() { // 부모로부터 상속 받은
	 * 메소드를 재정의
	 * 
	 * return num2 - num1;
	 */
}
package package5;

public class Ex06Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Ex06 ex = new Ex06(20, 10);
		int result = ex.add();
		System.out.println(result);
		
		result = ex.sub();
		System.out.println(result);
		double d = ex.div();
		System.out.println(d);
	}

}

  • class에 final이 있으면 상속할 수 없는 class라는 것을 의미한다.
    but 상속 받을 수는 있다.
package package5;

// class에 final이 있으면 상속할 수 없는 class라는 것을 의미함
public final class Ex07 {

	int num1;
	int num2;
	
	public int add() {
		return num1 + num2;
	}
	
}
package package5;

// class에 final이 있으면 상속할 수 없는 class라는 것을 의미함
// 상속 받을 수는 있다.
public final class Ex07 extends Ex05 {

	Ex07(int num1, int num2){
		super(num1, num2);
	}
	
	public int mul() {
		return num1 * num2;
	}
	
}
package package5;

public class Ex07Test {

	public static void main(String [] args) {
		Ex07 ex = new Ex07(20, 10);
		
		int result = ex.add();
		System.out.println(result);
	}
}
profile
25. 컴퓨터학과 졸업 / SQLD, 정보처리기사 취득

0개의 댓글