TIL/JAVA

[JAVA] 메서드 Method 2/2

아람2 2024. 11. 13. 13:31
반응형

듣고 있는 인터넷 강의 

메서드 Method 1/2 정리 내용

 

[JAVA] 메서드 Method 1/2

듣고 있는 인터넷 강의  메서드 Method 를 사용하는 이유프로그램의 여러 곳에서 같은 계산을 반복해야 할 때 함수를 만들어 두고필요한 입력 값을 넣어서 해당 함수를 호출하면 코드를 여러 번

helloahram.tistory.com

 

메서드와 형 변환 

메서드를 호출할 때도 형 변환이 적용된다 

🐣 인자와 매개변수가 맞지 않다면 형 변환을 해줘야 한다 🐣

아래 예시는 int 형 매개변수에 double 을 대입하면 컴파일 에러가 발생하므로 형 변환을 해준다 

package method;

public class MethodCasting1 {
    public static void main(String[] args) {
        double number = 1.5;
        printNumber(number); // 컴파일 오류 발생 
        printNumber((int)number); // 형 변환
    }

    public static void printNumber(int n){
        System.out.println("숫자 " + n);

    }
}

반대로 double 형 매개변수에 int 형 인수를 전달하는 것은 문제 없이 잘 동작한다

double 형이 더 큰 숫자 범위이므로 자동 형 변환이 적용되기 때문이다 

 

메서드 오버로딩 

자바는 메서드 이름 뿐 아니라 매개변수 정보를 함께 사용해서 메서드를 구분하기 때문에

이름이 같고 매개변수가 다른 메서드를 정의할 수 있다

add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

이렇게 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩 Overloading 이라고 한다 

여러 개의 메서드가 있을 때 먼저 본인의 타입에 최대한 맞는 메서드를 찾아서 실행하고

그래도 없으면 형 변환 가능한 타입의 메서드를 찾아서 실행한다 

오버로딩 규칙

메서드의 이름이 같아도 매개변수의 타입과 순서가 다르면 오버로딩을 할 수 있다 (이름은 상관 없다)

참고로 반환 타입은 인정하지 않는다

메서드 시그니처 Method Signature 

메서드 시그니처 = 메서드 이름 + 매개변수 타입 (순서)

자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명, 즉, 메서드를 구분할 수 있는 기준 

자바가 각각의 메서드를 고유하게 구분할 수 있어야 어떤 메서드를 호출할 지 결정할 수 있기 때문에

메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다 

반환 타입과 변수 이름은 시그니처에 포함되지 않는다 

 

메서드 추출 Extract Method  

/* 기존 코드 */
package method.ex;
public class MethodEx3 {
    public static void main(String[] args) {
        int balance = 10000;
        // 입금 1000
        int depositAmount = 1000;
        balance += depositAmount;
        System.out.println(depositAmount + "원을 입금하였습니다. 현재 잔액: " + balance+ "원");

        // 출금 2000
        int withdrawAmount = 2000;
        if (balance >= withdrawAmount) {
            balance -= withdrawAmount;
            System.out.println(withdrawAmount + "원을 출금하였습니다. 현재 잔액: " + balance + "원");
        } else {
            System.out.println(withdrawAmount + "원을 출금하려 했으나 잔액이 부족합니다.");
        }

    System.out.println("최종 잔액: " + balance + "원");
    }
}

기존 코드를 deposit 과 withdraw 메서드로 구분해서 작성할 수 있다 

package method.ex;

public class MethodEx3 {
    public static void main(String[] args) {
        /* 입금 deposit 과 출금 withdraw 를 메서드로 만들기 */

        int balance = 10000; // 현재 잔액 만원

        /* 잔액 갱신 */
        balance = deposit(balance, 1000);
        balance = withdraw(balance, 12000);
        balance = withdraw(balance, 2000);

        System.out.println("최종 잔액 : "+balance);
    }

    /* 입금하는 Method */
    public static int deposit(int balance, int amount) {
        balance += amount;
        System.out.println(amount+"원 입금, 잔액 : "+balance);
        return balance;
    }
    /* 출금하는 Method */
    public static int withdraw (int balance, int amount) {
        if(balance >= amount) {
            balance -= amount;
            System.out.println(amount+"원 출금, 잔액 : "+balance);
        }
        else
            System.out.println(amount+"원 출금 시도, 잔액 부족");

        return balance;
    }
}

 

