본문 바로가기
비전공자코딩교실/JAVA

[비전공자코딩교실] 메소드 만들기 및 예외처리 하기

by 세 미 콜 론 2021. 5. 19.
728x90
반응형

지난 시간에는 직접 사용자로부터 입력을 받아 해당하는 단을 출력하는 프로그램을 만들었습니다. 그런데 생각해보면 문자를 입력했을 때 에러가 나곤 했습니다. 그러면 소스를 조금 더 구조화시켜서 예외처리까지 진행해보도록 하겠습니다. 지난번에 만든 소스를 분해해서 각각의 메소드에 넣도록 하겠습니다.

메소드란 쉽게 말해서 하나의 함수라고 이해하면 좋습니다. 여러 동작을 하나로 묶은 것이기 때문에 함수의 이름은 의미있는 단어로 지정하는 경우가 대부분입니다. 

package test.edu.com;

import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		//1. 사용자에게 구구단 몇 단을 확인할 것이냐는 문구를 출력한다.
		System.out.println("확인하려고 하는 구구단은 몇 단입니까?");
		
		int number = input();
		print(number);
		
	}

	public static int input() {
		//2. 사용자에게 숫자를 입력받는다.
		Scanner scan = new Scanner(System.in);
		int number = scan.nextInt();
		return number;
	}
	
	public static void print(int number) {
		//3. 해당 숫자에 대한 구구단을 출력한다.
		System.out.println("구구단 " + number + "단");
		for (int i = 1; i < 10; i++) {
			System.out.println(number+" X " + i + " = " + number * i);
		}
	}
	
}



소스를 위와 같은 형태로 만들어줍니다. public static void 함수명(함수에서 사용할 것들) 의 형태로 메소드를 선언할 수 있습니다. 소스를 실행하면 기본적으로 main()만 실행하게 됩니다. 따라서 우선 main만 살펴보겠습니다.

순차적으로 실행한다고 했을 때 가장 먼저 지난 시간에 했던 것처럼 확인하려고 하는 구구단이 몇 단인지 출력될 것입니다. 그 후 int number = input(); 이 생겼는데요. 숫자형 number 변수에 input()의 결과를 넣겠다는 뜻입니다. 그렇다면 input()은 무엇일까요? 바로 2번을 넣은 메소드를 뜻합니다. 바로 아래 소스입니다. 

input()은 위 소스입니다. 지난번과 달라진 것은 return number; 밖에 없는데요. 이 것은 이 메소드를 실행하면 number의 값을 리턴, 그러니까 다시넘겨주겠다는 의미입니다. 해당 메소드를 실행하면 number를 얻을 수 있습니다. 자세히 보시면 다른 메소드와 다른 점을 발견할 수 있습니다. 바로 public static 다음에 void가 아닌 int라고 적혀있는 것인데요. 이 것은 리턴 타입을 지정하는 곳입니다. void는 리턴을 하지 않는 메소드, int라고 써있으면 int형 변수를 리턴하는 메소드라는 뜻입니다. 따라서 input()은 int 타입인 number를 리턴하게 됩니다.

다시 메인 메소드로 돌아왔습니다. input()의 실행 결과로 우리는 사용자가 입력한 숫자 number를 리턴 받았습니다. 이 숫자를 다시 int형 변수 number에 넣어주도록 하겠습니다. 그러면 사용자가 입력한 숫자는 main()에 있는 number 변수에 담기게 됩니다. 이 후 실행은 print(number);입니다. 그럼 print() 메소드를 확인해볼까요?

print(int number)는 위 소스입니다. 위에서 배웠던 리턴 타입은 void, 즉 리턴 없음으로 되어있는 것을 볼 수 있습니다. 이름이 print이니만큼 출력을 수행하게 됩니다. 이 소스는 우리가 전에 짰던 3번 소스와 동일 합니다. 출력만 담당하고 있다는 것을 알 수 있습니다. 

그럼 왜 이렇게 소스를 잔뜩 분해했을까요? 그 것은 바로 이후 유지보수를 쉽게 하기 위함입니다. 지금은 소스가 짧으니 괜찮지만 후에 실제 일을 하다 보면 1000줄이 넘어가는 소스도 심심찮게 볼 수 있습니다. 그렇기 때문에 소스를 메소드 별로 구분하여 의미있는 이름을 지어 유지보수를 편하게 할 수 있습니다. 

지금 만든 이 소스를 실행해보도록 하겠습니다. 

원하는 대로 확인하려고 하는 구구단이 출력됩니다. 그럼 이제 문자를 입력했을 때 오류가 나던 것을 수정해보도록 하겠습니다. 입력하는 부분은 input() 메소드이니 여기만 보면 됩니다. 

소스를 변경해봤습니다. 모르는 것들이 잔뜩 생겼는데요. 우선 while은 바로 뒤에 있는 ()안의 내용이 참이 될 때까지 계속 반복하라는 얘기입니다. 즉 뒤에 있는 scan.hasNextInt()가 참이면 중지인데 그 앞에 !가 하나 있습니다. JAVA에서 !는 역이라고 생각하면 됩니다. true면 false로 false면 true로 바꿔주는 역할을 합니다. scan.hasNextInt()는 스캐너 클래스가 가지고 있는 메소드 중 하나인데요. 스캐너에 넣은 내용이 int형이 맞냐는 질문입니다. 그렇기 때문에 int형이 아니라면 계속 { }의 내용을 반복하게 됩니다.

{ }의 내용을 살펴보면 입력받은 내용을 확인하고 숫자가 아니라고 표시해주고 있습니다. 한 번 실행해볼까요? 

우리의 의도대로 숫자가 아니라면 다시 입력하게 하는 소스가 완성되었습니다.

728x90
반응형

댓글