본문 바로가기

언어 기초/JAVA

메서드 [JAVA | 학습을 위한 자료| 김영한 자바 입문]

자바 입출력, 반복문, 조건문, 메서드를 공부할 수 있는 문제이다.

\\\

public class RefactoringTest {
    public static void main(String[] args) {
        int balance = 10000;
        // 입금 1000
        deposit(balance,1000);
        // 출금 2000
        withdraw(balance,2000);
        System.out.println("최종 잔액: " + balance + "원");
    }

    public static int deposit(int balance, int amount) {
        balance += amount;
        System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balance + "원");

        return balance;
    }

    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;
    }

}

자바는 항상 변수의 값을 복사해서 대입한다.

 1. 요구사항 정의

  • 입금액, 출금액, 잔액 등과 같은 변수를 생성하고 초기화한다.
  • 입출력을 사용하여 구분선과 메뉴바를 작성해야 한다.
  • 무한 반복문을 통해서 프로그램의 시작과 끝을 만든다.
  • 조건문을 사용하여 선택에 따라 다른 메서드에 접근하도록 한다.
  • 메서드를 사용하여 입금과 출금 기능을 구현한다.

2. 사용 개념

입출력

Java에서 Scanner 클래스는 간단하고 유연한 방법으로 다양한 종류의 입력을 읽어들이는 데 사용된다. java.util 패키지에 포함되어 있으며, 텍스트 파일, 입력 스트림, 문자열 등에서 데이터를 파싱할 수 있다.

 

Scanner 객체 생성: 입력 소스로부터 데이터를 읽기 위해 Scanner 객체를 생성한다. 이 때, System.in을 사용하면 표준 입력으로부터 데이터를 읽을 수 있다.

 

데이터 읽기: Scanner 클래스는 nextInt(), nextFloat(), nextLine() 등 다양한 메서드를 제공하여 문자, 정수, 실수, 라인 전체 등을 읽을 수 있다.

  • nextInt()와 nextDouble()은 각각 정수와 실수를 읽어들인다.
  • nextLine()은 한 줄 전체를 문자열로 읽어들인다. 엔터(\n)을 입력할 때 까지 문자를 가져온다.

 

Scanner 종료: Scanner 객체는 더 이상 사용하지 않을 때 close() 메서드를 호출하여 자원을 해제해야 한다.

 

nextLine()을 사용하기 전에 nextInt()나 nextDouble()으로 인해 입력 버퍼에 남아있는 줄바꿈 문자를 소비하기 위해 추가적으로 nextLine()을 호출하는 것에 주의해야 한다.

반복문

while 문은 Java에서 기본적인 반복 구조 중 하나로, 주어진 조건이 참인 동안 계속해서 코드 블록을 반복 실행한다. while 무한 반복문은 조건이 항상 참을 반환하도록 설정되어 있어 프로그램의 특정 부분을 끝없이 실행하게 한다.

while (true) {
    // 실행할 코드
}

 

  1. 조건 평가: while 문은 반복마다 조건을 평가한다. true를 직접 조건으로 사용하면 조건이 항상 참이므로 루프는 끝나지 않는다.
  2. 코드 블록 실행: 조건이 참인 경우, while 문의 코드 블록이 실행된다. 이 블록 안에서 다양한 연산, 메서드 호출, 사용자 입력 처리 등을 수행할 수 있다.
  3. 루프 제어: 무한 루프는 제어가 필수적이다. 일반적으로 루프 내부에서 특정 조건에 따라 break 문을 사용하여 루프를 종료하거나, return 문을 사용하여 함수에서 완전히 탈출한다.

조건문

if문에 else if를 함께 사용하는 것은 서로 연관된 조건일 때 사용한다. 그런데 서로 관련이 없는 독립조건이면 else if를 사용하지 않고 if문을 각각 따로 사용해야 한다.

if문은 비교 연산자를 사용할 수 있지만 switch문은 단순히 값이 같은지만 비교할 수 있다.

 

메서드

메서드는 클래스의 행동을 정의하는 데 사용됩니다. 메서드는 특정 작업을 수행하며, 호출될 때마다 그 작업을 실행하고 결과를 반환할 수 있습니다. 메서드 선언은 메서드의 이름, 반환 유형, 매개변수 목록, 예외 목록, 그리고 메서드가 수행할 작업을 정의하는 본문으로 구성됩니다.

 

