상세 컨텐츠

본문 제목

[Java] 상속(Inheritance)

카테고리 없음

by G_Batman 2025. 2. 27. 01:47

본문

728x90


상속이란?

상속은 이미 존재하는 클래스를 바탕으로, 변수나 메서드를 물려받아 사용하는 개념입니다.

즉, 부모(상위) 클래스가 가진 기능을 자식(하위) 클래스가 이어받아서 재사용하거나 확장할 수 있습니다.


사용 이유

  1. 코드 재사용성 향상
    • 이미 만들어진 클래스의 코드를 재사용하여 중복 코드를 줄일 수 있습니다
  2. 유지보수 용이
    • 공통 기능은 부모 클래스에 모아두고, 수정이 필요할 때 부모 클래스만 수정하면 자식 클래스들이 한꺼번에 영향을 받습니다
  3. 확장성 증가
    • 자식 클래스는 부모 클래스에서 받은 기능을 토대로 추가 기능이나 새로운 구현 방법을 적용할 수 있습니다

상속의 기본 문법

자바에서 클래스를 상속할 때는 extends 키워드를 사용합니다

(예시 코드)

// 부모 클래스
class Animal {
    String name;

    void eat() {
        System.out.println("먹고 있습니다");
    }
}

// 자식 클래스
class Dog extends Animal {
    void bark() {
        System.out.println("멍멍");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();  // Dog는 Animal을 상속받았으므로
        dog.name = "마루";      // Animal 클래스의 name 필드 사용 가능
        dog.eat();            // Animal 클래스의 eat 메서드 사용 가능
        dog.bark();           // Dog 클래스에서 새로 정의한 bark 메서드
    }
}
  • 자식 클래스 Dog는 extends Animal을 통해 Animal 클래스의 필드와 메서드를 물려받았습니다
  • Dog 객체를 만들면 Animal에서 정의된 기능(예: name, eat())도 그대로 사용할 수 있습니다

부모와 자식 클래스

  • 부모(상위) 클래스: 다른 클래스에게 물려줄 공통된 기능을 가진 클래스
  • 자식(하위) 클래스: 부모 클래스로부터 기능을 물려받아 쓰는 클래스

자식 클래스는 부모 클래스의 모든 멤버를 갖지만 접근 제어자(public, protected, private 등)에 따라 실제 사용 가능 여부가 달라집니다

// Parent.java
class Parent {
    public String publicField = "누구나 접근 가능";
    protected String protectedField = "자식 클래스에서 접근 가능";
    private String privateField = "해당 클래스에서만 접근 가능";
    
    public void publicMethod() {
        System.out.println("public 메서드");
    }
    
    protected void protectedMethod() {
        System.out.println("protected 메서드");
    }
    
    private void privateMethod() {
        System.out.println("private 메서드");
    }
}

// Child.java
class Child extends Parent {
    void accessTest() {
        System.out.println(publicField);      // 가능
        System.out.println(protectedField);   // 가능
        // System.out.println(privateField);  // 불가능 - 컴파일 에러
        
        publicMethod();      // 가능
        protectedMethod();   // 가능
        // privateMethod();  // 불가능 - 컴파일 에러
    }
}
  • 위 두 개의 자바 코드를 같은 패키지에 넣고 테스트해보시면 그 차이를 금방 확인할 수 있습니다.

메서드 오버라이딩(Overriding)

상속을 받았을 때, 부모 클래스의 메서드를 그대로 사용할 수도 있지만, 자식 클래스에서 재정의(오버라이딩) 할 수도 있습니다.

재정의란 부모의 메서드를 자식이 덮어써서 새롭게 만드는 것을 말합니다

class Animal {
    void eat() {
        System.out.println("동물이 먹고 있습니다");
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        System.out.println("강아지가 사료를 먹고 있습니다");
    }
}
  • @Override 어노테이션은 자식 클래스가 부모 클래스의 메서드를 재정의했다는 표시입니다.
  • 메서드 이름을 일치시켜야합니다.
  • 이렇게 재정의하면 자식 클래스의 메서드가 우선적으로 호출됩니다.

super 키워드

오버라이딩된 메서드 안에서 부모 메서드를 호출하고 싶다면 super 키워드를 사용할 수 있습니다

class Animal {
    void eat() {
        System.out.println("동물이 먹고 있습니다");
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        super.eat(); // 부모의 eat() 호출
        System.out.println("강아지가 사료를 먹고 있습니다");
    }
}
  • 이렇게 하면 부모의 기능을 살리면서 자식 클래스만의 새로운 로직을 추가할 수 있습니다

한 단계 더 나아가기

다중 상속이 불가능한 이유

자바는 단일 상속만을 지원합니다

즉, 한 클래스가 오직 하나의 부모 클래스만을 상속받을 수 있습니다

여러 부모 클래스를 동시에 상속받으면 같은 메서드 이름이 여러 곳에서 정의되어 충돌이 발생할 수 있기 때문입니다

이 문제를 피하기 위해 인터페이스를 사용해 다중 구현을 지원하는 방식으로 자바는 구조화되어 있습니다

728x90

댓글 영역