최원종의 개발 블로그

상속(Inheritance) 본문

Java/Java 객체지향

상속(Inheritance)

chl6698 2026. 3. 4. 11:12

상속은 객체 지향 프로그래밍에서 중요한 개념 중 하나.

상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘

상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있다.

 

상속에서는 두 개의 클래스가 필요.

1. 부모클래스(Parent Class) 또는 슈퍼 클래스(Super class): 기존에 정의된 클래스로, 상속의 대상이 되는 클래스.

부모 클래스의 속성과 메서드를 자식 클래스에게 상속

 

2. 자식 클래스(Child Class) 또는 서브 클래스(Subclass): 부모 클래스를 확장하여 새롭게 정의되는 클래스

자식 클래스는  부모 클래스의 모든 속성과 메서드를 상속받는다.

상속


-A

package com.tenco.Inheritance;

//선임이 작성한 코드라고 가정
public class A {

    String name;
    int height;
    int weight;
    int age;
}

 

-B

package com.tenco.Inheritance;

public class B {
    String name;
    int height;
    int weight;
    int age;

    //추가적인 필드를 선언해 본다
    int level;
    String nickName;
    //만약... 상속이라는 기법을 알고 있다면
}

 

-C

package com.tenco.Inheritance;

/**
 * A클래스 (부모클래스)에 속성과 행위를 물려받을 수 있다.
 */

public class C extends A {
    //현재 눈에는 보이지 않지만 자동으로
    // A에 선언된 필드를 물려 받을 수 있다.
    int level;
    String nickName;

    //main함수 (테스트 코드 실행해보기)
    public static void main(String[] args) {
        C c = new C();
        c.name = "자식이 물려받음";
        System.out.println(c.name);
    }
}

부모 클래스에 있는 메서드를( 이름, 매개변수 타입 및 개수 모두 동일하게) 재정의 하는 것을 메서드 오버라이드라고 한다.

 

-Cal

package com.tenco.Inheritance;

public class Cal {

    public Cal(){
        System.out.println("Cal 생성자 호출");
    }
    public int sum(int n1, int n2) {
        return n1 + n1;
    }

    public int multiply(int n1, int n2) {
        return n1 * n2;
    }
}

 

-ChildCal

package com.tenco.Inheritance;

public class ChildCal extends Cal {

    public ChildCal() {
        System.out.println("Cal 생성자 호출");
    }

    //마이너스 기능 추가
    public int minus(int n1, int n2) {
        return n1 - n2;
    }

    //부모 클래스에 있는 메서드를(이름, 매개변수 타입 및 개수 모두 동일하게) 재정의 하는 것이
    //매서드 오버라이드라고 한다.
    public int multiply(int n1, int n2) {
        System.out.println("자식 클래스에 재 정의한 multiply 메소드");
        if (n1 == 0 || n2 == 0) {
            System.out.println("0을 입력하지 마세요");
        }
        return n1 * n2;
    }

    //테스트 코드 작성
    public static void main(String[] args) {
        ChildCal childCal = new ChildCal();
        int resultSum = childCal.sum(10, 20);
        int resultMultiply = childCal.multiply(10, 0);
        //시나리오 2 - 선입 개발자가 곱하는 기능을 호출할 때 인수 값이 0이 들어온다면
        //콘솔창에 0 이라는 숫자는 입력하지 마시오 출력하는 기능을 구현해
        int resultMinus = childCal.minus(10, 5);

        System.out.println("----------------------");
        System.out.println("resultSum : " + resultSum);
        System.out.println(" resultMultiply : " + resultMultiply);
        System.out.println("resultMinus : " + resultMinus);

    }
}

실습 문제

 

 

코드

-Hero

package com.tenco.Inheritance;

public class Hero {
    String name;
    int hp;

    Hero(String name, int hp) {
        this.name = name;
        this.hp = hp;
    }

    void attack() {
        System.out.println("Hero attack() 호출");
        System.out.println("기본 공격");
    }

}

 

-Warrior

package com.tenco.Inheritance;

public class Warrior extends Hero {

    //부모가 메모리에 올라가야 자식이 생성될 수 있다.

    public Warrior(String name, int hp) {
        //super는 상속 관계에 있어서 부모 클래스의
        //생성자를 호출할 수 있는 키워드이다
        super(name, hp);
    }
    
    //부모에 있는 메서드를 재정의 하는 기법을 오버라이드라고 한다
    void attack() {
        System.out.println(name + "이(가) 기본 공격을 합니다");
    }

    void comboAttack() {
        System.out.println("전사가 2단 공격을 합니다");
    }
}

 

-Archer

package com.tenco.Inheritance;

public class Archer extends Hero {
    public Archer(String name, int hp) {
        super(name, hp);
    }

    @Override
        // 부모에 잇는 메서드를 재정의함(컴파일러에게 알려 줌)
    void attack() {
        //super.attack(); // 실제 부모 메서드를 호출하는 코드가 됨
        System.out.println(super.name + "이(가) 기본 공격을합니다");
    }

    void fireArrow() {
        System.out.println("궁수가 불화살 공격을 합니다");
    }

}

 

-Wizard

package com.tenco.Inheritance;

public class Wizard extends Hero {

    public Wizard(String name, int hp) {
        super(name, hp);
    }

    //어노테이션
    // 주석 + 힌트(컴파일러에게)
    @Override
    void attack() {
        System.out.println(super.name + "이(가_공격을 합니다");
    }

    void freezing() {
        System.out.println("마법사가 얼음 공격을 합니다");
    }
}

Class Diagram

 

Class

클래스는 보통 3개 구역으로 나뉜 사각형으로 그린다.

클래스의 이름, 속성 기능을 표기할 수 있으며 이름만 필수로 명시해야 한다.

보통 속성과 기능을 생략해 다이어그램을 그리는 경우는 주로 클래스의 흐름 분석 위주의 작업이다

 

접근 제한자

  • + : public
  • - : private
  •   : default
  • # : protected

속성

  • 접근 제어자 이름: 타입 = 기본값
  • 기본값 생략 가능
  • title: String = ""

기능

  • 접근 제어자 이름(파라미터 속성): 리턴값
  • void 리턴값은 생략 가능
  • +setTitle(String)
  • +getTitle():String
+-----------------------------+
|            User             |
+-----------------------------+
| - id: int                   |
| - name: String              |
+-----------------------------+
| + getTodo(): Todo           |
| + write(String content): void|
+-----------------------------+
+-----------------------------+
|            Todo             |
+-----------------------------+
| - content: String           |
| - isCompleted: boolean      |
+-----------------------------+
| + getContent(): String      |
| + setCompleted(boolean): void|
+-----------------------------+

 

'Java > Java 객체지향' 카테고리의 다른 글

연관관계(Association)  (0) 2026.03.04
상속과 접근제어 지시자  (0) 2026.03.04
메서드 오버로딩  (0) 2026.03.03
전화번호 관리하는 프로그램 만들기  (0) 2026.02.27
Array(배열)  (0) 2026.02.27