본문 바로가기
  • hello world
Language/Studying

[Java] 상속(Inheritance)

by JJoajjoa 2024. 7. 3.

 

한 클래스가 다른 클래스의 특성과 동작(메서드)을 물려받을 수 있게 함

 

 

▶ 주요 개념

 

  • 상속 (Inheritance): 한 클래스가 다른 클래스의 특성과 동작을 물려받는 것
  • 부모 클래스 (Super/Parent/Base Class): 특성과 동작을 물려주는 클래스
  • 자식 클래스 (Sub/Child/Derived Class): 특성과 동작을 물려받는 클래스
  • super 키워드: 부모 클래스의 생성자나 메서드를 호출할 때 사용
  • 오버라이드 (Override): 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것

 

 

 

▶ 예제와 함께 보기

// 상위 클래스 (부모 클래스)
public class Parents {
    // 멤버 변수
    String familyName;

    // 생성자
    public Parents(String familyName) {
        this.familyName = familyName;
    }

    // 메서드
    public void showFamilyName() {
        System.out.println("Family name is " + familyName);
    }
}


// 하위 클래스 (자식 클래스)
public class Child extends Parents {
    // 추가 멤버 변수
    String firstName;

    // 생성자
    public Child(String familyName, String firstName) {
        super(familyName); // 부모 클래스의 생성자 호출
        this.firstName = firstName;
    }

    // 메서드 오버라이드 (부모 클래스의 메서드를 재정의)
    @Override
    public void showFamilyName() {
        System.out.println("Child's full name is " + firstName + " " + familyName);
    }
}


// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // Parents 객체 생성
        Parents parent = new Parents("Smith");
        parent.showFamilyName(); // "Family name is Smith" 출력

        // Child 객체 생성
        Child child = new Child("Smith", "John");
        child.showFamilyName(); // "Child's full name is John Smith" 출력
    }
}

상속을 사용하여 자식 클래스가 부모 클래스의 멤버를 물려받고, 이를 확장하거나 변경할 수 있음을 알 수 있음

 

 

 

 

 

▶  다형성과 캐스팅

다형성(Polymorphism) : 상속 관계에 있는 클래스들 간의 상호 작용을 통해 다양한 형태를 갖도록 하는 것

 

다형성에서 부모-자식 관계에서 캐스팅을 사용할 수 있음
이 때, 참조 변수가 사용할 수 있는 멤버의 개수가, 실제 인스턴스의 멤버의 변수보다 작아야 함
부모 자식 (화살표 방향에 유의하기!)

 

▷ 예제와 함께 보기

class Parent{}
class Child extends Parent{}
class Person{}

라는 클래스 3개가 있다고 가정해보자!

 

Parent p1 = new Parent();
Child c1 = new Child();
Person pp = new Person();

각각의 객체를 생성해주자!

 

이때 

Parent p2 = new Child(); // 가능
Child c2 = new Parent(); // 불가능

  참조 변수가 사용할 수 있는 멤버의 개수가, 실제 인스턴스의 멤버의 변수보다 작아야 함

이렇게 하면 p2는 Parent 타입이지만, 실제로는 Child 객체를 참조하게 됨

이 경우, p2는 Parent 클래스에 정의된 멤버들만 사용할 수 있음

 

 

참조변수 : 객체를 참조(포인팅)하는 변수. 참조 변수를 통해 객체의 메서드와 속성에 접근할 수 있음

// 부모 클래스
class Parent {
    void parentMethod() {
        System.out.println("Parent method");
    }
}

// 자식 클래스
class Child extends Parent {
    void childMethod() {
        System.out.println("Child method");
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // 참조 변수 p1, c1, p2, c2 선언
        Parent p1 = new Parent(); // p1은 Parent 객체를 참조
        Child c1 = new Child(); // c1은 Child 객체를 참조
        Parent p2 = new Child(); // p2는 Child 객체를 참조 (부모 타입의 참조 변수)

        p1.parentMethod(); // 가능
        c1.parentMethod(); // 가능 (상속받았으므로)
        c1.childMethod();  // 가능
        p2.parentMethod(); // 가능
        // p2.childMethod(); // 불가능, p2는 Parent 타입이므로 Child의 메서드를 사용할 수 없음

        // 강제 캐스팅
        Child c2 = (Child) p2;
        c2.childMethod();  // 가능, 이제 p2는 Child 타입으로 캐스팅 되었으므로 Child의 메서드를 사용할 수 있음
    }
}

 

 

 

 

'Language > Studying' 카테고리의 다른 글

[Java] Java API  (0) 2024.07.17
[Java] Heap 영역과 Stack 영역 (feat. 동적할당, 정적할당)  (0) 2024.07.16
[Java] ArrayList와 HashMap  (0) 2024.07.08
[Java] this와 super  (0) 2024.07.04
## 코딩테스트 연습문제  (0) 2023.08.09