개발이 취미인 사람

[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) 개념 및 사용법 본문

언어(Programming Language)/Java

[Java] 오버로딩(Overloading)과 오버라이딩(Overriding) 개념 및 사용법

RyanSin 2021. 1. 26. 11:18
반응형

- 지난 시간

안녕하세요. 지난 시간에는 클래스 상속에 대해 알아봤습니다.

 

혹시 놓치신 분들은 아래 링크를 통해 상속에 대한 개념을 학습하고 오시는 걸 추천드리겠습니다.

 

any-ting.tistory.com/31

 

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

- 지난 시간 안녕하세요. 지난 시간에는 Java Class Method에 대해 알아봤습니다. Java Class와 Java Class Method를 잘 이해하지 못하셨다면, 아래 링크를 통해 학습을 하고 오시는 걸 추천드립니다. :) Java Cla

any-ting.tistory.com

- 개요

이번 시간에는 오버 로딩(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)에 대해 알아봤습니다. :)

 

질문은 댓글을 남겨주세요. :)