Categories: Java

Java 자바 상속 (Inheritance) 특징 및 사용법

상속이란?

자바에서 상속은 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나입니다. 상속은 클래스 간에 코드를 재사용하고 클래스의 계층 구조를 형성하는 데 사용됩니다.

자바에서 클래스는 다른 클래스로부터 상속을 받을 수 있습니다. 상속을 통해 부모 클래스의 특성과 메소드를 자식 클래스가 물려받을 수 있습니다. 상속은 코드의 재사용성을 높이고 유지보수를 쉽게 만들어줍니다.

상속의 특징

상속은 객체 지향 프로그래밍에서 중요한 특징 중 하나로, 클래스 간의 계층 구조를 형성하여 코드의 재사용성을 높이는 메커니즘입니다. 다음은 상속의 주요 특징에 대한 설명입니다.

  1. 코드 재사용성: 상속을 통해 부모 클래스의 특성과 메소드를 자식 클래스가 물려받을 수 있습니다. 이로 인해 코드의 중복을 방지하고, 공통된 기능이나 속성을 여러 클래스에서 공유할 수 있습니다.
  2. 계층 구조: 상속은 클래스 간에 계층 구조를 형성합니다. 부모 클래스와 그로부터 파생된 자식 클래스들이 서로 다른 레벨에 위치하여 클래스 간의 관계를 명확히 합니다.
  3. 확장성: 새로운 기능이나 속성을 추가하고 싶을 때, 기존 클래스를 수정하지 않고 새로운 클래스를 만들어 부모 클래스를 상속받을 수 있습니다. 이는 기존 코드에 영향을 미치지 않으면서도 새로운 기능을 추가할 수 있게 합니다.
  4. 다형성(Polymorphism): 상속은 다형성을 지원합니다. 부모 클래스 타입의 변수로 자식 클래스의 객체를 참조할 수 있습니다. 이는 코드의 유연성을 높여주며, 같은 메소드 호출에 대해 다양한 동작을 수행할 수 있습니다.
  5. 접근 제어: 상속 관계에서 부모 클래스의 멤버에 대한 접근 권한을 지정할 수 있습니다. public, protected, private 등의 접근 제어자를 사용하여 캡슐화를 유지하면서도 필요한 부분을 외부에 노출하거나 제한할 수 있습니다.
  6. 단일 상속: 자바에서는 단일 상속만 허용됩니다. 즉, 한 클래스는 하나의 부모 클래스만을 상속할 수 있습니다. 이는 클래스 간의 관계를 명확하게 유지하고 복잡성을 줄이는 데 도움이 됩니다.

상속 사용법

자바에서 상속을 사용하는 방법은 다음과 같습니다.

부모 클래스 생성

먼저, 부모 클래스를 정의합니다. 이 클래스는 공통된 특성이나 메소드를 포함합니다.

Java
// 부모 클래스
class 부모클래스 {
    int 부모변수;

    void 부모메소드() {
        System.out.println("부모 메소드");
    }
}
Java

자식 클래스 생성 및 상속

자식 클래스를 정의하고, extends 키워드를 사용하여 부모 클래스를 상속받습니다.

Java
// 자식 클래스
class 자식클래스 extends 부모클래스 {
    int 자식변수;

    void 자식메소드() {
        System.out.println("자식 메소드");
    }
}
Java

객체 생성 및 사용

자식 클래스의 객체를 생성하고, 부모 클래스의 멤버와 자식 클래스의 멤버를 사용할 수 있습니다.

Java
public class Main {
    public static void main(String[] args) {
        // 자식 클래스의 객체 생성
        자식클래스 자식 = new 자식클래스();

        // 부모 클래스의 변수 및 메소드 사용
        자식.부모변수 = 10;
        자식.부모메소드();

        // 자식 클래스의 변수 및 메소드 사용
        자식.자식변수 = 20;
        자식.자식메소드();
    }
}
Java

💡상속을 통해 부모 클래스의 특성을 재사용하고, 자식 클래스에서 필요에 맞게 확장 및 수정하여 유연하게 프로그램을 구성할 수 있습니다.

메소드 오버라이딩

메소드 오버라이딩은 자식 클래스에서 부모 클래스의 메소드를 재정의하는 개념입니다. 이를 통해 자식 클래스는 부모 클래스에서 상속받은 메소드를 자신의 필요에 맞게 재정의할 수 있습니다. 메소드 오버라이딩을 통해 동일한 메소드 이름을 가지면서도 각 클래스의 특성에 맞게 동작을 변경할 수 있습니다.

메소드 오버라이딩의 조건

  1. 메소드 시그니처 동일성: 오버라이딩하는 메소드는 부모 클래스의 메소드와 시그니처(이름, 매개변수 타입 및 순서, 반환 타입)가 동일해야 합니다.
  2. 접근 제어자: 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스에서의 접근 제어자와 동일하거나 넓은 범위로 변경할 수 있습니다.
  3. 예외 처리: 오버라이딩하는 메소드에서는 부모 클래스의 메소드와 동일한 예외를 던지거나 그 예외의 하위 클래스를 던질 수 있습니다. 그러나 더 많은 예외를 던질 수는 없습니다.

