40일차 (2) - java (상속)

Yohan·2024년 4월 17일
0

코딩기록

목록 보기
56/156
post-custom-banner

상속(Inheritance)

상속이란?

부모 클래스가 가진 속성과 기능을 자식 클래스가 물려받는 것

  • 위처럼 클래스는 다르지만 가지고있는 속성과 기능이 너무나 비슷한 것을 볼 수 있다. 이럴 경우 상속을 이용한다.
  • Animal 이라는 클래스를 추가하여 공통으로 가지고 있던 속성과 기능들을 모두 모아놓는다. 그리고 이를 부모 클래스로 지정한다.
  • 나머지 동물 클래스들이 Animal 이라는 부모 클래스를 상속받는 형식으로 구축
  • 이렇게 작성하면 클래스마다 중복되는 속성과 기능을 일일히 작성할 필요가 없게되고 각자가 가지는 고유한 속성들만을 클래스에 추가하여 개념 확장 가능

상속 정리

  • 단일 상속 만을 지원한다. 즉, 부모는 한 명이어야 한다는 것
  • 어떤 클래스가 다른 클래스로부터 상속을 받아 만들어지면 새롭게 만들어진 클래스는 자식 클래스 라고 부르며, 필드와 메서드를 물려준 클래스는 부모 클래스 라고 부른다.
  • 상속을 하면 부모 클래스의 필드와 메서드가 자식 클래스에게 상속된다. 하지만 부모 클래스의 생성자는 상속되지 않는다.
    -> 생성자는 상속 X, 각자 만들어줘야함!
  • 부모의 private 멤버는 상속 대상에서 제외
  • 상속 키워드는 extends 사용
  • 자바의 모든 클래스는 Object클래스를 상속하고 있다. (최상위 클래스)
    -> 그래서 Object 클래스에서 제공하는 메서드를 사용 가능 (toString 등 외 다수)

오버라이딩(overriding) - 메서드 재정의

부모 클래스로부터 상속 받은 메서드를 자식 클래스에서 다시 정의해서 사용하는 것

  • 부모 클래스에서 어떠한 용도로 사용하던 메서드를 자식 클래스에서 다른 용도로 사용할 때 필요
//부모 클래스
public class Animal {
  public void makeSound() {
    System.out.println("동물이 소리를 내고 있습니다.");
  }
}

/////////////////////////////////////////////////////////

public class Cat extends Animal {
  @Override // 오버라이딩 문법 체크
  public void makeSound() {
    System.out.println("야옹~");
  }
}

public class Dog extends Animal {
  @Override // 오버라이딩 문법 체크
  public void makeSound() {
    System.out.println("멍멍!");
  }
}

/////////////////////////////////////////////////////////

public class Main {
  public static void main(String[] args) {
    Animal animal1 = new Cat();
    animal1.makeSound(); // "야옹~"
    
    Animal animal2 = new Dog();
    animal2.makeSound(); // "멍멍!"
  }
}
  • @Override 를 통해 오버라이딩 문법이 잘됐나 잘못되었나 체크

오버라이딩 규칙

  1. 부모가 물려주는 메서드와 이름이 동일해야 한다.
  2. 부모가 물려주는 메서드와 매개변수 선언이 동일해야한다.
  3. 부모가 물려주는 메서드와 리턴 타입이 같아야 한다.
  4. 접근 제한자는 같거나 더 넓어야 한다. (more public)
    -> 부모 클래스가 defalut면 자식 클래스는 최소 default이고 protected, public가능
  • 한마디로 메서드의 틀을 바꾸지 말라는 뜻!!

상속 예시

  • Player 라는 상위 클래스 (super class)
package day07.player;

// 상위 클래스 (super class)
// : 공통 속성(field)과 기능(method)을 가진 부모 클래스
public class Player extends Object {

    String nickname;
    int level;
    int hp;
    int exp;

    // 현재 캐릭터 정보를 출력
    public void showStatus() {
        System.out.println("\n======= Character's Info ========");
        System.out.println("# name: " + this.nickname);
        System.out.println("# level: " + this.level);
        System.out.println("# hp: " + this.hp);
    }
}
  • Warrior라는 하위 클래스 (sub class)
    • 부모 클래스에 있던 showStatus()를 가져올 때 super.showStatus(); 를 이용해서 그대로 가져올 수 있음!
      -> super는 부모를 의미
package day07.player;

// 하위 클래스 (sub class)
// : 상위 클래스로부터 공통 필드와 메서드를 내려받은 클래스
public class Warrior extends Player {

    int rage; // 분노게이지

    public Warrior(String nickname) {
        this.nickname = nickname;
        this.level = 1;
        this.hp = 50;
        this.rage = 100;
    }

    public void dash(Warrior target) {
        System.out.printf("DASH 스킬을 사용합니다.");
    }

    // 오버라이딩: 부모가 물려준 메서드를 고쳐 쓰는 것
    // 규칙: 부모가 물려준 형태를 유지할 것 (파라미터, 리턴타입, 이름)
    //      접근제한자는 부모보다 more public 할 것!
    // -> 부모가 default면 자식은 default, protected, public (더 more public하게)

    @Override // 오버라이딩 룰을 지켰는지 검증
    public void showStatus() {
        super.showStatus();
        System.out.println("# rage: " + this.rage);
    }
}
profile
백엔드 개발자
post-custom-banner

0개의 댓글