DEV/JAVA

메소드 오버로딩 | Method Overloading

devvnn 2021. 12. 16. 21:41
메소드 오버로딩(Method Overloading)

 

  • 클래스 내에 같은 이름의 메소드를 2개 이상 정의할 수 있게 해주는 기능

 


 

public class Calculator {
    int add(int a, int b) {
        return a + b;
    }
    
    int add(int a, int b, int c) {
        return a + b + c;
    }
    
    double add(double a, double b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        Calculator c = new Calculator();
        System.out.println(c.add(24));        // 6    
        System.out.println(c.add(248));        // 14
        System.out.println(c.add(3.142.54));    // 5.68
    }
}
cs

 

  • <add>라는 이름의 메소드가 3개가 있지만 오류가 나지않음
  • 각 메소드는 다른 구성의 파라미터를 받음(첫 번째 add는 정수형 값 2개, 두 번째 add는 정수형 값 3개, 세 번째 add는 소수형 값 2개)
  • 같은 이름의 메소드라도 파라미터 구성이 다르면 자바가 알아서 구분함

 

은행 계좌 예제로 살펴보기

 

public class BankAccount {
    private int balance;
    private Person owner;
    
    public void setBalance(int newBalance) {
        balance=newBalance;
    }
    
    public int getBalance() {
        return balance;
    }
    
    public void setOwner(Person newOwner) {
        owner=newOwner;
    }
    
    public Person getOwner() {
        return owner;
    }
 
    // 파라미터 : 입금할 액수(정수)
    // 리턴 : 성공여부(불린)
    boolean deposit(int amount) {
        if(amount < 0 || amount > owner.getCashAmount()) {
            System.out.println("입금 실패입니다. 잔고 :" + balance + "원, 현금 : " + owner.getCashAmount() +"원");
            System.out.println("false");
            return false;
        }else {
            balance += amount;
            owner.setCashAmount(owner.getCashAmount()- amount);
            System.out.println(amount+"원 입금하였습니다. 잔고 : " + balance +"원, 현금 : "+owner.getCashAmount() +"원");
            System.out.println("true");
            return true;
        }
    }
    
    public boolean deposit(double amount, double exchangeRate) {
        System.out.println(false);
        return deposit((int)(amount * exchangeRate));
    }
 
    // 파라미터 : 출금할 액수(정수)
    // 리턴 : 성공여부(불린)
    boolean withraw(int amount) {
        if(amount < 0 || amount > getBalance()) {
            System.out.println("출금 실패입니다. 잔고 :" + balance + "원, 현금 : " + owner.getCashAmount() +"원");
            System.out.println("false");
            return false;
        }else {
            balance -= amount;
            owner.setCashAmount(owner.getCashAmount()+amount);
            System.out.println(amount+"원 출금하였습니다. 잔고 : " + balance +"원, 현금 : "+owner.getCashAmount()+"원");
            System.out.println("true");
            return true;
        }
    }
 
}
cs

 

  • deposit 메소드가 2개지만 허용됨. 왜? 메소드 오버로딩이 가능하기때문에.

 

콘솔 출력

 

        System.out.println(5);      // 정수 파라미터
        System.out.println(3.14);   // 소수 파라미터
        System.out.println("hello");// 문자열 파라미터
        System.out.println(true);   // 불린 파라미터
cs

 

  • 지금까지 사용했던 System.out.println도 파라미터를 다양하게 받음 → 메소드 오버로딩

 

실습

 

계좌 이체

지금까지 만들어 온 은행 시뮬레이션 프로그램에 송금 기능을 담당하는 transfer 메소드를 써봅시다. 메소드 오버로딩의 개념을 이용해서 BankAccount 클래스에 두 개의 transfer 메소드를 쓰고, Person 클래스에도 두 개의 transfer 메소드를 쓰겠습니다.

송금 메소드 작성 (BankAccount.java)

송금은 계좌 - 계좌 방식으로 이루어집니다. 하지만 사용자의 편리함을 위해서 아래의 두 메소드를 만들겠습니다:

 

