최원종의 개발 블로그

메서드 오버로딩 본문

Java/Java 객체지향

메서드 오버로딩

chl6698 2026. 3. 3. 17:34

메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하는 것.

메서드의 시그니처, 즉 메서드 이름과 매개변수의 타입, 개수, 순서가 서로 달라야 한다.

메서드 오버로딩을 사용하면 같은 기능을 하는 메서드들을 하나의 이름으로 통일할 수 있어 가독성이 높아진다.


메서드 오버로딩 코드

package com.tenco.overloading;

/**
 * 메소드 오버로딩이란?
 * 같은 이름의 메소드를 여러개 정의 하는 것을 말한다
 */
public class Calculator {
    public static void main(String[] args) {
        // 잠깐 생각.
        // 함수 호출 하려면 ---> 함수 선언이 되어 있어야 한다.
        System.out.println(1);
        System.out.println(1.1);
        System.out.println('A');
        System.out.println("문자");
        System.out.println(true);

    } // end of main

    public void printInt(int a){
        System.out.println(a);
    }
    public void printDouble(double a) {
        System.out.println(a);
    }

    public double add(double a, double b) {
        return a + b;
    }

    public int add(int a, int b) {
        return a + b;
    }

    public int add(int a, int b, int c) {
        return a + b + c;
    }

    public String add( String s1, String s2){
        return s1 + s2;
    }

}//end of class

 

반환 타입만 다른 것은 오버로딩이 아님.

public int add(int a, int b) { return a + b; }
public double add(int a, int b) { return (double)(a + b); } //  컴파일 에러!

 


스타크래프트_v02 (메서드 오버로딩 적용 버전 attack로 묶기)

-Marine

package com.tenco.startcraft_v02;

public class Marine {
    private String name;
    private int power;
    private int hp;

    public Marine(String name) {
        this.name = name;
        power = 4;
        hp = 70;
    }

    //getter
    public String getName() {
        return name;
    }

    public int getPower() {
        return power;
    }

    public int getHp() {
        return hp;
    }

    //저글링 공격
    public void attack(Zergling zergling) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + zergling.getName() + "을 공격 합니다");
        zergling.beAttacked(this.power);
    }

    //질럿 공격
    public void attack(Zealot zealot) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + zealot.getName() + "을 공격 합니다");
        zealot.beAttacked(this.power);
    }

    public void beAttacked(int power) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        this.hp -= power;//공격받으면 hp까임
        if (this.hp < 0) {
            this.hp = 0;
        }
        System.out.println(name + "이(가) 공격을 당합니다. (남은 HP : " + this.hp + " )");
    }

    //상태창
    public void showInfo() {
        System.out.println("⭐-------상태창-------⭐");
        System.out.println("유닛 이름 : " + name + " | 공격력 : " + power + " | 체력 : " + hp);

    }

}

 

-Zealot

package com.tenco.startcraft_v02;


/**
 * v01 코드 그대로 작성, 단 attack 이름으로 메소드 오버로딩 기법을 적용하시오
 */

public class Zealot {
    private String name;
    private int power;
    private int hp;

    public Zealot(String name) {
        this.name = name;
        power = 20;
        hp = 80;
    }

    //getter
    public String getName() {
        return name;
    }

    public int getPower() {
        return power;
    }

    public int getHp() {
        return hp;
    }

    //저글링 공격
    public void attack(Zergling zergling) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + zergling.getName() + "을 공격 합니다");
        zergling.beAttacked(this.power);
    }

    //마린 공격
    public void attack(Marine marine) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + marine.getName() + "을 공격 합니다");
        marine.beAttacked(this.power);
    }

    public void beAttacked(int power) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        this.hp -= power;//공격받으면 hp까임
        if (this.hp < 0) {
            this.hp = 0;
        }
        System.out.println(name + "이(가) 공격을 당합니다. (남은 HP : " + this.hp + " )");
    }

    //상태창
    public void showInfo() {
        System.out.println("⭐-------상태창-------⭐");
        System.out.println("유닛 이름 : " + name + " | 공격력 : " + power + " | 체력 : " + hp);

    }
}

 

