개발이 취미인 사람

[Java] 클래스 상속 개념 및 사용법 본문

언어(Programming Language)/Java

[Java] 클래스 상속 개념 및 사용법

RyanSin 2021. 1. 25. 23:33
반응형

- 지난 시간

안녕하세요. 지난 시간에는 Java Class Method에 대해 알아봤습니다.

 

Java Class와 Java Class Method를 잘 이해하지 못하셨다면, 아래 링크를 통해 학습을 하고 오시는 걸 추천드립니다. :)

 

Java Class : any-ting.tistory.com/29

 

[Java] Class 개념 및 사용법

- 개요 안녕하세요. 이번 시간에는 자바에서 제일 어려운 개념인... Class(클래스)에 대해 알아보겠습니다. 일단 Class란 무엇일까요?? 딱 머릿속에 생각나는 게 없네요... 등급인가?... 반인가?... 학

any-ting.tistory.com

Java Class Method : any-ting.tistory.com/30

 

[Java] Class Method 사용법

- 지난 시간 안녕하세요. 이번 시간에는 Java Class에 대해 알아봤습니다. 혹시 놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드립니다... :) Class를 잘 알지 못하면 메서드를 잘 이

any-ting.tistory.com

- 개요

자바라는 언어는 객체지향 언어입니다. 우리는 이번 시간에 왜 자바라는 언어가 객체지향 언어인지 알 수 있게 됩니다.

 

상속이란?? : 상속은 말 그대로 "부모로부터 자식에게 무언가를 물려주는 것"입니다.

 

부모 => 자식 상속

보통 우리는 부모님께 성(이름), 성향, 얼굴형, 유전자 등등 여러 가지를 물려받습니다.

 

예시로 우리가 보통 게임을 하면 초보자로 시작해서 직업을 선택해서 등급이 올라갑니다.

 

 

위 그림과 같은 구조일 거예요. (제가 게임을 안 해서... 직업이 생각이...)

 

보통 초보자 때는 일반 공격만 가능하다가, 전직을 하면 이제 스킬을 사용할 수 있게 되죠?

 

전사와 마법사는 스킬은 다르지만 기본 일반 공격은 공통입니다. 이러한 상황에서는 초보자는 전사 마법사에게 기능을 상속해주면 됩니다.

 

코드로 만들어 보겠습니다.

 

- 초보자 클래스

package com.company;

//초보자 클래스
public class Beginner {
    String name; //이름
    int hp; //체력
    int mp; //마나
    int experience; //경험치

    public Beginner(String name, int hp, int mp, int experience) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.experience = experience;
    }

    //일반 공격
    public void attack(Monster monster){
        monster.hp -= 10; // 몬스터에게 10에 데미지를 입힌다.
    }

}

 

- 전사 클래스

package com.company;

//전사 클래스
public class Soldier extends Beginner{

    //전사 클래스 생성
    public Soldier(String name, int hp, int mp, int experience) {
        super(name, hp, mp, experience);
    }
}

 

- 몬스터 클래스

package com.company;

// 몬스터 클래스
public class Monster {
    String name; //이름
    int hp; //체력
    int mp; //마나
    int experience; //경험치

    public Monster(String name, int hp, int mp, int experience) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.experience = experience;
    }

    //일반 공격
    public void attack(Beginner beginner){
        beginner.hp -= 10; // 캐릭터에게 10에 데미지를 입힌다,
    }
}

 

초보자 클래스와 전사 클래스 그리고 몬스터 클래스를 만들었습니다.

 

그리고 아래와 같이 전사 클래스와 몬스터 클래스를 생성했습니다.

package com.company;

public class Main {

    public static void main(String[] args) {

        //전사 클래스 생성! (자식 클래스)
        Soldier soldier = new Soldier("개발이 취미인 사람", 100, 100, 0);

        System.out.println("전사 클래스 정보");
        System.out.println(soldier.name);
        System.out.println(soldier.hp);
        System.out.println(soldier.mp);
        System.out.println(soldier.experience);

        System.out.println();
        System.out.println("-----------------------------");
        System.out.println();

        //몬스터 클래스 생성!
        Monster monster = new Monster("초록 달팽이", 10, 0, 10);

        System.out.println("몬스터 클래스 정보");
        System.out.println(monster.name);
        System.out.println(monster.hp);
        System.out.println(monster.mp);
        System.out.println(monster.experience);

    }
}


// 실행 결과 콘솔화면

전사 클래스 정보
개발이 취미인 사람
100
100
0

-----------------------------

몬스터 클래스 정보
초록 달팽이
10
0
10

 전사 클래스에 name, hp, mp, experience라는 속성을 정의하지 않았다. 하지만 super라는 키워드를 사용해 부모 클래스에 있는 속성을

참조할 수 있습니다.  => super(name, hp, mp, experience)

 

자바에서 super 키워드는 부모 클래스로부터 상속받은 속성이나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조 변수입니다.

 

메서드도 참조할 수 있다고 했습니다. 아래는 메서드를 참조한 코드입니다.

 

package com.company;

//전사 클래스
public class Soldier extends Beginner{