Person

 

public class Person {
    // 저번 과제에서의 코드!
    String name;
    int age;
    int cashAmount;
    private BankAccount account;
    
    public void setName(String name) {
        this.name=name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setAge(int age) {
        this.age=age;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setCashAmount(int cashAmount) {
        this.cashAmount=cashAmount;
    }
    
    public int getCashAmount() {
        return cashAmount;
    }
    
    public void setAccount(BankAccount account) {
        this.account = account;
    }
    
    public BankAccount getAccount() {
        return account;
    }
    
    // 첫 번째 파라미터 : 받는 사람(Person)
    // 두 번째 파라미터 : 이체할 금액(정수)
    // 리턴 : 성공여부(불린)
// account와 account 간의 거래이므로, BankAccount 클래스의 transfer 메소드를 써야함.
    public boolean transfer(Person to, int amount) {
        return transfer(to.account, amount);
    }
    
    // 첫 번째 파라미터 : 받는 사람의 계정(BankAccount)
    // 두 번째 파라미터 : 이체할 금액(정수)
    // 리턴 : 성공여부(불린)
    public boolean transfer(BankAccount to, int amount) {
        boolean res = false;
        if(amount > account.getBalance() || amount < 0) {
            res = false;
        }else {
            account.setBalance(account.getBalance() - amount);
            to.setBalance(to.getBalance() + amount);
            res = true;
        }
        System.out.println(res + " - from: " + name + ", to: " + to.getOwner().name + ", amount:" + amount + ", balance: " + account.getBalance());
        return res;
    }
    
}
  cs

 


 

BankAccount

 

public class BankAccount {
    private int balance;
    private Person owner;
    
    public void setBalance(int balance) {
        this.balance=balance;
    }
    
    public int getBalance() {
        return balance;
    }
    
    public void setOwner(Person owner) {
        this.owner=owner;
    }
    
    public Person getOwner() {
        return owner;
    }
    
    // 첫 번째 파라미터: 받는 사람 (Person)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
// account와 account간의 거래이므로, Person to의 정보를 to의 account 정보로 바꾸어 호출
    public boolean transfer(Person to, int amount) {
        return transfer(to.getAccount(), amount);
    }
    
    // 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
    // 두 번째 파라미터: 이체할 금액 (정수)
    // 리턴 : 성공여부 (불린)
    public boolean transfer(BankAccount to, int amount) {
        boolean res = false;
        if(amount > balance || amount < 0) {
            res = false;
        }else {
            balance = balance - amount;
            to.setBalance(to.getBalance() + amount);
            res = true;
        }
        System.out.println(res+" - from: "+owner.name +", to: " + to.owner.name+ ", amount: " +amount+ ", balance: "+balance);
        return res;
    }
}
cs

 


 

Main

 

public class Main {
    public static void main(String[] args) {
        // 사람 1
        Person p1 = new Person();
        p1.setName("김신의");
        p1.setAge(28);
        p1.setCashAmount(30000);
 
        // 은행 계좌 1
        BankAccount a1 = new BankAccount();
        a1.setBalance(100000);
 
        p1.setAccount(a1);
        a1.setOwner(p1);
 
        // 사람 2
        Person p2 = new Person();
        p2.setName("문종모");
        p2.setAge(25);
        p2.setCashAmount(100000);
 
        // 은행 계좌 2
        BankAccount a2 = new BankAccount();
        a2.setBalance(500000);
 
        p2.setAccount(a2);
        a2.setOwner(p2);
 
        // 계좌 이체 테스트
        a2.transfer(a1, 200000);
        a1.transfer(p2, 150000);
        p2.transfer(a1, 270000);
        p1.transfer(p2, 130000);
    }
}
cs

 

* 만들어야 할 메소드는 총 4개

  • BankAccount 클래스에 transfer(Person to, int amount)
  • BankAccount 클래스에 transfer(BankAccount to, int amount)
  • Person 클래스에 transfer(Person to, int amount)
  • Person 클래스에 transfer(BankAccount to, int amount)