-Zergling

package com.tenco.startcraft_v02; // 패키지 명시

public class Zergling {
    private String name;
    private int power;
    private int hp;

    public Zergling(String name) {
        this.name = name;
        power = 3;
        hp = 50;
    }

    //getter
    public String getName() {
        return name;
    }

    public int getPower() {
        return power;
    }

    public int getHp() {
        return hp;
    }

    //질럿 공격
    public void attack(Zealot zealot) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + zealot.getName() + "을 공격 합니다");
        zealot.beAttacked(this.power);

    }

    //마린 공격
    public void attack(Marine marine) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        System.out.println(name + "이(가) " + marine.getName() + "을 공격 합니다");
        marine.beAttacked(this.power);
    }

    public void beAttacked(int power) {
        if (this.hp <= 0) {
            System.out.println(name + "이(가) 사망하여 공격할 수 없습니다");
            return;
        }
        this.hp -= power;//공격받으면 hp까임
        if (this.hp < 0) {
            this.hp = 0;
        }
        System.out.println(name + "이(가) 공격을 당합니다. (남은 HP : " + this.hp + " )");
    }

    //상태창
    public void showInfo() {
        System.out.println("⭐-------상태창-------⭐");
        System.out.println("유닛 이름 : " + name + " | 공격력 : " + power + " | 체력 : " + hp);

    }
}

 

-GameTset (실행하는 코드)

package com.tenco.startcraft_v02;

public class GameTest {
    public static void main(String[] args) {
        //v2에서는 공격을 메서드 오버로딩 활용
        Zealot zealot = new Zealot("질럿1");
        Marine marine = new Marine("마린1");
        Zergling zergling = new Zergling("저글링1");

        zealot.attack(marine);
        marine.attack(zealot);
        zergling.attack(marine);

        //println() <-- 오버로딩 기법이다
        //println(int a)
        //println(double a)
    }
}

메서드 오버로딩 실습 문제 (알림 전송 클래스 Notification 만들기)

문제: 우리는 메시지를 보낼 때 단순히 내용만 보낼 때도 있고, 받는 사람을 지정할 때도 있습니다. 메서드 오버로딩을 이용해 send라는 이름 하나로 다양한 알림을 보내는 코드를 완성해 보세요.

 

요구사항

  1. send(String message) : 메시지 내용만 출력합니다. (예: "일반 알림: [내용]")
  2. send(String message, int count) : 메시지를 입력받은 횟수만큼 반복해서 출력합니다.
  3. send(String receiver, String message) : 받는 사람과 내용을 출력합니다. (예: "[받는 사람]님에게 메시지: [내용]")

 

-코드

package com.tenco.overloading;

public class Notification {

    //1. 메시지만 보내는 메서드
    public void send(String message) {
        System.out.println("일반 알림 : [" + message + "]");
    }

    //2. 메시지를 여러번 반복해서 보내는 메서드 (for)
    public void send(String message, int count) {
        System.out.println("반복 알림 전송 ...");
        for (int i = 0; i < count; i++) {
            send(message);
        }
    }
    //3. 받는 사람을 지정해서 보내는 메서드
    public void send(String receiver, String message) {
        System.out.println("[" + receiver + "]님에게 메시지: [" + message + "]");
    }

    //main 함수 영영(자리 빌려쓰기)
    public static void main(String[] args) {

        Notification notification = new Notification();

        System.out.println("------- 1번 호출 --------");
        notification.send("내용");
        System.out.println("------- 2번 호출 --------");
        notification.send("졸면 안 돼요", 3); // 3번 반복
        System.out.println("------- 3번 호출 --------");
        notification.send("홍길동" , "내용");


    }//end of main
}

'Java > Java 객체지향' 카테고리의 다른 글

상속과 접근제어 지시자  (0) 2026.03.04
상속(Inheritance)  (0) 2026.03.04
전화번호 관리하는 프로그램 만들기  (0) 2026.02.27
Array(배열)  (0) 2026.02.27
static함수  (1) 2026.02.26