상속에 대한 개념을 이해하자.
학습 목표
1. 상속에 대한 개념을 이해하자.
2. 오버라이딩 이란 뭘까?

상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.
상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말합니다.
상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있습니다.
이를 위해 상속에서는 두 개의 클래스가 필요합니다:
- 부모 클래스(Parent Class) 또는 슈퍼 클래스(Superclass)
기존에 정의된 클래스로, 상속의 대상이 되는 클래스입니다.
부모 클래스의 속성과 메서드를 자식 클래스에게 상속합니다. - 자식 클래스(Child Class) 또는 서브 클래스(Subclass)
부모 클래스를 확장하여 새롭게 정의되는 클래스입니다.
자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다.
시나리오 코드 1
package basic.ch17;
// 상상력 추가
// A 라는 클래스를 선임이 작성한 코드라고 과정
public class A {
String name;
int height;
int weight;
int age;
// 코드를 추가해 달라고 요청
// 1. 잘 돌아가고 있는 코드를 바로 수정 ...
// 2. ctrl + v 하는 방법
}
// 단. 하나의 자바 파일안에 여러개의 클래스를 작성할 수 있다.
// 단. public 클래스는 오직 하나만 정의 가능하다.
// 복사 붙여 넣기도 가능
class B {
// public 클래스는 오직 하나만 정의 가능하다.
// public 없이 class 만 있으면 패키지 ch17 안에서만 접근 가능하다.
String name;
int height;
int weight;
int age;
int level;
String nickName;
}
// 상속이라는 문법을 배운 개발자라면
class C extends A {
// 클래스 C가 A를 상속하겠다.
int level;
int nickName;
int phone;
}
package basic.ch17;
/*
* OOP 란?
* 객체와 객체간에 관계를 형성하고
* 상호작용하게 코드를 설계해 나가는 것
*
* 상속
*
*/
public class CTest {
public static void main(String[] args) {
C c = new C();
c.name = "A";
} // end of main
} // end of class
package basic.ch17;
public class Cal {
public int sum(int n1, int n2) {
return n1 + n2;
}
public int multiply(int n1, int n2) {
return n1 * n2;
}
// 코드 테스트
public static void main(String[] args) {
Cal2 cal2 = new Cal2();
System.out.println(cal2.sum(5, 3));
System.out.println(cal2.minus(10, 3));
System.out.println(cal2.multiply(10, 0));
} // end of main
}
class Cal2 extends Cal {
public int minus(int n1, int n2) {
return n1 - n2;
}
// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면
// 오버라이드 이라고 한다.
// 오버라이딩 부모Class의 기능을 재정
public int multiply(int n1, int n2) {
// a 또는 b --> 논리 연산자 --> 논리 합 --> 두개 중 하나라도 True 라면 True
// a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 True 여야 --> True 이다.
if(n1 == 0 || n2 == 0) { // 두개 중 하나라도 0 이라면
System.out.println("0을 입력하지 마시오");
}
return n1 * n2;
}
}
부모 클래스가 먼저 존재해야 자식 클래스가 생성 될 수 있다.
super. <- 부모 객체를 가르킨다.
package basic.ch17;
public class Cal {
public Cal() {
System.out.println("Cal() 부모 생성자 호출");
}// Cal 생성자
public int sum(int n1, int n2) {
return n1 + n2;
} // 원시코드 부모코드 같은 의미
public int multiply(int n1, int n2) {
System.out.println("2. 호출");
System.out.println("여기는 부모 클래스 메서드 입니다.");
return n1 * n2;
} // 원시코드 부모코드 같은 의미
public static void main(String[] args) {
Cal2 cal2 = new Cal2();
System.out.println(cal2.sum(5, 3));
System.out.println(cal2.minus(10, 3));
System.out.println(cal2.multiply(10, 0));
}
} // end of Cal class
class Cal2 extends Cal {
// Cal2 가 Cal 에게 상속받았다. : extends
public Cal2() {
System.out.println("Cal2() 자식 생성자 호출");
} // Cal2 생성자
public int minus(int n1, int n2) {
return n1 - n2;
}
// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면
// 오버라이드 이라고 한다.
// 오버라이딩 부모Class의 기능을 재정
// a 또는 b --> 논리 연산자 --> 논리 합 --> 두개 중 하나라도 True 라면 True
// a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 True 여야 --> True 이다.
// public int multiply(int n1, int n2) {
// if(n1 == 0 || n2 == 0 ) { // 두개 중 하나라도 0 이라면
// System.out.println("0을 입력하시오 마시오");
// }
// System.out.println("자식 클래스에서 호출 된 multiply 메서드");
// return n1 * n2;
// }
@Override // <-- 애노티이션, 어노테이션 --> 주석 + 힌트
public int multiply(int n1, int n2) {
System.out.println("1. 호출");
return super.multiply(n1, n2);
// super 클래스는 부모를 가르킨다.
// super.multiply()는 부모의 메서드를 가르킨다.
}
} // end of Cal2 class
코드 설계

package basic.ch17;
public class Hero {
// 멤버변수
String name;
int hp;
public Hero(String name, int hp) {
this.name = name;
this.hp = hp;
} // 생성자
void attack() {
}
} // end of class
package basic.ch17;
public class Warrior extends Hero {
public Warrior(String name, int hp) {
super(name, hp); // 생성자 만들고 super()사용
}
// 오버라이드
@Override
void attack() {
System.out.println("전사가 기본 공력을 합니다");
}
void vomboAttack() {
System.out.println("전사가 2단 공격을 합니다.");
}
}
package basic.ch17;
public class Archer extends Hero {
public Archer(String name, int hp) {
super(name, hp);
}
@Override
void attack() {
System.out.println("궁수가 기본 공력을 합니다.");
}
void fireArrow() {
System.out.println(name + " 가 불화살 공격을 합니다");
}
}
package basic.ch17;
public class Wizard extends Hero {
public Wizard(String name, int hp) {
super(name, hp); // 부모 생성자 호출
}
@Override
void attack() {
System.out.println("마법사가 기본 공격을 합니다.");
}
void freezing() {
System.out.println("마법사가 얼음 공격을 합니다");
}
}
package basic.ch17;
public class HeroTest {
public static void main(String[] args) {
Warrior warrior1 = new Warrior("야스오", 100);
Archer archer1 = new Archer("애쉬", 100);
Wizard wizard1 = new Wizard("라이", 100);
warrior1.attack();
}
}
'Java' 카테고리의 다른 글
| 2024.04.23 Composition(포함관계) (2) (0) | 2024.04.23 |
|---|---|
| 2024.04.23 Composition(포함관계) (0) | 2024.04.23 |
| 2024.04.23 메서드 오버로딩 (0) | 2024.04.23 |
| 2024.04.22 전화번호관리 프로그램 만들기 (0) | 2024.04.22 |
| 2024.04.22 배열에 활용 (도서 관리 프로그램) (0) | 2024.04.22 |