Day 4. 버퍼 이슈와 제어문

ho_c·2022년 2월 20일
0

국비교육

목록 보기
4/71
post-thumbnail
post-custom-banner

여태 작성한 프로그램은 Batch, 일괄처리형 프로그램 이라 한다.
이는 예정되어 있던 코드를 한 번에 실행하고 끝내는데, 막상 우리가 사용하는 프로그램은 일괄처리가 아니다.
우리가 사용하는 프로그램의 코드들을 사용자와 상호작용을 통하는데 이를 대화형 프로그램이라고 한다.

이를 위해 오늘은 기본 입력부터 제어문까지 공부했다.

📝 목차

  1. 기본 입력 System.in.read()
  2. Buffer Issue
  3. Scanner sc = = new Scanner(System.in)
  4. 제어문

1. System.in.read()

프로그램 사용자로부터 값을 입력받아라는 명령으로 단일 문자 입력이다.

사용자가 입력하게 하는 명령 System.in / 사용자에게 출력하는 명령System.out

1-1) 예외처리

개발을 하다보면 막상 구현보다 더 익숙해야되는 것이 오류이다.
그리고 개발과정에서 오류가 발생하면 컴퓨터는 다음과 같은 문구를 개발자에게 출력한다.

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()bufferACSII 1개만큼 int 로 저장한다.

‘A’ → Save : int 65

int i = System.in.read(); // 입력받는 순간 Enter, 입력받은 걸로 변환됨. 

입력 값은 변수에 저장하여 응용할 수 있다.

그럼 read()를 2번 작성하면 입력을 2번 받을까? 문제는 여기서부터 발생한다.


2. Buffer Issue

입력 Buffer : 사용자 입력값의 저장소

이는 CPU의 성능과 연결되어 있다.
컴퓨터에서 CPU는 처리를 담당하는데, 그 처리 순서는 OS의 스케쥴링 알고리즘에 의해서 정해진다. 사용자의 입력은 그 순위에 있어 높은 편에 속한다.

우선순위 높은 항목이 들어오면 OSI/O interruptCPU 에게 업무 정지 예정을 준다.
그럼 CPU는 최대한 급하게 일을 처리하고 잠시 정지하는데, 이 사이에 OS는 업무 순위를 재배열하게 된다.

이 때, 잦은 입력이 있을 경우, interrupt-재배열 과정이 연속적으로 발생하며 비효율이 생긴다.
따라서 개발자들은 한번에 입력을 받고 저장해둘 Buffer라는 저장소를 RAM 에 만들게 된다.
즉, 버퍼 공간(램)은 입력을 한번에 받고, 사용자의 입력이 중지되는 신호를 통해 그 이후의 행동을 하게 된다.

이러한 내부 설계에 의해 read()는 다음과 같이 동작한다.

  1. 입력을 받기 전 buffer 를 확인
  2. buffer공백이면 입력을 받음
  3. Enter와 함께 입력을 멈춤 : 입력받은 문자 + Enter(\r \n)
     컴퓨터는 Enter도 문자로 인식한다(형태가 없는)
  4. 입력값을 buffer 에 저장
  5. buffer의 첫 문자를 ASCII 코드에 대응하는 int 값 을 반환한다.
    예외) buffer에 값이 있으면 입력을 받지 않고 첫 글자를 반환한다.

이를 통해 우리는 Buffer Issue가 존재한다는 사실과, buffer 저장된 공간의 값은 프로그램이 꺼지면 같이 사라진다는 것을 인지해야 한다.


3. Scanner sc = new Scanner(System.in)

얇게 배운 상식으로 본다면 이는 다음과 같다.

Scanner클래스. Scanner클래스를 참조변수 sc로 객체를 생성해서 사용.

  • 멤버 메서드 사용
    sc.nextLine() : 입력한 행(문장)을 String으로 받음.

    nextLine() : 문장을 입력받아 변수에 저장하는 명령
    Integer.parseInt() : 괄호 안의 문자열 값을 숫자로 분석(변환)하는 명령, 입력이 숫자가 아니면 error가 발생한다.


4. 제어문

코드의 흐름을 제어하는 문법

코드는 한 줄씩 script를 따라 진행된다.

  • 이 경우, 복잡한 프로그램을 짜기 어렵다.
  • 따라서 제어문을 사용하면 코드의 흐름을 자유 자재로 움직일 수 있다.

제어문은 순차적인 흐름을 조건에 따라 통제하는 명령 사용자의 요구에 따라 동작한다.
따라서 그 흐름을 읽어나갈 줄 아는 것이 제어문에선 매우 중요하다.
제어문의 문법은 공통적으로 제어문() {} 형식이다.


✍ 조건문

if else if else

조건문은 특정 조건에만 작성한 실행문이 동작하도록 한다.
때문에 코드의 흐름을 넘길 수도 있고, 여러 방향으로 분기를 할 수 있는데 이는 다음 규정으로 인해 가능하다.

  1. if 조건식의 결과는 무조건 true, false만 가능하다.
  2. 조건문의 결과값이 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 : 종속성 문법, ifelse 등 앞 전 흐름이 모두 실행되지 않았을 때, 작동한다. (예외처리)

이런 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를 반환할 때 {}블록을 나간다.


profile
기록을 쌓아갑니다.
post-custom-banner

0개의 댓글