메서드 선언의 구성 요소

  1. 접근 제어자(Access Modifier): 메서드가 어디서 접근 가능한지 정의합니다 (예: public, private, protected, 없을 경우 package-private).
  2. 반환 유형(Return Type): 메서드가 실행을 마친 후 반환하는 데이터의 타입을 지정합니다. 반환할 값이 없으면 void로 지정합니다.
  3. 메서드 이름(Method Name): 메서드를 호출할 때 사용되는 이름입니다. Java에서는 메서드 이름이 소문자로 시작하는 것이 일반적인 규칙입니다.
  4. 매개변수 목록(Parameter List): 메서드가 필요로 하는 입력을 정의합니다. 매개변수가 없는 경우 괄호는 비어 있습니다.
  5. 예외 목록(Exception List): 메서드가 실행 중 발생할 수 있는 예외를 명시합니다. throws 키워드를 사용하여 예외 타입을 지정합니다.
  6. 메서드 본문(Method Body): 메서드가 호출될 때 실행되는 코드 블록입니다. 중괄호 {} 안에 코드를 작성합니다.

메서드 호출

  • 정의한 메서드를 호출해서 실행하려면 메서드 이름에 입력 값을 전달하면 된다. 보통 메서드를 호출한다고 표현한다.
  • 메서드를 호출하는 곳에서는 메서드 선언은 알지만 메서드 본문은 모른다.
  • 메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과 매개변수(파라미터)의 타입이 맞아야 한다. 물론 넘기는 값과 매개변수(파라미터)의 순서와 갯수도 맞아야 한다.
  • 메서드를 정의할 때 선언한 변수인 `String str, `int age를 매개변수, 파라미터라 한다.
  • 넘기는 값을 영어로 Argument(아규먼트), 한글로 인수 또는 인자라 한다. 실무에서는 아규먼트, 인수, 인자라는 용어를 모두 사용한다.

voidreturn 생략
모든 메서드는 항상 return을 호출해야 한다. 그런데 반환 타입 void의 경우에는 예외로 `printFooter()` 와 같이 생략해도 된다. 자바가 반환 타입이 없는 경우에는 return을 마지막줄에 넣어준다. 참고로 return을 만나면 해당 메서드는 종료된다.

3.기능 구현

public class MethodEx4 { // 클래스 MethodEx4 선언
    public static void main(String[] args) { // 메인 메서드 시작
        int balance = 0; // 계좌 잔액을 저장할 변수, 초기값은 0
        Scanner scanner = new Scanner(System.in); // 사용자 입력을 받기 위한 Scanner 객체 생성
        while (true) { // 무한 반복문 시작
            System.out.println("---------------------------------"); // 메뉴 구분선 출력
            System.out.println("1.입금 | 2.출금 | 3.잔액 확인 | 4.종료"); // 메뉴 옵션 출력
            System.out.println("---------------------------------"); 
            System.out.print("선택: "); // 사용자에게 선택 입력 요청
            int choice = scanner.nextInt(); // 사용자의 선택을 정수로 받음
            int amount; // 입금 또는 출금할 금액을 저장할 변수
            switch (choice) { // 사용자의 선택에 따라 분기
                case 1: // 1번 선택 시
                    System.out.print("입금액을 입력하세요: "); // 입금액 입력 요청
                    amount = scanner.nextInt(); // 입금액을 정수로 받음
                    balance = deposit(balance, amount); // deposit 메서드 호출하여 잔액 업데이트
                    break;
                case 2: // 2번 선택 시
                    System.out.print("출금액을 입력하세요: "); // 출금액 입력 요청
                    amount = scanner.nextInt(); // 출금액을 정수로 받음
                    balance = withdraw(balance, amount); // withdraw 메서드 호출하여 잔액 업데이트
                    break;
                case 3: // 3번 선택 시
                    System.out.println("현재 잔액: " + balance + "원"); // 현재 잔액 출력
                    break;
                case 4: // 4번 선택 시
                    System.out.println("시스템을 종료합니다."); // 종료 메시지 출력
                    return; // 메인 메서드 종료
                default: // 잘못된 선택 시
                    System.out.println("올바른 선택이 아닙니다. 다시 선택해주세요."); // 에러 메시지 출력
            }
        }
    }

