[Java] 상속, IS-A 관계, 오버라이딩, this & super, this() & super()

클라우드·2024년 4월 2일
0

Java

목록 보기
6/20
post-thumbnail

9. Inheritance

  • 상속은 부모 class가 가지고 있는 내용을 자식 class가 물려 받는 개념이다.
  • 그래서 매번 class를 작성할 때 처음부터 작성하는 게 아니라 기존 클래스를 확장해서 작성하는 개념이다.
  • 클래스의 계층 구조도 생긴다.
  • 부모 클래스, parent class, upper class, super class
  • 자식 클래스, child class, sub class

9.1 상속이 필요한 이유


  • 코드로 상속 표현하기
  • keyword ⇒ extends 활용
  • Java는 단일 상속만 지원한다.
  • 상속은 항상 좋을까?
    • 클래스 간 결합도가 증가한다.
    • 상속은 class 간의 결합도를 증가시킨다. (tightly coupled)
    • 그로 인해서 클래스의 재활용성을 낮추게 된다.

9.2 is-a relationship(IS-A 관계) 개념

  • ⇒ sub class is a super class
  • 이 말의 의미는 sub class가 super class와 같으니까..
  • sub class를 써야 하는 자리에 super class를 사용할 수 있다.
  • 포유류, 사람… 당연히 포유류가 상위 클래스 사람은 하위 클래스
  • 사람 is a 포유류 (O)
  • 포유류 is a 사람 (X)
  • 다형성 : 같은 객체를 reference variable의 type을 변경시킴으로 인해 다른 형태로 객체를 사용하는 방법

10. (method) overriding

  • 하위 클래스에서 상속받은 상위 클래스의 method를 재 정의해서 사용하는 방법
  • 만약 field를 하위 클래스에서 재 정의해서 사용하게 되면 이는 shadow라고 표현한다. (잘 일어나지 않는다.)
  • 부모 클래스
package test;

public class SuperClass { // extends java.lang.Object 최상위로 항상 상속

    int a = 100;
    String b = "여기는 super class";

    public SuperClass() { // 항상 인자 없는 생성자를 만들어야 한다.
        super();
    }

    public void myFunc() {
        System.out.println("super");
    }
}
  • 자식 클래스
package test;

public class SubClass extends SuperClass {

    // 추가적인 field와 method를 정의하면 된다.
    int a = 5000; // shadow
    int b = 500;

    public SubClass() {
        this(10); // int형을 가지고 있는 생성자를 호출
    }

    public SubClass(int k) {
        // 현재 class가 최상위 클래스인지 확인하고 아니면
        // 상위 클래스의 instance를 만드는 코드
        // SuperClass(); 이건 못 쓰고 대신 super을 쓴다.
        super(); // 상위 클래스를 찾아서 상위 클래스의 생성자를 호출하는 코드
    }

    @Override
    public void myFunc() {
        System.out.println("여기는 sub class 입니다.");
    }
}
package test;

public class Main {
    public static void main(String[] args) {

        // instance를 생성하자.
        SubClass sub = new SubClass();
        System.out.println(sub.a); // 5000
        sub.myFunc(); // 여기는 sub class 입니다.

    }
}
  • overriding에서 조심해야 할 점은 dynamic binding이 발생한다.
package test;

public class Main {
    public static void main(String[] args) {

        // instance를 생성하자.
        // 동적 바인딩
        // 메소드는 오버라이딩되어 있으면 오버라이딩 된 것을 찾아 출력한다.
        SuperClass sub = new SubClass();
        System.out.println(sub.a); // 100
        sub.myFunc(); // 여기는 sub class 입니다.
    }
}

11. this, super, this(), super()

  • this : 현재 사용하고 있는 객체에 대한 reference
  • super : 현재 사용하고 있는 객체에 대한 reference (상위 타입의 객체를 지칭)
  • super() : 상위 클래스의 생성자를 호출
  • this() : 내가 가진 오버로딩된 해당 클래스의 다른(인자의 개수나 타입이 다른) 생성자를 호출

12. 연습문제

  • 부모 클래스
package test;

public class SuperClass2 {
    static int staticCall(String msg) {
        System.out.println(msg);
        return 0;
    }

    int a = staticCall("1번 문장");
    static int b = staticCall("2번 문장");

    public SuperClass2() {
        staticCall("3번 문장");
    }

    public SuperClass2(int i) {
        this();
        staticCall("4번 문장");
    }

    public void myFunc() {
        System.out.println("5번 문장");
    }
}
  • 자식 클래스
package test;

public class Exam01_InheritanceOrder extends SuperClass2 {

    int c = staticCall("6번 문장");
    static int d = staticCall("7번 문장");
    // 상위 클래스의 static 먼저 출력, 다음으로 하위 클래스 static 출력

    public Exam01_InheritanceOrder() {
        super(100);
        staticCall("8번 문장");
        super.myFunc();
    }

    @Override
    public void myFunc() {
        System.out.println("9번 문장");
    }

    public static void main(String[] args) {
        System.out.println("10번 문장");
        SuperClass2 obj = new Exam01_InheritanceOrder();
        obj.myFunc();
    }
}
2번 문장
7번 문장
10번 문장
1번 문장
3번 문장
4번 문장
6번 문장
8번 문장
5번 문장
9번 문장
profile
안녕하세요 :)

0개의 댓글