본문 바로가기
기타/백엔드 기초

자바 Java | 상속(Inheritance) 개념과 구현 방법: 단일 상속, 상속 구현, super, Object 클래스

by YUNI Heo 2023. 2. 16.
반응형

 

✅ 상속 Inheritance

기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

코드의 재사용성을 높이고 코드의 중복을 제거하여, 생산성유지보수에 크게 기여한다.

 

💡 조상 Parent, Super / 자손 Sub 클래스

조상 클래스(Parent, Super class): 상속하는 클래스

자손 클래스(Sub class): 상속받는 클래스

  • 조상 클래스 자손 클래스의 멤버(필드, 메서드)를 사용할 수 없다.
  • 자손 클래스 조상 클래스의 모든 멤버(필드, 메서드)를 상속받는다.
  • 자손 클래스 조상 클래스의 모든 멤버(필드, 메서드)를 사용할 수 있다.
  • 자손 클래스 조상 클래스의 멤버(필드, 메서드)를 재정의하여 새로운 동작을 구현하는 오버라이딩(Overriding)을 할 수 있다. 
  • 자손 클래스는 조상 클래스보다 더 나은 기능을 제공할 수 있어 대체할 수 있다.
  • 자손 클래스 조상 클래스에서 상속받은 멤버의 접근 제한자를 그 이상으로 바꿀 수 없다.

 

💡 단일 상속 Single Inheritance

자바에서는 클래스는 단일 상속만을 지원하며, 다중 상속은 지원하지 않는다.

다중 상속으로 인해 발생하는 다양한 문제점들을 방지하기 위한 것이다.

 

단일 상속 (Single Inheritance)

  • 클래스 간 명확한 계층 구조를 가지도록 하여 클래스의 구조를 단순하고 명료하게 유지한다.
  • 클래스 간 결합도를 줄여 유지보수와 확장성을 향상한다.
  • 일반적인 프로그래밍 모델이기 때문에, 이를 따르는 것이 일관성 있는 설계를 유지할 수 있다.

 

다중 상속(Multiple Inheritance)

  • 상속한 두 클래스에서 동일한 이름의 메서드나 변수가 존재할 경우 충돌이 발생한다.
  • 여러 클래스에서 같은 메서드를 오버라이딩 하거나 super 키워드를 이용해 호출하는 경우 코드의 복잡도가 증가한다.
  •  각 클래스의 구현 방법이 다르면 조합하는 과정에서 혼란을 가진다.

 

💡 상속 구현

상속을 받을 클래스를 정의한다.

  •  extends 키워드를 사용하여 조상 클래스를 지정한다.
public class ParentClass {
    // 부모 클래스의 속성과 메서드
}

public class ChildClass extends ParentClass {
    // 자식 클래스의 추가적인 속성과 메서드
}

상속받은 클래스를 사용한다.

  • 자손 클래스 조상 클래스의 모든 멤버(필드, 메서드)를 상속받는다.
  • 자손 클래스 조상 클래스의 모든 멤버(필드, 메서드)를 사용할 수 있다.
  • 자손 클래스 조상 클래스의 멤버(필드, 메서드)를 재정의하여 새로운 동작을 구현하는 오버라이딩(Overriding)을 할 수 있다.
public class ChildClass extends ParentClass {
    private int childAttribute;
    
    public void childMethod() {
        // 추가적인 메서드 구현
    }
    
    // 부모 클래스의 메서드 재정의(오버라이딩)
    @Override
    public void parentMethod() {
        // 자식 클래스에서 부모 클래스의 메서드를 재정의하여 구현
    }
}

super 키워드를 사용하여 조상 클래스의 속성, 메서드에 접근한다.

public class ChildClass extends ParentClass {
    private int childAttribute;
    
    public ChildClass(int parentAttribute, int childAttribute) {
        super(parentAttribute); // 부모 클래스의 생성자 호출
        this.childAttribute = childAttribute;
    }
    
    public void childMethod() {
        super.parentMethod(); // 부모 클래스의 메서드 호출
        // 추가적인 메서드 구현
    }
}

메서드 오버라이딩(overriding)을 통해 조상 클래스의 메서드를 재정의한다.

  • @Override 어노테이션을 사용하여 오버라이딩한 메서드임을 명시한다.
public class ChildClass extends ParentClass {
    private int childAttribute;
    
    // 부모 클래스의 메서드 오버라이딩
    @Override
    public void parentMethod() {
        // 자식 클래스에서 부모 클래스의 메서드를 재정의하여 구현
    }
}

 

✅ 참조 변수 super, 생성자 호출 super()

💡 참조 변수 super

자손 클래스에서 조상 클래스의 멤버를 참조할 때 사용한다.

  • 조상 클래스의 생성자나 멤버(필드, 메서드)를 호출할 수 있다.
  • 동일한 이름의 변수를 자손 클래스에서 사용할 경우, super 키워드를 사용하여 조상 클래스의 멤버 변수를 참조할 수 있다.

 

super.필드명
super.메서드명()
class Parent {
    public int x = 10;
}

class Child extends Parent {
    public int x = 20;
    
    public void printX() {
        System.out.println("Parent x: " + super.x); // 부모 클래스의 x 출력
        System.out.println("Child x: " + x); // 자식 클래스의 x 출력
    }
}

 

💡 생성자 호출 super()

자손 클래스의 생성자에서 조상 클래스의 생성자를 호출할 때 사용한다.

  • 자동으로 조상 클래스의 기본 생성자가 호출된다.
  • 반드시 자손 클래스 생성자의 첫 번째 줄에 위치해야 한다.

 

super(인자)
class Parent {
    public Parent(int x) {
        System.out.println("Parent Constructor: " + x);
    }
}

class Child extends Parent {
    public Child(int x, int y) {
        super(x); // 부모 클래스의 생성자 호출
        System.out.println("Child Constructor: " + y);
    }
}

 

✅ Object 클래스

자바의 모든 클래스의 조상 클래스이며, java.lang 패키지에 속해 있다.

자바의 모든 클래스는 Object 클래스를 상속받는다.

 

  • clone(): 객체를 복제하여 새로운 객체를 생성한다.
  • equals(Object obj): 두 객체가 같은지 비교한다.
  • finalize(): 객체가 소멸될 때 호출되는 메서드이다.
  • getClass(): 객체의 클래스 정보를 반환한다.
  • hashCode(): 객체의 해시 코드를 반환한다.
  • notify(): 대기 중인 스레드를 깨운다.
  • notifyAll(): 대기 중인 모든 스레드를 깨운다.
  • toString(): 객체를 문자열로 변환하여 반환한다.
  • wait(): 다른 스레드의 통지를 기다린다.
  • wait(long timeout): 다른 스레드의 통지를 기다리는 시간을 제한한다.
  • wait(long timeout, int nanos): 다른 스레드의 통지를 기다리는 시간과 나노초를 제한한다.
반응형