    //전사 클래스 생성 
    public Soldier(String name, int hp, int mp, int experience) {
        super(name, hp, mp, experience);
    }

    // 전사 일반 공격 
    public void attack(Monster monster){
        super.attack(monster);
    }
}

 

전사도 초보자 클래스처럼 같은 attack 메서드를 만들었습니다. 그리고 super.attack(monster) 메서드를 참조했습니다.

 

실행을 해보겠습니다.

package com.company;

public class Main {

    public static void main(String[] args) {

        //전사 클래스 생성! (자식 클래스)
        Soldier soldier = new Soldier("개발이 취미인 사람", 100, 100, 0);

        System.out.println("전사 클래스 정보");
        System.out.println(soldier.name);
        System.out.println(soldier.hp);
        System.out.println(soldier.mp);
        System.out.println(soldier.experience);

        System.out.println();
        System.out.println("-----------------------------");
        System.out.println();

        //몬스터 클래스 생성!
        Monster monster = new Monster("초록 달팽이", 10, 0, 10);

        System.out.println("몬스터 클래스 정보");
        System.out.println(monster.name);
        System.out.println(monster.hp);
        System.out.println(monster.mp);
        System.out.println(monster.experience);
        
        System.out.println();
        System.out.println("-----------------------------");

        System.out.println("몬스터 공격");
        soldier.attack(monster);

        System.out.println();

        System.out.println("몬스터 클래스 정보");
        System.out.println(monster.name);
        System.out.println(monster.hp);
        System.out.println(monster.mp);
        System.out.println(monster.experience);

    }
}

// 실행 결과 콘솔화면

전사 클래스 정보
개발이 취미인 사람
100
100
0

-----------------------------

몬스터 클래스 정보
초록 달팽이
10
0
10

-----------------------------
몬스터 공격

몬스터 클래스 정보
초록 달팽이
0
0
10

// 몬스터 체력이 0으로 변경

우리는 전사 클래스에서 attack 메서드를 선언만 하였고 나머지 기능은 부모 클래스에서 처리했습니다.

 

이런 식으로 자바에서는 자식 클래스는 부모로부터 속성, 기능들을 받아 사용할 수 있습니다. 

 

같은 기능을 중복해서 선언하지 않고 재활용해서 사용할 수 있습니다. 이렇기 때문에 자바는 객체지향 언어입니다.

 

- 응용 (이중 상속)

초보자 => 전사 => 검 전사

//초보자 클래스
public class Beginner {
    String name; //이름
    int hp; //체력
    int mp; //마나
    int experience; //경험치

    public Beginner(String name, int hp, int mp, int experience) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
        this.experience = experience;
    }

    //일반 공격
    public void attack(Monster monster){
        monster.hp -= 10; // 몬스터에게 10에 데미지를 입힌다.
    }

}

//전사 클래스
public class Soldier extends Beginner{

    //전사 클래스 생성
    public Soldier(String name, int hp, int mp, int experience) {
        super(name, hp, mp, experience);
    }

    // 전사 일반 공격
    public void attack(Monster monster){
        super.attack(monster);
    }

    //파워스트라이크 (마법 공격)
    public void powerStrike(Monster monster){

        if(mp == 0){
            System.out.println("마나가 부족합니다.");
            return;
        }

        //전사의 마나를 소모한다.
        mp -=10;

        //몬스터 체력을 감소한다.
        monster.hp -= 20;

    }
}

//검 전사 클래스
public class SwordSoldier extends Soldier{

    public SwordSoldier(String name, int hp, int mp, int experience) {
        super(name, hp, mp, experience);
    }

    //초보자 일반 공격
    public void attack(Monster monster) {
        super.attack(monster);
    }

    //전사 마법 공격
    public void powerStrike(Monster monster) {
        super.powerStrike(monster);
    }
}

 

package com.company;

public class Main {

    public static void main(String[] args) {

        //검 전사 클래스 생성!
        SwordSoldier swordSoldier = new SwordSoldier("개발이 취미인 사람", 100, 100, 0);

        //몬스터 클래스 생성!
        Monster monster = new Monster("초록 달팽이", 10, 0, 10);

        System.out.println("몬스터 클래스 정보");
        System.out.println(monster.name);
        System.out.println(monster.hp);
        System.out.println(monster.mp);
        System.out.println(monster.experience);

        System.out.println();
        System.out.println("-----------------------------");

        System.out.println("검 전사 마법공격");
        swordSoldier.powerStrike(monster);

        System.out.println();

        System.out.println("몬스터 클래스 정보");
        System.out.println(monster.name);
        System.out.println(monster.hp);
        System.out.println(monster.mp);
        System.out.println(monster.experience);
    }
}

//실행 결과 콘솔화면

몬스터 클래스 정보
초록 달팽이
10
0
10

-----------------------------
검 전사 마법공격

몬스터 클래스 정보
초록 달팽이
-10
0
10

 

아까보다 몬스터 체력이 10 감소된 걸 확인할 수 있습니다.

 

이번 시간에는 자바 클래스 상속에 대해 알아봤습니다. 감사합니다.

 

모르시거나 헷갈리시는 분들은 댓글을 남겨주세요. :)