여태 작성한 프로그램은 Batch, 일괄처리형 프로그램
이라 한다.
이는 예정되어 있던 코드를 한 번에 실행하고 끝내는데, 막상 우리가 사용하는 프로그램은 일괄처리가 아니다.
우리가 사용하는 프로그램의 코드들을 사용자와 상호작용을 통하는데 이를 대화형 프로그램
이라고 한다.
이를 위해 오늘은 기본 입력부터 제어문까지 공부했다.
- 기본 입력
System.in.read()
- Buffer Issue
Scanner sc = = new Scanner(System.in)
- 제어문
System.in.read()
프로그램 사용자로부터 값을 입력받아
라는 명령
으로 단일 문자 입력이다.
사용자가 입력하게 하는 명령
System.in
/ 사용자에게 출력하는 명령System.out
개발을 하다보면 막상 구현보다 더 익숙해야되는 것이 오류이다.
그리고 개발과정에서 오류가 발생하면 컴퓨터는 다음과 같은 문구를 개발자에게 출력한다.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unhandled exception type IOException
at Exam_01.main(Exam_01.java:6)
Unhandled exception
: 조작되지 않아서 예외
이런 오류에 대해서 우리는 java
의 특징으로 다음과 같은 선택을 할 수 있다.
- 자바는 예외에 굉장히 예민하여, C언어랑 달리 오류를 선조치하여 작동을 안 하게 한다.
이 때, 위에 나온 에러 경고는 문법 문제가 아니라, 에러가 발생할 수 있다는 가능성을 말해주는 것으로 개발자는 컴파일러에게 2가지를 제시할 수 있다.1) 예외처리 : 에러나면 이렇게 처리해
2) 예외전가 : 네가 알아서 처리해. 에러나면
따라서 우리는 위의 문제 해결을 위해 예외 전가
를 선택하여 다음과 같이 해결하면 된다.
public static void main(String[] args) throws Exception
이런 처리 후, 프로그램을 실행하면 사용자로부터 입력을 받고, 이를 read()
는 buffer
에 ACSII
1개만큼 int
로 저장한다.
‘A’ → Save : int 65
int i = System.in.read(); // 입력받는 순간 Enter, 입력받은 걸로 변환됨.
입력 값은 변수에 저장하여 응용할 수 있다.
그럼
read()
를 2번 작성하면 입력을 2번 받을까? 문제는 여기서부터 발생한다.
Buffer Issue
입력 Buffer : 사용자 입력값의 저장소
이는 CPU의 성능과 연결되어 있다.
컴퓨터에서 CPU
는 처리를 담당하는데, 그 처리 순서는 OS
의 스케쥴링 알고리즘에 의해서 정해진다. 사용자의 입력은 그 순위에 있어 높은 편에 속한다.
우선순위 높은 항목이 들어오면 OS
는 I/O interrupt
로 CPU
에게 업무 정지 예정을 준다.
그럼 CPU
는 최대한 급하게 일을 처리하고 잠시 정지하는데, 이 사이에 OS
는 업무 순위를 재배열하게 된다.
이 때, 잦은 입력이 있을 경우, interrupt-재배열
과정이 연속적으로 발생하며 비효율이 생긴다.
따라서 개발자들은 한번에 입력을 받고 저장해둘 Buffer
라는 저장소를 RAM
에 만들게 된다.
즉, 버퍼 공간(램)은 입력을 한번에 받고, 사용자의 입력이 중지되는 신호를 통해 그 이후의 행동을 하게 된다.
이러한 내부 설계에 의해
read()
는 다음과 같이 동작한다.
- 입력을 받기 전
buffer
를 확인buffer
가공백
이면 입력을 받음Enter
와 함께 입력을 멈춤 :입력받은 문자
+Enter(\r \n)
컴퓨터는 Enter도 문자로 인식한다(형태가 없는)- 입력값을
buffer
에 저장buffer
의 첫 문자를ASCII
코드에 대응하는int 값
을 반환한다.예외) buffer에 값이 있으면 입력을 받지 않고 첫 글자를 반환한다.
이를 통해 우리는 Buffer Issue
가 존재한다는 사실과, buffer
저장된 공간의 값은 프로그램이 꺼지면 같이 사라진다는 것을 인지해야 한다.
Scanner sc = new Scanner(System.in)
얇게 배운 상식으로 본다면 이는 다음과 같다.
Scanner클래스
. Scanner클래스를참조변수 sc
로 객체를 생성해서 사용.
- 멤버 메서드 사용
sc.nextLine()
: 입력한 행(문장)을String
으로 받음.
nextLine()
: 문장을 입력받아 변수에 저장하는 명령
Integer.parseInt()
: 괄호 안의 문자열 값을 숫자로 분석(변환)하는 명령, 입력이 숫자가 아니면error
가 발생한다.
코드의 흐름을 제어하는 문법
코드는 한 줄씩 script
를 따라 진행된다.
제어문은 순차적인 흐름을 조건에 따라 통제하는 명령
사용자의 요구에 따라 동작한다.
따라서 그 흐름을 읽어나갈 줄 아는 것이 제어문에선 매우 중요하다.
제어문의 문법은 공통적으로 제어문() {}
형식이다.
if
else if
else
조건문은 특정 조건에만 작성한 실행문이 동작하도록 한다.
때문에 코드의 흐름을 넘길 수도 있고, 여러 방향으로 분기를 할 수 있는데 이는 다음 규정으로 인해 가능하다.
if
조건식의 결과는 무조건true
,false
만 가능하다.- 조건문의 결과값이
false
면 블록 안에 실행문이 실행되지 않는다.
java
에서는 다음과 같이 사용된다.
if(menu == 1) {
System.out.println("사과");
} else if (menu == 2) {
System.out.println("딸기");
} else if (menu == 3) {
System.out.println("포도");
} else { // 예외처리.
System.out.println("메뉴를 다시 확인하시오.");
}
else if
: 종속성 문법,if
없이는 홀로 쓰일 수 없다.
else
: 종속성 문법,if
와else
등 앞 전 흐름이 모두 실행되지 않았을 때, 작동한다. (예외처리)
이런 if
문은 여러 번 중첩에서 사용이 가능하며, 예를 들어 조건의 범위에 따라 세밀하게 동작하길 원할 때 사용한다.
if (select == 5) {
while (true) {
System.out.print("테스트용이며 진짜로 다 날아가니까 진자 초기화를 원하시면 y, 나가고 싶으시면 n을 눌러주세요 >>");
YesOrNO = in.nextLine();
if (!(YesOrNO.equals("y")||YesOrNO.equals("Y")||YesOrNO.equals("n")||YesOrNO.equals("N"))) {
System.out.println("메뉴를 올바르게 입력해주세요~ \n");
continue;
while
: 반복문의 원조로 사용자가 원하는 만큼 명령들을 여러 번 실행하는 제어구조.
변수 값 설정
while (조건문) {
증감식
실행문 1 / 참일 동안만 루프처리를 반복한다.
}
조건문과 반복문의 차이는
if
는 닫는{}블록
을 만나면 흐름에서 탈출한다.
반면while
닫는{}블록
에 만나면 다시 해당 반복문의조건문
으로 넘어간다.
그리고 마지막 조건이false
를 반환할 때{}블록
을 나간다.