캡상추다가 중요하다고 한다.
여기서 캡상추다는 개념을 외우기 쉽게하려고 만든 말인데 상추가 캡이다! 이런 느낌으로 캡상추다로 했다.
(말도 안되는 억지 죄송합니다..ㅜ)
캡: 캡슐화, 상: 상속(일반화), 추: 추상화, 다: 다형성이다.
오늘은 상속을 복습하기 위해서 부모 클래스를 생성하고 자식 클래스를 2개 만든다음,
자식 클래스중 하나만 오버라이딩을 하고 나머지 하나는 오버라이딩을 하지 않고 메소드를 실행해 보았다.
먼저 부모 클래스 Test8을 작성하였다.
public class Test8 { int kor; int eng; Test8(int kor,int eng){ this.kor = kor; this.eng = eng; } void drawing() { System.out.println("사자를 그렸습니다."); } int add(int a,int b) { int result = a+b; return result; } }
int형의 kor,eng 변수와
drawing() , add() 메소드를 가지고 있다.
Test8을 상속하고, 메소드 두개를 Overriding한
Test9를 작성하였다.
public class Test9 extends Test8{ int mat; Test9(int kor, int eng, int mat) { super(kor, eng); this.mat = mat; } @Override void drawing() { System.out.println("코끼리를 그렸습니다."); } @Override int add(int a, int b) { int sum = a+a+b; return sum; } }
오버라이딩 되었는지 확인하기 위해, "사자를 그렸습니다." 를 "코끼리를 그렸습니다."로 변경하고,
a+b였던 add() 메소드를 a를 한번 더 더해서 값의 차이를 주었다.
상속을 하게 되면 부모의 메소드, 변수등을 가져다 사용할 수 있는데, 이때 자식은 생성자를 생성하여야 하고,
생성자에 부모가 가지고 있는 int kor,eng 는
super(kor,eng); 로 생성자 내에서 선언하여야 한다.
마지막으로 Test8을 상속하지만 오버라이딩은 하지않은
Test10을 작성하였다.
public class Test10 extends Test8 { int tot; Test10(int kor, int eng,int tot) { super(kor, eng); this.tot = kor+eng; } }
실행 클래스인 InheritancePractice를 작성하였다.
public class InheritancePractice { public static void main(String[] args) { int kor = 100; int eng = 80; int mat = 90; Test8 t8 = new Test8(kor, eng); t8.drawing(); int sum1 = t8.add(1, 2); System.out.println("T8 add() = " + sum1); System.out.println(); Test9 t9 = new Test9(kor, eng, mat); t9.drawing(); int sum2 = t9.add(1, 2); System.out.println("T9 add() = " + sum2); System.out.println(); Test10 t10 = new Test10(kor, eng, 100); t10.drawing(); int sum3 = t10.add(1, 2); System.out.println("T10 add() = " + sum3); } }
t8은 부모인 Test8의 참조변수이다. t8.drawing()과 t8.add에서 받은 int sum1을 출력해보면
정의 된대로 "사자를 그렸습니다."와 1+2 = 3이 출력된다.
T9가 가지고 있는 t9.drawing()과 t9.add에서 받은 int sum2를 출력해보면
부모의 메소드를 재정의하였으므로,
"코끼리를 그렸습니다."와 1+1+2 = 4가 출력된다.
T10은 오버라이딩 하지 않았으므로, 부모가 가진 메소드를 그대로 가져다가 실행하여, T8과 같은 출력을 한다.
output:
여기서 알게된 것은, 부모의 메소드를 그대로 가져다가 사용하면 부모랑 같은 출력을 하게 되고,
부모의 메소드를 재정의하여 사용하게 되면 다른 출력을 하게 된다는 것이다.