ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 반환타입, 메서드 오버로딩
    언어/Java 2024. 10. 30. 10:24
    단축키 Tip
    Shift + F6 
    한번에 바꾸기 

    반환타입

    • 반드시 반환 타입이 있는 경우 return 을 해줘야 한다.
    • return 문을 만나면 그 즉시 종료한다.
    public class Meno {
        public static void main(String[] args) {
            int result = add(1, 2);
            System.out.println(result);
        }
    
        public static int add(int a, int b) {
            int sum = a + b;
            return sum;
        }
    }

    메서드 호출과 값 전달 1

    • 자바는 항상 변수의 값을 복사해서 대입한다 (아주 중요, 대원칙)
    package method;
    
    public class MethodValue0 {
    
        public static void main(String[] args) {
            int num1 = 5;
            int num2 = num1;
            num2 = 10;
    
            System.out.println("num1=" + num1);
            System.out.println("num2=" + num2);
        }
    }
    • num1 에 있는 값 5를 복사해서 num2 에 넣는 것이다.
    • 복사한다고 표현한 이유는 num1의 값을 읽어도 num1에 있는 기존 값이 유지되고, 새로운 값 num2 에 들어가기 때문이다. 마치 num1 의 값이 num2에 복사된 것 같다.
    • num1 이라는 변수 자체가 num2 에 들어가는 것이 아니다. num1 에 들어 있는 값을 읽고 복사해서 num2에 넣는 것이다. 
    package method;
    
    public class MethodValue1 {
    
        public static void main(String[] args) {
            int num1 = 5;
            System.out.println("1. changeNumber 호출 전, num1: " + num1);
            changeNumber(num1);
            System.out.println("4. changeNumber 호출 후, num1: " + num1);
        }
    
        public static void changeNumber(int num2) {
            System.out.println("2. changeNumber 변경 전, num2: " + num2);
            num2 = num2 * 2;
            System.out.println("3. changeNumber 변경 후, num2: " + num2);
        }
    }
    • 결과적으로 매개변수 num2 의 값만 10으로 변경되고 num1의 값은 변경되지 않고 기존 값인 5로 유지된다. 자바는 항상 값을 복사해서 전달하기 때문에 num2의 값을 바꾸더라도 num1에 영향을 주지 않는다. 
    package method;
    
    public class MethodValue2 {
    
        public static void main(String[] args) {
            int number = 5;
            System.out.println("1. changeNumber 호출 전, number: " + number); //5
            changeNumber(number);
            System.out.println("4. changeNumber 호출 후, number: " + number); //5
        }
    
        public static void changeNumber(int number) {
            System.out.println("2. changeNumber 변경 전, number: " + number); //5
            number = number * 2;
            System.out.println("3. changeNumber 변경 후, number: " + number); //10
        }
    }
    • main()도 메서드이다.
    • 각각의 메서드 안에서 사용하는 변수는 서로 완전히 분리된 다른 변수이다.
    • 따라서 main()의 number 와 changeNumber()의 number 는 서로 다른 변수이다.
    package method;
    
    public class MethodValue3 {
    
        public static void main(String[] args) {
            int num1 = 5;
            System.out.println("changeNumber 호출 전, num1: " + num1);
            num1 = changeNumber(num1);
            System.out.println("changeNumber 호출 후, num1: " + num1);
        }
    
        public static int changeNumber(int num2) {
            num2 = num2 * 2;
            return num2;
        }
    }
    • 그러면 값을 바꾸고 싶을 때는 반환 타입을 void로 하지 않고 int나 등으로 넣어줘 값을 반환해주고 main에서는 변수를 담자.

    메서드 오버로딩

    다음과 같은 메서드를 만들고 싶다.

    • 두 수를 더하는 메서드A
    • 세 수를 더하는 메서드B

    이 경우 A와 B 둘다 더하는 메서드이기 때문에 가급적 같은 이름인 add 를 사용하고 싶다. 자바는 메ㅐ서드의 이름 뿐만 아니라 매개변수 정보를 함께 사용해서 메서드를 구분한다. 이를 메서드 시그니처라고 한다. 

    메서드 시그니처 = 메서드 이름(add) + 매개변수 타입( int a. double b)

    add(int a, int b);
    add(double a, double b);
    • 이렇게 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩(Overloading) 이라 한다.

    오버로딩 규칙

    메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩 할 수 있다.

    // 반환 타입은 인정하지 않음. 오버로딩 실패
    int add(int a, int b);
    double add(int a, int b);
    
    // 매개변수의 타입이 다르면 인정. 오버로딩 성공
    int add(int a, int b);
    double add(int a, double b);

    메서드 리팩토링

    • 리팩토링 결과로 main은 세세한 코드가 아니라 전체 구조(=비즈니스 요구사항을)를 한 눈에 볼 수 있다. 쉽게 이야기해서 main에서 목차를 나열하고, 목차(메서드들)를 자세히 보면 코드가 나와 있는 것이다. 
    main() {
    	add(1, 2);
    }
    • 아주 쉽게 생략해서 위 main 메서드를 보자. 
    • add ? 더하겠구나, 1과 2를 . 
    • 직관적으로 비즈니스 요구사항을 알 수 있게 된다.
    add(int a, int b){
    	return a + b;
    }
    • 목차를 자세히 들여다 보면 세세한 코드가 나와 있다. 

    섹션 10 문제와 풀이2

    package method.ex;
    
    import java.util.Scanner;
    
    public class ByMySelf {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (true) {
                System.out.println("---------------------------------------");
                System.out.println("1. 입금 | 2. 출금 | 3. 잔액 확인 | 4. 종료");
                System.out.println("---------------------------------------");
                System.out.print("선택:");
                int menu = input.nextInt();
    
                // 현재 잔고는 0원 부터 시작한다.
                int balance = 0;
    
                // menu 선택
                if (menu == 1) {
                    System.out.print("입금액을 입력하세요: ");
                    int depositAmount = input.nextInt();
                    balance = deposit(balance, depositAmount);
                } else if (menu == 2) {
                    System.out.print("출금액을 입력하세요: ");
                    int withdrawAmount = input.nextInt();
                    balance = withdraw(balance, withdrawAmount);
                } else if (menu == 3) {
                    System.out.println("현재 잔액: " + balance);
                } else if (menu == 4) {
                    System.out.println("시스템을 종료합니다.");
                    break;
                }
    
            }
        }
    
        public static int deposit(int balnace, int amount) {
            balnace += amount;
            System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balnace + "원");
            return balnace;
        }
    
        public static int withdraw(int balance, int amount) {
            // balance -= amount;
            if (balance >= amount) {
                balance -= amount;
                System.out.println(amount + "원을 출금하였습니다. 현재 잔액: " + balance + "원");
            } else {
                System.out.println(amount + "원을 출금하려 했으니 잔액이 부족합니다. ");
            }
            return balance;
        }
    }
    • 실수 1 : 변수 초기화
      • while 문 안에 현재 잔고를 초기화해서 매번 메뉴를 선택할 때마다 현재 잔고가 업데이트 되지 않고, 0으로만 반복적으로 초기화 되었다.

    • 해결 1 : 
      • while 문 밖에 현재 잔고를 초기화해두어 실수를 해결하였다. 
Designed by Tistory.