JAVA 웹개발 과정 국비 3일차 정리

3일차

※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!


1. 상수

  • 항상 같은 수
  • 반드시 쓸 필요는 없지만 상징적인 특정 값을 사용하기 편하게 이름으로 고정시키는 용도로 사용

1) 상수의 특성

  1. final 키워드를 붙여야 한다.
  2. 변수 이름은 대문자
  3. 값을 변경할 수 없다
  4. 상수를 위와 같이 정의했으므로, 기존의 상수의 의미를 가진 값들을 Literal 상수라고 한다.

이것으로 변수 파트는 끝!!!

2. 연산자

연산에 사용되는 +, -, * 등의 기호

1. Short cut 연산이란?

  • ||(or)연산을 할 때
    좌측 피연산자가 true일 때, 우측 피연산자의 연산을 진행하지 않는다. (이미 true이므로)
  • &&(and)연산을 할 때
    좌측 피연산자가 false이면, 우측 피연산자의 연산을 진행하지 않는다. (이미 false이므로)

별 거 아니라고 생각해서 그냥 넘겼는데, 아래 퀴즈를 거의 모두가 틀렸다.
잘 봐둬야겠다.

public class Quiz_01 {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println(++a == 10 && b++ == 20); // false
		System.out.println(a + " : " + b); // 11 : 20
	}
}

3. 기본 입력

사용자가 프로그램을 쓴다는 것을 염두에 두고 만들어라.

  • Batch 프로그램 (일괄처리형 프로그램) : 지금까지 만들었던 기초적인 프로그램들
  • Batch 프로그램 + 기본입력 : 대화형 프로그램

1) System.in.read(); -> 단일 문자 입력

  • 입력 Buffer로부터 Data를 ASCII 코드 만큼 입력 받음 (한글자의 입력을 받는다)
  • int형으로 입력받는다

이 코드만 쓰면 자바가 코드를 실행하지 않는다.
입력받을 때 오류가 생길 수도 있는데 어떻게 할지 정해주지 않았기 때문이다.
이럴때는 1) 예외처리2) 예외전가 의 방법을 쓸 수 있다.
지금은 어려운 내용이기 때문에 2) 예외전가를 이용해서 넘겨버리는 방법을 택한다.
아래 코드에서는 throw Exception가 그 방법이다.

public class Exam_01 {
	public static void main(String[] args) throws Exception { // 예외전가 
		
		System.out.print("문자를 한글자 입력하세요 : ");
		int num1 = System.in.read(); // int형으로 입력받으므로
	                                 // int형 변수에 넣을 수 있다.
		System.out.println("입력받은 문자 : " + (char)num1);
		
	}                                
}

만약 2번 연속 문자를 입력 받고 싶다면 어떻게 해야할까?
위의 코드를 반복해서 2번 작성해주면 될 것이다.
그러나 실행하면 2번째 문자를 받지 않고 프로그램 실행이 끝나버리는 것을 알 수 있다.

public class Exam_01 {
	public static void main(String[] args) throws Exception { // 예외전가 
		
		System.out.print("문자를 한글자 입력하세요 : ");
		int num1 = System.in.read(); // int형으로 입력받으므로
	                                 // int형 변수에 넣을 수 있다.
		System.out.println("입력받은 문자 : " + (char)num1);
		
		System.out.print("문자를 한글자 입력하세요 : ");
		int num2 = System.in.read(); 
		System.out.println("입력받은 문자 : " + (char)num2);
	}
}

< 출력결과 >

문자를 한글자 입력하세요 : A
입력받은 문자 : A
문자를 한글자 입력하세요 : 입력받은 문자 : 

이유는 Buffer 때문이라고 할 수 있다.
int num1을 만들고, 입력으로 가기 전 거치는 단계가 있는데 바로 Buffer라는 임시저장소에 찾아가서 가져갈 데이터가 있는지 없는지 확인 후 다음 입력을 받게 된다. (처음은 비어있음)
위의 코드는 아래와 같은 순서로 진행된다.

