일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- swagger
- Sequelize
- 조건문
- Nest.js
- state
- javascript
- 개발이 취미인 사람
- Producer
- vue
- java
- file upload
- kafka
- back-end
- It
- 자바
- 개발자
- SWIFT
- component
- 코틀린
- 상속
- props
- class
- 반복문
- front-end
- node.js
- react
- restful api
- spring boot
- AWS
- Kotlin
- Today
- Total
개발이 취미인 사람
[Java] 클래스 상속 개념 및 사용법 본문
- 지난 시간
안녕하세요. 지난 시간에는 Java Class Method에 대해 알아봤습니다.
Java Class와 Java Class Method를 잘 이해하지 못하셨다면, 아래 링크를 통해 학습을 하고 오시는 걸 추천드립니다. :)
Java Class : any-ting.tistory.com/29
Java Class Method : any-ting.tistory.com/30
- 개요
자바라는 언어는 객체지향 언어입니다. 우리는 이번 시간에 왜 자바라는 언어가 객체지향 언어인지 알 수 있게 됩니다.
상속이란?? : 상속은 말 그대로 "부모로부터 자식에게 무언가를 물려주는 것"입니다.
보통 우리는 부모님께 성(이름), 성향, 얼굴형, 유전자 등등 여러 가지를 물려받습니다.
예시로 우리가 보통 게임을 하면 초보자로 시작해서 직업을 선택해서 등급이 올라갑니다.
위 그림과 같은 구조일 거예요. (제가 게임을 안 해서... 직업이 생각이...)
보통 초보자 때는 일반 공격만 가능하다가, 전직을 하면 이제 스킬을 사용할 수 있게 되죠?
전사와 마법사는 스킬은 다르지만 기본 일반 공격은 공통입니다. 이러한 상황에서는 초보자는 전사 마법사에게 기능을 상속해주면 됩니다.
코드로 만들어 보겠습니다.
- 초보자 클래스
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 감소된 걸 확인할 수 있습니다.
이번 시간에는 자바 클래스 상속에 대해 알아봤습니다. 감사합니다.
모르시거나 헷갈리시는 분들은 댓글을 남겨주세요. :)
'언어(Programming Language) > Java' 카테고리의 다른 글
[Java] 추상(abstraction) 클래스와 인터페이스(Interface) (0) | 2021.01.28 |
---|---|
[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) 개념 및 사용법 (1) | 2021.01.26 |
[Java] Class Method 사용법 (6) | 2021.01.24 |
[Java] Class 개념 및 사용법 (0) | 2021.01.24 |
[Java] 반복문 for 문 for each 문 (0) | 2021.01.23 |