[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) 개념 및 사용법
- 지난 시간
안녕하세요. 지난 시간에는 클래스 상속에 대해 알아봤습니다.
혹시 놓치신 분들은 아래 링크를 통해 상속에 대한 개념을 학습하고 오시는 걸 추천드리겠습니다.
- 개요
이번 시간에는 오버 로딩(Overloading)과 오버 라이딩(Overriding)에 대해 알아보겠습니다.
개발자 면접에서는 한 번씩은 꼭 나온 것 같아요~ 저도 면접에서 이 질문을 받았는데 그때는 대답을 못 했던 걸로 기억해요... (개념은 모르지만 정말 잘 사용해서... 나중에 검색하고.. 아 이걸 말하는 거구나 하고 띵~ 했습니다...ㅋㅋ)
- 개념 및 사용법
오버 로딩(Overloading) : 오버 로딩은 같은 이름에 메서드를 여러 개로 선언해서 사용할 때 파라미터 유형과 개수를 다르도록 하는 기술
오버 라이딩(Overriding) : 오버 라이딩은 부모(상위) 클래스가 가지고 있는 메서드를 자식(하위) 클래스가 재정의해서 사용하는 기술
-오버 로딩
package com.company;
// 검 전사 클래스
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);
}
//전사 마법 공격 (새롭게 추가)
public int powerStrike(){
return 10;
}
//전사 마법 공격 (새롭게 추가)
public void powerStrike(Monster monster, String name) {
System.out.println( name+" : 공격");
monster.hp -= 10;
/**
* 파라미터 변수명이 experience가 아니기 때문에 this 키워드를 앞에 선언안해도 된다.
*/
experience += monster.experience;
}
//전사 마법 공격 (새롭게 추가)
public void powerStrike(int hp, int experience) {
hp -= 10; //파라미터 hp 몬스터 체력
/**
* this.experience 검 전사 경험치, experience 몬스터에게 받은 경험치
*
* 클래스 변수와 파라미터 변수명이 동일하면 클래스 변수 앞에 this 키워드를 정의해줘야 된다.
*/
this.experience += experience;
}
}
지난 시간에 만들었던 검 전사 클래스에서 파라미터(매개변수) 개수와 타입을 다르게 만들어봤습니다.
같은 이름에 메서드를 다른 파라미터 타입으로 여러 개를 만드는 방식이 오버 로딩입니다.
- 오버 라이딩
//전사 클래스
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);
}
}
오버 라이딩은 부모 클래스에서 선언한 메서드를 자식 클래스가 재 정의해서 사용한다고 했습니다.
위 코드는 지난시간에 사용했던 코드입니다.
전사 마법 공격에 super 키워드를 통해 powerStrike 메서드를 참조해서 사용했습니다. 해당 방식은 부모 메서드를 사용하는 겁니다.
오버 라이딩 방식으로 자식 클래스에서 재 정의해서 사용해 보겠습니다.
// 검 전사 클래스
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);
}
//전사 마법 공격
@Override
public void powerStrike(Monster monster) {
System.out.println("SwordSoldier(자식) 메서드 호출");
monster.hp -= 100;
System.out.println("monster.hp : "+ monster.hp);
}
}
// 실행 결과 콘솔화면
-----------------------------
검 전사 마법공격
SwordSoldier(자식) 메서드 호출
monster.hp : -90
몬스터 클래스 정보
초록 달팽이
-90
0
10
@Override라고 해당 메서도의 형태를 말해줍니다.
초록 달팽이 체력이 -90으로 감소했습니다. 자식 클래스에서 재 정의해줬기 때문입니다.
이번 시간에는 오버 로딩(Overloading)과 오버 라이딩(Overriding)에 대해 알아봤습니다. :)
질문은 댓글을 남겨주세요. :)