본문 바로가기
Java

[JAVA] Chapter 6. 상속

by nyeoo 2023. 11. 7.

1. 상속(Inheritance) 이란?

  • 새로 설계(생성)하고자 하는 클래스가 이미 설계되어 있는 다른 클래스의 기능과 중복되는 경우 이미 설계된 클래스의 일부분이나 전체 구조를 공유할 수 있도록 하는 기능.
  • 즉, 상속은 객체를 좀 더 쉽게 만들 수 있는 고수준의 재사용성(reusablility)을 확보하고 객체간의 관계를 구성함으로써 객체 지향의 또 다른 특징인 다향성의 문법적 토대가 됨
  • 상속은 기존 프로그램의 클래스 내용을 공유함으로써 중복된 코드들을 재작성할 필요 없이 반복적이고 세부적인 작업을 처리하지 않기 때문에 프로그램을 작성하는 시간을 절약할 수 있고 유지보수를 편리하게 할 수 있으며, 프로그램의 길이도 짧아짐
  • 이미 작성된 프로그램들은 앞서 테스트되었기 때문에 오류를 줄일 수 있어 현재 작성 중인 프로그램에만 전념가능
  • 자바는 다중상속(자식 입장에서 부모 여러명)을 지원하지 않기 때문에 두 개 이상의 클래스로부터 상속불가능. 즉, 자바는 단일상속만 지원함
  • 형식 : class 자식클래스 extends 부모클래스{ }
부모 클래스 == 상위 클래스 == 슈퍼(super) 클래스 == 상속하는 클래스
자식 클래스 == 하위 클래스 == 서브(sub) 클래스 == 상속받는 클래스

 

· 예시 : 이름이 같은 변수를 상속받는 경우

class SuperTest114
{
    protected int a = 10;
}

class SubTest114 extends SuperTest114
{
    protected int a = 100;
}

// main() 메소드를 포함하는 외부의 다른 클래스
public class Test114
{
    public static void main(String[] args)
    {
        // 하위 클래스(SubTest114) 인스턴스 생성
        Test114 ob = new Test114();

        System.out.println(ob.b);
        //--==>> 100

        System.out.println(((SuperTest114)ob).b);    //-- 자식 객체의 부모를 부름
        //--==>> 10
        // ※ 슈퍼부름~!!!
    }
}

→ 주의사항 : 상위 객체를 생성한 후 상위 객체하위 객체의 멤버에 접근하는 것은 불가능함 (상위 객체 입장에서는 어떤 하위 객체가 존재하는지도 알 수 없음)

2. 상속과 생성자

  • 자식 클래스 생성자 안에는 부모 클래스 생성자 호출 구문이 자동 삽입됨
  • 자식 클래스의 인스턴스 생성시 가장 먼저 부모클래스의 생성자가 실행됨. 이는 초기화되지 않은 멤버 변수가 상속되는 것을 막기 위함임
  • private 멤버, 부모클래스의 생성자 등은 상속되지 않음
  • super는 static 으로 선언되지 않은 메소드에서 사용되며, 현재 클래스가 상속받은 상위 클래스의 객체를 가리킴. 상위 클래스의 생성자를 호출하거나 상위 클래스의 멤버변수 또는 메소드를 호출할 때 사용가능
class SuperTest111
{
    // 생성자
    SuperTest111()
    {
        System.out.println("Super Class...");
    }
}

public class Test111 extends SuperTest111
{
    // 생성자
    Test111()
    {
        //super();        //-- 자동 삽입
        System.out.println("Sub Class...");
    }

    public static void main(String[] args)
    {
        // Test111 (자식) 클래스 기반 인스턴스 생성
        Test111 ob = new Test111();
        //--==>> Super Class...
        //         Sub Class...
    }
}

3. 메소드 오버라이딩 (메소드 재정의)

  • 상위 클래스를 상속받은 하위 클래스에서 상위 클래스에 정의된 메소드를 다시 정의하는 것(재정의)이며, 객체 지향 프로그래밍의 특징인 다형성을 나타냄
  • 오버라이딩하면 다시 전으로 되돌리는 것은 불가능
  • 재정의(Overriding)는 반드시 상속관계에 있어야 하며 메소드 이름, 리턴 타입, 매개변수의 갯수나 타입이 모두 완전히 일치해야 함
  • 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클래스의 메소드 접근제어지시자보다 범위가 크거나 같아야 함. 예를 들어, 상위 클래스 메소드의 접근제어지시자가 protected인 경우에, 하위 클래스가 이 메소드를 오버라이딩 하는 경우 접근제어지시자는 public 또는 protected 이어야 함
  • static(먼저 메모리에 퍼올려짐), final(값을 고정하는 변수의 상수화), private(접근과 상속이 불가)은 오버라이딩 할 수 없음
  • 상위 메소드가 가지고 있는 기존의 예외 사항에 새로운 Exception을 추가하는 것은 불가능
@Override            //-- 어노테이션
public void write()
{
    System.out.println("메소드 오버라이딩");
}

어노테이션(annotation) : metadata의 일종이며, JDK 1.5부터 사용가능. 데이터를 수식하는 데이터이며, 자바에게 전달되는 주석임

4. 객체의 타입 변환

4-1. 묵시적 타입 변환 (업 캐스팅)

  • 자식 객체를 부모 타입의 참조 변수에 할당하는 것
// 방법① : 하위 클래스 기반 인스턴스 생성 → 업 캐스팅
SubTest116 ob1 = new SubTest116();
SuperTest116 ob2 = ob1;
//SuperTest116 ob2 = (SuperTest116)ob1;

// 방법② : 하위 클래스 기반 인스턴스 생성 후 업 캐스팅
SuperTest116 ob2 = new SubTest116();

4-2. 명시적 타입 변환 (다운 캐스팅)

  • 묵시적 타입 변환된 객체를 다시 원래의 타입으로 변환하는 것
// 업 캐스팅된 객체를 다시 원래 타입으로 변환(다운캐스팅)
SubTest116 ob3 = (SubTest116)ob2

4-3. 타입 변환이 불가능한 경우

// 상위 클래스 기반 인스턴스 생성
SuperTest116 ob3 = new SuperTest116();
SubTest116 ob4;

//ob4 = ob3;
//--==>> 에러 발생(컴파일 에러)
//-- 상위 객체는 하위 객체에 담을 수(참조할 수) 없음

//ob4 = (SubTest116)ob3;
//--==>> 에러 발생(런타임 에러)
//-- 작성된 구문의 문법적인 구조만 봤을 때 이 구문은 다운 캐스팅이 이루어지는 상황
//   하지만, 정상적인 캐스팅이 이루어지지 않음
//   현재 SubTest116 객체에 대한 메모리 할당은 이루어지지 않은 상태이기 때문
//   => 부모클래스 인스턴스 생성으로 메모리에 퍼올려질 때 자식은 절대 함께 메모리에 함께 퍼올려질 일이 없음

'Java' 카테고리의 다른 글

[JAVA] Chapter 9. JDBC 개념  (0) 2023.12.05
[JAVA] Chapter 7. 추상클래스와 인터페이스  (0) 2023.11.07
[JAVA] Chapter 5. 객체와 클래스  (0) 2023.11.07
[JAVA] Chapter 4. 배열  (0) 2023.11.07
[JAVA] Chapter 3-3. 이동 제어문  (0) 2023.11.07