Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 형 변환
- this예약어
- 상수
- function
- continue문
- 자바 멀티스레딩
- 메서드
- break문
- 인텔리제이 한글 깨짐 해결법
- 컴파일
- 반복문
- 생성자
- java변수
- IntelliJ IDEA
- for문
- 연관관계
- 인텔리제이 기초 설정
- Java
- 포함관계
- 시스템 환경 변수 편집
- 접근제어지시자
- JAVA기초
- OPP개념
- 집합관계
- JAVA객체지향
- multi-threading
- Thread
- While
- Java데이터 타입
- 메서드 오버로딩
Archives
- Today
- Total
최원종의 개발 블로그
상속(Inheritance) 본문
상속은 객체 지향 프로그래밍에서 중요한 개념 중 하나.
상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘
상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있다.
상속에서는 두 개의 클래스가 필요.
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 |