    public static int deposit(int balance, int amount) { // 입금 메서드 정의
        balance += amount; // 잔액에 입금액 추가
        System.out.println(amount + "원을 입금하였습니다. 현재 잔액: " + balance +
                "원"); // 입금액과 업데이트된 잔액 출력
        return balance; // 업데이트된 잔액 반환
    }
    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; // 업데이트된 잔액 반환
    }
}

 

 

4. 추가 정보

  • 지역 변수는 개발자가 직접 초기화를 해주어 야 한다. 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해준다.
  • 자바에서 클래스 이름의 첫 글자는 대문자로 시작한다. 그리고 나머지는 모두 첫 글자를 소문자로 시작한다. 여기 에 낙타 표기법을 적용하면 된다.
  • 변수 이름은 일반적으로 명사를 사용한다. 한편 메서드는 무언가 동작하는데 사용하기 때문에 일반적으로 동사로 시작 한다.

  • 자바는 항상 변수의 값을 복사해서 대입한다. 결국 참조형 변수에 있는 값인 참조값을 복사하는 것이다.

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

6. 스크립트 작성

입출금 프로그램 리팩토링 

코드 확인

  • 잔액이 0원인 계좌에 10000원을 입금하고 5000원을 출금하는 코드

요구사항

  • 입출금 메서드 리팩토링 - 입금과 출금 로직을 메서드로 생성

코드작성

메서드를 만들기 위해서 접근제어자, 반환 타입, 이름, 본문 순으로 작성.

  • 접근제어자는 public, protected,default,private중 public으로 사용하여 모든 외부 호출을 허용.
  • static을 사용하여 클래스 메서드(정적 메서드)로 만들어서 객체생성없이 static클래스 내에서 사용할 수 있도록.
  • 반환타입은 잔액이기때문에 정수형인 int를 사용
  • 입금 메서드 이름 deposit
  • 메서드 호출시 매개변수에 넘길 인자값 정의, 메서드를 정의할 때 사용되는 변수를 파라미터,매개변수라고 한다.
  • 입금 메서드는 balance에 amount를 더한 값
  • 출력문 
  • 출금 메서드 이름 withdraw
  • 출금 메서드는 balance가 amount보다 크면 출금, 작으면 잔액이 부족합니다를 반복문을 사용
  • 메서드 호출
  • 메서드 호출 메서드 이름에 입력값 작성. 호출시 넘기는 값을 Argument(아규먼트), 한글로 인수 또는 인자라 한다.
  • 메서드 결과 반환 값으로 치환

리팩토링 후 좋아진 점

코드 구조를 한눈에 확인할 수 있음.

입금과 출금을 구분, 수정시 찾아가기 쉬움.

구조적으로 읽기 쉽고 유지보수하기 좋음.

입출금 프로그램 작성

문제 설명

  • 간단한 입,출금프로그램을 만들면서  출력문, 조건문, 반복문, 메서드가 어떻게 사용되는지 공부할 수 있는 문제
  • 잔액이 0원인 계좌에 10000원을 입금하고 5000원을 출금하는 코드
  • 잔액보다 많은 액수를 출금하면 잔액 부족 메세지

 

잔고 변수를 생성하고 0으로 초기화.

Scanner객체를 생성하여 금액을 입력 받을 수 있도록.

프로그램을 실행하기 위한 while문으로 무한 반복문 생성하여 무한루프 생성 

메뉴, 선택 양식 출력문 작성

선택 변수 생성 입력값 대입

반복문 전에 필요한 변수선언과 초기화 입금 출금액 amount변수 선언

 

프로그램의 조건에 맞게 switch 문으로 case 생성

 

입출금 메서드 deposit, withdraw 생성

  • case1 입금 입금메서드 호출 
  • case2 출금 출금 메서드 호출
  • case3 현재잔액 break를 하면  switch문 밖으로 나오지만 while문으로 프로그램 내 반복
  • case4 종료는 return을 하면  메인메서드 밖으로 프로그램 종료
  • default 는 잘못입력했을때