상속 Inheritance
상속(Inheritance)은 객체 지향 프로그래밍(OOP)에서 중요한 개념 중 하나이다. 상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말한다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있다. 자식 클래스 이름 옆에 'extends 부모 클래스명' 을 입력하면 접근 제어 지시자 private를 제외하고 모두 상속받을 수 있다. protected는 자식 클래스만 접근이 가능하다.
extends 는 '내밀다, 연장하다, 확장하다, 뻗다' 라는 의미이다. 자식 클래스는 부모 클래스를 상속 받아서 자기 기능을 확장한다. 순서로는 부모 클래스가 먼저지만 기능적인 면에서는 자식 클래스가 더 크다.
이를 위해 상속에서는 클래스 두 개가 필요하다.
☞ 부모 클래스(Parent Class) 또는 슈퍼 클래스(Super Class) : 기존에 정의된 클래스. 상속 대상이 되는 클래스이다. 부모 클래스의 속성과 메서드를 자식 클래스에게 상속한다.
☞ 자식 클래스(Child Class) 또는 서브 클래스(Sub Class) : 부모 클래스를 확장하여 새롭게 정의되는 클래스이다. 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받는다.
// 상속하는 클래스 = 부모 클래스 = 슈퍼 클래스
public class A{
String name;
int height;
int weight;
int age;
}
// 자바 파일 한 개 안에는 클래스 여러 개를 작성할 수 있다.
// 그러나 public 클래스는 오직 하나만 정의 가능하다.
class B extends A{
// 보이지는 않지만 부모 클래스를 물려 받았다.
// 자식 클래스에서 추가할 수 있다.
int level;
int nickName;
String phone;
}
오버라이드 Override
오버라이드(Override)란 상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의(다시 정의)하는 것을 말한다. 즉 자식 클래스에서 부모 클래스의 메서드를 새로운 내용으로 구현하는 것이다. 이렇게 하면 자식 클래스는 부모 클래스의 메서드를 덮어쓰게 되므로 부모 클래스의 메서드 대신에 자식 클래스에서 정의한 메서드가 호출된다.
public class Cal{
public int multiply(int n1, int n2){
return n1 * n2;
}
}
// Q. 곱하기 할 때 0을 넣지 말라고 전달하고 싶다.
class Cal2 extends Cal{
// 부모 코드의 기능을 변경(재정의)하고 싶다면 오버라이드 처리한다.
@Override // <-- Annotation
public int multiply(int n1, int n2){
// 둘 중 하나라도 0이면 문구를 출력하고 싶다. --> 논리 합
if(n1 == 0 || n2 == 0){
System.out.println("0을 입력하지 마시오.");
}
return n1 * n2;
}
}
부모와 자식 클래스 생성 순서
public class Cal{
public Cal(){
System.out.println("Cal() 부모 생성자 호출");
}
public int multiply(int n1, int n2){
System.out.println("2.호출");
System.out.println("여기는 부모 클래스 메서드입니다.");
return n1 * n2;
}
} // end of class Cal
class Cal2 extends Cal{
public Cal2(){
System.out.println("Cal2() 자식 생성자 호출");
}
@Override
public int multiply(int n1, int n2){
System.out.println("1.호출");
return super.multiply(n1, n2);
}
}
아래와 같이 자식 클래스로 생성자를 만들고 Override한 메소드 multiply를 사용하면 상속관계는 어떻게 동작할까?
public class CalTest{
public static void main(String[] args){
Cal2 cal2 = new Cal2();
System.out.println(cal2.multiply(2,5));
} // end of main
} // end of class
상속관계 동작 순서
오버라이드 연습문제
단, 부모 클래스(Super class)에 기본 생성자를 만들지 않고 해결해야 한다.
public class Hero{
String name;
int hp;
public Hero(String name, int hp){
this.name = name;
this.hp = hp;
}
void attack(){}
}
public calss Warrior extends Hero{
public Warrior(String name, int hp){
super(name,hp); // 부모 생성자 호출
}
// 오버라이드
@Override
void attack(){
System.out.println("전사가 기본 공격을 합니다.");
}
void comboAttack(){
System.out.println("전사가 2단 공격을 합니다.");
}
}
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 + "가 불화살 공격을 합니다.");
}
}
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("마법사가 얼음 공격을 합니다.");
}
}
오답노트
처음에 자식 클래스에서 매개변수 String name, int hp를 넣은 사용자 정의 생성자를 만드려고 하니 부모 클래스에 기본 생성자가 없기 때문에 만들 수가 없다고 에러가 났다. 그래서 부모 클래스에 기본 생성자를 만들었으나 다른 방법으로 해결하는게 이번 문제 핵심이었다. this 사용법을 참고해서 자식 클래스 생성자에 부모 클래스를 호출하면 된다.
메소드 오버로딩으로 만든 게임에 상속 추가해보기
'Java' 카테고리의 다른 글
Association(연관관계) (0) | 2024.04.25 |
---|---|
Composition(포함관계) (0) | 2024.04.24 |
Method Overloading 메서드 오버로딩 (0) | 2024.04.23 |
Static 변수 (1) | 2024.04.19 |
Constructor & Overloaded Constructor (생성자와 생성자 오버로딩) (1) | 2024.04.18 |