1. int num1을 생성  
2. buffer에 값이 있는지 없는지 확인 (처음은 비어있음)  
3. 값이 없으므로 입력을 받는다  
4. A 입력 후 엔터  (사용자) 
5. buffer에 A 값과 엔터(\r\n) 저장 (총 3개의 값)  
6. `System.in.read()`가 A를 가져가고, Buffer에서 A가 빠진다  
7. 2번째`System.in.read()`가 실행된다  
8. buffer에 값이 있으므로 '\r'을 가져간다  
9. 프로그램은 종료되고 buffer에 있던 값들은 사라진다  

2번째 System.in.read()가 실행될 때, buffer에 값이 있기 때문에 사용자 입력을 더 받지 않은 것이다.
만약 위의 코드에서 System.in.read()가 3번 반복이 된다면, 역시나 입력 값은 받지 않을 것이고 4번 반복이라면 입력값을 다시 받게 될 것이다.

2) Buffer 란?

  • 충격 완화 장치 같은 역할
  • CPU는 다른 장치들보다 속도가 어마무시하게 혼자 빠른데, 이 CPU는 사용자 입력을 우선으로 처리하게 된다.

buffer를 거치지 않는다면 O/S가 CPU에 I/O interrupt 신호를 보내고 잠시 정지 후 스케쥴링을 다시 한다.
입력이 반복되면 이 과정이 반복되고 결국 CPU의 효율이 떨어지게 된다.
따라서 즉각적인 처리가 필요하지 않은 입력은 CPU에 보내지 않고 buffer에 쌓아두고, 입력이 다 끝나고 엔터를 치면 그때 CPU에 신호를 보내준다.

3) Enter키는 왜 \r\n일까?

Enter 키는 CR(Carriage Return)과 LF(Line Feed) 두가지로 처리된다.
간단하게 타자기를 생각해보면 입력이 길어지면 종이가 옆으로 밀려나고 그 종이를 다시 앞으로 땡겨오는 것을 본 적이 있을 것이다.
CR이 종이를 다시 앞으로 땡겨오는 역할을 하는 것이고, LF가 줄을 바꿔주는 역할을 한다고 생각하면 된다.
CR은 \r이고, LF는 \n이다.
따라서 엔터를 \r\n으로 나타낼 수 있다.

4) Scanner 입력


import java.util.Scanner; // ctrl + shift + o (자동 import 기능)

public class Exam_02 {
	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);  // 지금은 일단 외우기!
		
		String str = sc.nextLine(); // 한 라인을 String형으로 입력받는다.
	}
}

위 코드 관련 내용은 2주 뒤에 배운다고 하니 그냥 외우라고 하셨다.
예습의 효과로 대충 알 것 같기는 하지만 혼란만 가중될 수 있기 때문에 그냥 외우기로 했다.
System.in.read();는 잘 안쓴다고 하셨지만 두가지를 배워서 헷갈릴 수 있으니 표로 만들어놓아야겠다.

입력 코드 System.in.read(); sc.nextLine();
무엇을 입력받는가? 한글자 한라인
타입 int형 String형
import유무 필요없음 필요함
buffer값은? 여러값을 받으면 buffer에 저장됨 엔터 전까지의 모든 값을 가져옴

5) Integer.parseInt();

숫자로 입력받고 싶을 때 사용

import java.util.Scanner;

public class Exam_03 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("숫자를 입력하세요 : ");
		
		
		String num = sc.nextLine();
		
		int result = Integer.parseInt(num);
		
		
		System.out.println(result + 10);
	}
}

sc.nextLine()으로 입력 받은 값은 String형이므로 덧셈을 하고 싶다면 int형으로 바꿔주어야한다.
따라서 Integer.parseInt()를 사용하여 int형 변수에 저장하여 연산을 하면 된다.

댓글남기기