4. 버퍼이슈와 제어문

지오니모·2022년 7월 2일
0

JavaScript

목록 보기
4/5

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

목차

  1. 기본 입력 System.in.read()
  2. Buffer Issue
  3. Scanner sr = = 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언어와 달리 오류를 선조치하여 작동을 안하게 한디.
    이 때, 위에 나온 에러 경고는 문법 문제가 아니라,
    에러가 발생할 수 있다는 가능성을 말해주는 것으로
    개발자는 컴파일러에게 두가지를 제시할 수 있다.

    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)

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

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

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


4. 제어문

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

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

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


조건문
if else if else

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

  1. if조건식의 결과는 무조건 true,false만 가능하다.
  2. 조건문의 결과값이 false이면 블록 안에 실행문이 실행되지 않는다.

java에서는 다음과 같이 사용된다.

if (menu == 1) {
	System.out.printIn("사과");
} else if (menu == 2) {
	System.out.printIn("딸기");
} else if (menu ==3) {
	System.out.printIn("포도");
} else { //예외처리.
	System.out.PrintIn("메뉴를 다시 확인하세요.")
}

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는 닫는 {}블록을 만나면 다시 해당 반복문의 조건문으로 넘어간다.
그리고 마지막 조건이 flase를 반환할 때{}블록을 나간다.





출처 : https://velog.io/@ho_c/%EA%B5%AD%EB%B9%84%EA%B5%90%EC%9C%A1-Day-4

profile
프론트엔드 지망생

0개의 댓글