이렇게 메서드로 나누면 전체 구조를 한 눈에 파악할 수 있고,

특정 메서드로 수정 범위가 한정되기 때문에 유지보수하기 좋다 

이런 리팩토링을 메서드 추출 Extract Method 라고 한다 

 

메서드를 재사용하는 목적이 아니라도, 메서드를 적절하게 사용해서 분류하면 

구조적으로 읽기 쉽고 유지보수하기 좋은 코드를 만들 수 있다 

그리고 메서드의 이름으로 프로그램을 더 읽기 좋게 만들 수 있다 

 

입출금 프로그램에 사용자 입력 기능도 추가한 코드는 아래와 같다 

package method.ex;

import java.util.Scanner;

public class MethodEx4 {
    public static void main(String[] args) {
        /* 입금 deposit 과 출금 withdraw 를 메서드로 만들기 2탄 */
        /* 사용자로부터 입력 받아 입금과 출금 반복하기 */
        Scanner scanner = new Scanner(System.in);
        int balance = 0; // 잔고

        while (true) {
            System.out.println("-------------------------------------");
            System.out.println("1. 입금 | 2. 출금 | 3. 잔액 확인 | 4. 종료");
            System.out.println("-------------------------------------");
            System.out.print("선택 : ");
            int menu = scanner.nextInt();
            int amount;

            switch (menu) {
                case 1:
                    System.out.print("입금액을 입력하세요 : ");
                    amount = scanner.nextInt();
                    balance = deposit(balance, amount);
                    break;
                case 2:
                    System.out.print("출금액을 입력하세요 : ");
                    amount = scanner.nextInt();
                    balance = withdraw(balance, amount);
                    break;
                case 3:
                    System.out.println("잔액은 " + balance + "원입니다");
                    break;
                case 4:
                    System.out.println("프로그램을 종료합니다 ");
                    return; // return; 하면 main 문도 끝남 

                default:
                    System.out.println("올바른 선택이 아닙니다 ");
            }
        }
    }

    /* 입금하는 Method */
    public static int deposit(int balance, int amount) {
        balance += amount;
        System.out.println(amount+"원 입금, 잔액 : "+balance);
        return balance;
    }
    /* 출금하는 Method */
    public static int withdraw (int balance, int amount) {
        if(balance >= amount) {
            balance -= amount;
            System.out.println(amount+"원 출금, 잔액 : "+balance);
        }
        else
            System.out.println(amount+"원 출금 시도, 잔액 부족");

        return balance;
    }
}

 

메서드 사용의 장점 

코드 재사용 - 메서드는 특정 기능을 캡슐화하므로, 필요할 때마다 해당 메서드를 호출함으로써 코드를 재사용할 수 있다

코드의 가독성 - 메서드의 이름은 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다 

모듈성 - 큰 프로그램을 관리 가능한 작은 부분으로 나눠서, 코드의 가독성을 향상시키고 디버깅을 쉽게 만든다 

코드 유지 관리 - 코드의 특정 부분에서 문제가 발생하거나 업데이트가 필요한 경우 메서드만 수정하면 되므로, 전체 코드 베이스에 영향을 주지 않고 변경 사항을 적용할 수 있다 

재사용성과 확장성 - 다른 프로그램이나 프로젝트에서도 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 확장하는 데 유용하다 

추상화 - 메서드의 복잡한 내부 작업에 대해 알 필요 없이 메서드를 사용할 수 있다 

테스트와 디버깅 용이성 - 개별 메서드는 독립적으로 테스트하고 디버그할 수 있기 때문에 코드의 문제를 신속하게 찾고 수정하는 데 좋다 

 

+ 코드를 작성할 때 복잡하게 작성하지 마라, 단순하고 명확하게 만들자

 

 

반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 변수와 초기화  (0) 2024.12.02
[JAVA] 기본형과 참조형  (2) 2024.11.26
[JAVA][기본] 클래스 Class  (4) 2024.11.16
[JAVA] 메서드 Method 1/2  (0) 2024.11.12
[JAVA] 배열 Array  (0) 2024.11.08