JAVA 웹개발 과정 국비 3일차 정리
3일차
※ 배우는 과정이므로 정확하지 않을 수 있습니다.
잘못된 점은 알려주시면 수정하도록 하겠습니다!
1. 상수
- 항상 같은 수
- 반드시 쓸 필요는 없지만 상징적인 특정 값을 사용하기 편하게 이름으로 고정시키는 용도로 사용
1) 상수의 특성
final
키워드를 붙여야 한다.- 변수 이름은 대문자
- 값을 변경할 수 없다
- 상수를 위와 같이 정의했으므로, 기존의 상수의 의미를 가진 값들을
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형
변수에 저장하여 연산을 하면 된다.
댓글남기기