예제

Java
// 부모 클래스
class 부모클래스 {
    void 메소드() {
        System.out.println("부모 메소드");
    }
}

// 자식 클래스
class 자식클래스 extends 부모클래스 {
    // 부모 클래스의 메소드를 오버라이딩
    @Override
    void 메소드() {
        System.out.println("자식 메소드로 재정의");
    }
}

public class Main {
    public static void main(String[] args) {
        // 자식 클래스의 객체 생성
        자식클래스 자식 = new 자식클래스();

        // 오버라이딩된 메소드 호출
        자식.메소드(); // "자식 메소드로 재정의"
    }
}
Java

💡위의 예제에서 자식클래스는 부모클래스의 메소드를 오버라이딩하여 새로운 내용으로 구현했습니다. 메소드 오버라이딩을 통해 자식 클래스에서는 부모 클래스의 동일한 이름의 메소드를 새로운 동작으로 바꿀 수 있습니다.

super

super는 자바에서 사용되는 키워드 중 하나로, 주로 상속 관계에서 부모 클래스의 멤버에 접근할 때 또는 부모 클래스의 생성자를 호출할 때 사용됩니다. super는 다음과 같은 기능을 수행합니다:

부모 클래스의 멤버에 접근

자식 클래스에서 부모 클래스와 동일한 이름의 멤버(변수 또는 메소드)가 있는 경우, super 키워드를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다.

Java
class 부모클래스 {
    int 변수 = 10;

    void 메소드() {
        System.out.println("부모 메소드");
    }
}

class 자식클래스 extends 부모클래스 {
    int 변수 = 20;

    void 메소드() {
        System.out.println("자식 메소드");
        System.out.println("자식 변수: " + 변수);
        System.out.println("부모 변수: " + super.변수); // super를 사용하여 부모 클래스의 변수에 접근
        super.메소드(); // super를 사용하여 부모 클래스의 메소드 호출
    }
}
Java

부모 클래스의 생성자 호출

자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 사용됩니다. 부모 클래스의 생성자는 super()를 통해 호출됩니다. 만약 부모 클래스의 매개변수를 갖는 생성자를 호출해야 한다면, super(매개변수)와 같이 사용합니다.

Java
class 부모클래스 {
    부모클래스() {
        System.out.println("부모 클래스의 기본 생성자");
    }

    부모클래스(int 매개변수) {
        System.out.println("부모 클래스의 매개변수를 갖는 생성자");
    }
}

class 자식클래스 extends 부모클래스 {
    자식클래스() {
        super(); // 부모 클래스의 기본 생성자 호출
    }

    자식클래스(int 매개변수) {
        super(매개변수); // 부모 클래스의 매개변수를 갖는 생성자 호출
    }
}
Java

💡super를 사용하여 부모 클래스의 멤버에 접근하거나 생성자를 호출함으로써, 상속된 클래스 간의 관계를 구성하고 유연하게 코드를 작성할 수 있습니다.

결론

상속은 자바에서 객체 지향 프로그래밍의 핵심 개념 중 하나로, 부모 클래스의 특성과 메소드를 자식 클래스가 물려받아 코드의 재사용성을 높이는 메커니즘입니다. 이를 통해 계층 구조를 형성하고, 코드를 간결하게 구성할 수 있습니다. 부모 클래스의 멤버에 접근할 때는 super 키워드를 사용하며, 필요에 따라 메소드를 재정의하여 새로운 동작을 정의할 수 있습니다. 상속을 사용하면 코드의 유연성과 구조화된 관계를 유지할 수 있어 효율적인 프로그래밍이 가능합니다.

suover

Recent Posts

Java 자바 Set – HashSet, TreeSet, LinkedHashSet 정리

소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…

1개월 ago

Java 자바 Hash 해시 제대로 이해하기

해시(Hash)란 무엇인가? 해시(Hash)는 자바 프로그래밍에서 빠르고 효율적인 데이터 저장 및 검색을 위한 핵심적인 개념입니다. 이…

2개월 ago

Java 자바 리스트 (List) 정리

List란 무엇인가? List는 자바 컬렉션 프레임워크의 핵심 인터페이스 중 하나로, 순서가 있는 데이터를 다루는 데…

2개월 ago

Java 자바 LinkedList 동작 원리와 사용법

LinkedList란 무엇인가? LinkedList는 자바에서 유용하게 사용되는 자료구조 중 하나로, 연결 리스트 방식을 이용하여 데이터를 관리하는…

2개월 ago

Java 자바 ArrayList 동작 원리와 사용법

ArrayList란 무엇인가? ArrayList는 자바에서 가장 널리 사용되는 컬렉션 중 하나로, 가변 크기의 배열을 구현한 클래스입니다.…

2개월 ago

Java 자바 제네릭(Generic) 개념과 문법 알아보기

제네릭(Generic)이란? 자바 제네릭은 코드의 재사용성을 높이고 타입 안전성을 보장하는 중요한 개념입니다. 이 블로그 글에서는 자바…

2개월 ago