Loading...

JAVA / / 2022. 1. 13. 16:05

자바 15강. 오버로딩

반응형

오버 로딩 = over-loading = 과적재

 

사자 unit1, 호랑이 unit2

unit2 = u1 대입 안됨

사자 타입과 호랑이 타입이 맞지 않기 때문

타입 확인 중요!

 

package ex00;

// 오버로딩 = over-loading = 과적재

class 사자 {
    String name = "사자";
    int hp = 100;
    int attack = 10;
}

class 호랑이 {
    String name = "호랑이";
    int hp = 100;
    int attack = 15;
}

class 곰 {
    String name = "곰";
    int hp = 100;
    int attack = 50;
}

public class MethEx04 {

    // 사자 -> 호랑이 공격
    static void attackLionToTiger(사자 unit1, 호랑이 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 사자 -> 곰 공격
    static void attackLionToBear(사자 unit1, 곰 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 호랑이 -> 사자 공격
    static void attackTigerToLion(호랑이 unit1, 사자 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 호랑이 -> 곰 공격
    static void attackTigerToBear(호랑이 unit1, 곰 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 곰 -> 사자 공격
    static void attackBearToLion(곰 unit1, 사자 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 곰 -> 호랑이 공격
    static void attackBearToTiger(곰 unit1, 호랑이 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    public static void main(String[] args) {
        사자 lion1 = new 사자();
        호랑이 tiger1 = new 호랑이();
        곰 bear1 = new 곰();

        attackLionToTiger(lion1, tiger1);
        attackLionToBear(lion1, bear1);
        attackTigerToLion(tiger1, lion1);
        attackTigerToBear(tiger1, bear1);
        attackBearToLion(bear1, lion1);
        attackBearToTiger(bear1, tiger1);
    }
}

위의 코드는 너무 복잡하고

메서드 이름에 고민을 많이 하게 된다.

 

이 코드의 동물이 500마리가 된다면 메서드 이름이

엄청나게 복잡해질 것이다.

 

동일한 메서드 이름으로 메모리를 과적재할 수 있다.

이게 왜 오류 없이 가능할까?

 

같은 메서드의 매개변수의 타입이, 위치가 다르면

다른 함수로 인식해서 stack의 다른 공간을 만든다.

 

타입이 다르거나, 개수가 다르거나, 위치가 다르면

메서드의 이름이 같아도 다른 메서드로 인식하는 것이 오버 로딩이다.

 

오버 로딩의 엄청난 장점이 있다.

 

코드의 가독성이 훨씬 좋아지고, 이름 고민에 머리 쓸 필요 없고,

개발자가 메서드를 호출할 때 메서드 이름 단 하나만 기억하면 된다.

attack!

package ex00;

// 오버로딩 = over-loading = 과적재

class 사자1 {
    String name = "사자";
    int hp = 100;
    int attack = 10;
}

class 호랑이1 {
    String name = "호랑이";
    int hp = 100;
    int attack = 15;
}

class 곰1 {
    String name = "곰";
    int hp = 100;
    int attack = 50;
}

public class MethEx05 {

    // 사자 -> 호랑이 공격
    static void attack(사자1 unit1, 호랑이1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 사자 -> 곰 공격
    static void attack(사자1 unit1, 곰1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 호랑이 -> 사자 공격
    static void attack(호랑이1 unit1, 사자1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 호랑이 -> 곰 공격
    static void attack(호랑이1 unit1, 곰1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 곰 -> 사자 공격
    static void attack(곰1 unit1, 사자1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    // 곰 -> 호랑이 공격
    static void attack(곰1 unit1, 호랑이1 unit2) {
        System.out.println(unit2.name + "가(이) 공격당하고 있습니다.");
        unit2.hp = unit2.hp - unit1.attack;
        System.out.println(unit2.name + "의 hp : " + unit2.hp);
    }

    public static void main(String[] args) {
        사자1 lion1 = new 사자1();
        호랑이1 tiger1 = new 호랑이1();
        곰1 bear1 = new 곰1();

        attack(lion1, tiger1);
        attack(lion1, bear1);
        attack(tiger1, lion1);
        attack(tiger1, bear1);
        attack(bear1, lion1);
        attack(bear1, tiger1);
    }
}

 

1. 메서드는 동일한 이름으로 만들 수 없다. (기본 문법)

2. 단, 매개변수의 타입이 다르거나, 위치가 다르거나, 개수가 다르면 다른 메서드로 인식한다.

3. 개발자 입장에서 함수 이름을 하나만 기억하면 된다. (엄청난 장점!)

4. 경우의 수가 너무 많아지면 퇴사하고 싶어 진다.. (오버 로딩의 한계)

5. 어떨 때 사용하면 되냐? 개수가 적을 때! 10개~20개 안일 때 사용한다.

 

System.out.println(1);
System.out.println(1.0);
System.out.println(true);

그럼 이제 이 코드를 보면 이런 생각이 딱! 나야 한다.

println 메서드도 오버 로딩 타입이구나!

 

println 메서드는 자바에서 만들어준 것이다.

자바의 자료형은 단 8개라서 가능하다.

 

 

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형