13강. 변수와 시스템 입출력(1) - 모니터로 변수값 출력하기
14강. 변수와 시스템 입출력(2) - 키보드에서 입력된 내용을 변수에 저장하기
15강. 연산자와 연산식
16강. 연산자의 종류(1) - 단항 연산자, 이항 연산자
17강. 연산자의 종류(2) - 이항 연산자, 삼항 연산자
18강. 조건문 - if문, switch문
19강. 반복문 - for문, while문, do-while문
13강. 변수와 시스템 입출력(1) 모니터로 변수값 출력하기
ㅁ 프로그래밍 언어에는 시스템 표준 출력 장치와 표준 입력 장치가 있음.
- 자바에서 표준 출력 장치는 모니터를 말하고, 표준 입력 장치는 키보드를 말함.
ㅁ println() 메소드
- 괄호 안에 리터럴 넣으면 그대로 출력, 변수 넣으면 저장된 값 출력
ㅁ 다양한 출력 메소드
- println(내용); // 괄호 안의 내용을 출력하고 행을 바꿔라
- print(내용); // 괄호 안의 내용을 출력만 해라
- printf("형식 문자열", 값1, 값2, ...); // 괄호 안의 첫 번째 문자열 형식대로 내용을 출력해라
ㅁ printf() 메소드
- 개발자가 원하는 형식화된 문자열(format string) 출력. // 전체 출력 자리수 설정, 소수 자릿수를 제한 등
- printf("형식 문자열", 값1, 값2, ...);
% [argument_index$] [flag] [width] [.precision] conversion
값의 순번 -, 0 전체자릿수 소수자릿수 변환문자(d, f, s 등)
형식 문자열에서 %와 conversion 외에는 모두 생략 가능.
System.out.printf("이름: %s", "가나다"); // 이름: 가나다
System.out.printf("나이: %d", 25); // 나이: 25
- 형식 문자열에 포함될 값이 2개 이상인 경우 값의 순번(argument_index$) 표시해야 함.
System.out.printf("이름: %1$s, 나이: %2$d", "가나다", 25); // 이름: 가나다, 나이: 25
값의 순번은 "가나다", 25 등의 값이 몇번째에 들어가야 하는지. 첫번째 값이 가나다고 두번째 값이 25다.
ㅁ 다양한 형식 문자열
14강. 변수와 시스템 입출력(2) 키보드에서 입력된 내용을 변수에 저장하기
ㅁ 키코드
- 키보드의 키를 숫자로 매핑한 걸 말함. (예를 들면 알파벳 A는 65로 매핑이 되어 있음.)
(키보드에서 알파벳 A를 입력하면 프로그램에서는 65라는 값을 읽을 수 있음.)
- 키보드에서 키를 입력할 때 프로그램에서 숫자로 된 키코드를 읽음.
- System.in의 read() 사용
- 얻은 키코드는 대입 연산자를 사용하여 int 변수에 저장
- A누르고 엔터치면 65, 13, 10이 읽혀짐.
ㅁ 예제
public static void main(String[] args) throws Exception {
int keyCode;
keyCode = System.in.read(); System.out.println("keyCode: " + keyCode);
}
- read() 메소드를 사용하면 키보드로부터 키코드를 읽는데 에러가 날 수 있음.
그래서 자바에서는 예외처리를 할 수 있도록 throws Exception(예외 처리 코드)을 제공함.
에러( =예외)가 나게 된다면 throws Exception을 붙여주면 그 예외를 그냥 모니터에 출력하고 끝내라는 뜻.
- 이걸 실행하면 콘솔창에 커서가 깜박 거리고 빨간색 정지 버튼이 활성화 됨.
이 프로그램이 실행중이라는 뜻.
프로그램이 아직 종료되지 않고 키보드로부터 입력이 될 때까지 기다리는 중.
- [실행결과] // A 입력 후 엔터.
키코드: 65
ㅁ 예제 변형
public static void main(String[] args) throws Exception {
int keyCode;
keyCode = System.in.read();
System.out.println("keyCode: " + keyCode);
keyCode = System.in.read();
System.out.println("keyCode: " + keyCode);
- [실행결과] // (A 입력 후 엔터) 키코드: 65 키코드: 13
- keyCode를 한번 더 복사해서 추가하면 65, 13, 10이 나옴.
ㅁ 예제2
public static void main(String[] args) throws Exception {
int keyCode;
while(true) {
keyCode = System.in.read();
System.out.println("keyCode: " + keyCode); }}
- 이건 A누르고 엔터치면 65, 13, 10 나오고 프로그램이 안꺼진 상태로 계속 있음. 다음 입력값을 계속 기다림.
- 프로그램을 종료하고 싶다면 빨간버튼을 강제로 눌러야 함.
ㅁ 예제2 변형
public static void main(String[] args) throws Exception {
int keyCode;
while(true) {
keyCode = System.in.read();
System.out.println("keyCode: " + keyCode);
if(keyCode == 81)
{ break; } }
System.out.println("종료");
}
- Q를 입력하면 종료되게끔 만든 버전.
- [실행결과] // Q 입력시
keyCode: 81
종료
ㅁ System.in.read()의 단점
- 2개 이상 키가 조합된 한글 읽을 수 없음. // '한' (ㅎ, ㅏ, ㄴ의 키 입력 3번이 읽어나는데 read()는 한번에 읽지 못함.)
- 키보드로 입력된 내용을 통문자열로 읽을 수 없음. // "우리나라", "ABCD"
- System.in.read()를 사용한 위의 예제에서 'ㄱ'을 입력시 아래와 같이 출력됨.
키코드: 164
키코드: 161
키코드: 13
키코드: 10
이유는 한글은 2바이트로 이루어진 유니코드인데, System.in.read() 메서드는 유니코드 문자의 각 바이트를 개별적으로 읽기 때문에, 한글 문자 'ㄱ'의 경우 두 개의 바이트 값을 읽게 됩니다.
ㅁ Scanner로 해결
- 자바가 제공하는 Scanner 클래스를 이용하면 입력된 통문자열을 읽을 수 있음. // 한글도 읽을 수 있고.
- new라는 객체 생성 연산자로 객체를 만듦.
- Scanner 클래스는 사용자 입력을 받기 위해 사용됩니다.
nextLine() 메소드는 사용자가 엔터를 입력할 때까지의 모든 문자열을 읽어들입니다.
ㅁ 기본 타입의 값 비교와 문자열 비교
(1) 기본 타입 // byte, short, int, long + char + float, double + boolean
- 기본 타입의 값 비교는 ==를 사용
int x = 6; boolean resujlt = (x == 6); // true
(2) 문자열
- 문자열의 비교는 equals() 메소드 사용
boolean result = InputData.eqauls("비교문자열");
저장된 문자열
- String a = "java";
boolean r1 = a.equals("java"); // true
boolean r2 = a.equals("Java"); // false
ㅁ Scanner 예제
import java.util.Scanner ;
public class ScannerExample {
public static void main(String[] args) {
Scanner a = new Scanner(System.in);
String inputData;
while(true)
{
inputData = a.nextLine();
System.out.println("입력된 문자열: \"" + inputData + "\"");
if( inputData.equals("Q") )
{ break; }
}
System.out.println("종료");
}
}
- Scanner를 쓸 때는 꼭 import java.util.Scanner;를 써줘야 함.
ㅁ Scanner 클래스의 생성자
-
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.io.File-
public Scanner(InputStream source)
- 매개변수 source에 입력값이 들어감.
ㅁ Scanner.nextLine() 메서드
-
https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#Scanner-java.io.File-
public String nextLine() // String 반환
현재 행을 지나서 이 스캐너를 전진시키고 건너뛴 입력을 반환합니다.
이 메서드는 끝 부분의 줄 구분 기호를 제외하고 현재 줄의 나머지 부분을 반환합니다.
위치는 다음 줄의 시작 부분으로 설정됩니다.
예외:
NoSuchElementException - 행이 발견되지 않은 경우
IllegalStateException - 이 스캐너가 닫힌 경우
15강. 연산자와 연산식
ㅁ 프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(Operation)이라고 한다.
- 연산자(Operator): 연산에 사용되는 표시나 기호
- 피연산자(Operand): 연산자와 함께 연산되는 데이터
- 연산식(Expression): 연산자와 피연산자를 사용하여 연산 과정을 기술한 것.
ㅁ 연산식은 반드시 하나의 값을 산출한다.
- 그래서 하나의 값이 오는 모든 자리에 연산식을 사용할 수 있다.
int result = x + y;
boolean result = (x + y) < 5;
ㅁ 복합적으로 구성된 연산식의 연산
- 우선순위에 따라 수행된다.
- 우선순위가 같은 연산자는 왼쪽에서 오른쪽 방향으로 수행된다.
단, 대입 연산자는 반대. // a = b = c = 5;
- 단항 -> 이항 -> 삼항
- 산술 -> 비교 -> 논리 -> 대입
- 괄호를 사용해 먼저 처리할 연산식을 묶을 수 있기 때문에 연산자의 우선순위를 외울 필요는 없다.
16강. 연산자의 종류(1) 단항 연산자, 이항 연산자
ㅁ 연산자의 종류
- 자바에서 삼항 연산자는 조건 연산자밖에 없음.
ㅁ 논리 부정 연산자
- ! boolean형 피연산자 // true면 false로, false면 true로.
- not이라고 읽음.
ㅁ 산술 연산자
- 두 피연산자 중 하나가 long 타입이면 long 타입으로 변환.
- int와 double, float과 double이 연산되면 int와 float이 double형이 됨.
ㅁ 리터럴과의 산술연산, 변수와의 산술연산의 차이점.
(1) char c1 = 'A' + 1;
(2) char c2 = 'A';
(3) char c3 = c2 + 1; // 컴파일 에러
- (1) 자바 컴파일러는 리터럴이 두 개 있는걸 확인하고 연산을 함.
바이트 코드에는 66이 들어감. ('A' + 1이 아니라)
- (3) 그런데 이와 같이 변수가 산술연산에 사용되면 자바 컴파일러가 연산하지 않음.
c2 + 1 이대로 바이트코드를 만들고, 나중에 JVM이 c2 + 1 연산을 함.
JVM이 이 연산을 하게 되면 두 피연산자가 int 타입 이하일 경우에는 int 타입으로 변환을 해서 연산을 하고,
연산의 결과도 int가 됨.
int가 char보다 크므로 이대로 넣을 수 없어서 컴파일 에러가 발생함.
(c3을 int형으로 바꾸든지 아니면 (char)로 명시적 형변환)
17강. 연산자의 종류(2) 이항 연산자, 삼항 연산자
ㅁ 비교 연산자
- 동등 비교 연산자( ==, != )는 모든 타입에 사용 가능.
- 크기 비교 연산자( <, <=, >, >= )는 boolean 외 모든 기본 타입에 사용 가능.
ㅁ 논리 연산자
- boolean 타입에만 사용 가능
- &와 |이 비트 연산자로도 쓰이고, 논리 연산자로도 쓰인다.
short-circuit evaluation를 하지 않는게 &&, ||와의 차이점이다.
18강. 조건문 - if문, switch문
ㅁ if문을 사용한 임의의 주사위 눈을 출력하는 예제
- Math.random() 메소드는 0 이상 1 미만의 임의의 실수를 리턴을 함.
- Math.random() * 6 // 0.0 <= ~ < 6.0
- (int) (Math.random() * 6) // 0, 1, 2, 3, 4, 5
- (int) (Math.random() * 6) + 1 // 1, 2, 3, 4, 5, 6
- System.out.println((int) (Math.random() * 6) + 1 ); // 1, 2, 3, 4, 5, 6이 랜덤으로 출력됨.
-
public static void main(String[] args) {
int num = (int) (Math.random() * 6) + 1 ;
if(num == 1)
{ System.out.println( "1번 입니다."); }
else if(num == 2)
{ System.out.println( "2번 입니다."); }
else if(num == 3)
{ System.out.println( "3번 입니다."); }
else if(num == 4)
{ System.out.println( "4번 입니다."); }
else if(num == 5)
{ System.out.println( "5번 입니다."); }
else
{ System.out.println( "6번 입니다."); }
}
ㅁswitch문을 사용한 임의의 주사위 눈을 출력하는 예제
public static void main(String[] args) {
int num = (int) (Math.random() * 6) + 1 ;
switch(num) {
case 1:
{ System.out.println( "1번 입니다."); break; }
case 2:
{ System.out.println( "2번 입니다."); break; }
case 3:
{ System.out.println( "3번 입니다."); break; }
case 4:
{ System.out.println( "4번 입니다."); break; }
case 5:
{ System.out.println( "5번 입니다."); break; }
case 6: // "case 6:" 대신 "default:"도 가능.
{ System.out.println( "6번 입니다."); break; } // "break;" 없어도 됨.
}
}
ㅁ switch(n)
- n에는 int형의 값 뿐아니라 byte, short + char + enum + String 의 값들도 올 수 있다. // 모두 정수타입으로 취급.
- long, float, double, boolean은 올 수 없다.
-
char grade = 'B';
switch(grade) {
case 'A':
System.out.println(grade + " 학점입니다.");
break;
case 'B':
System.out.println(grade + " 학점입니다.");
break;
default:
System.out.println("C학점 이하입니다.");
}
-
String position = "과장";
switch(position) {
case "부장":
System.out.println(" 부장입니다. ");
break;
case "과장":
System.out.println(" 과장입니다.");
break;
default:
System.out.println("부장도 과장도 아닙니다.");
}
- case: 와 default: 뒤에 실행문이 여러개 와도 중괄호를 넣지 않을 수 있다.
19강. 반복문 - for문, while문, do-while문
ㅁ 반복문에는 for문, while문, do-while문이 있다.
ㅁ 반복문이 중첩되어 있는 경우 모든 반복문을 빠져나가는 방법
(1) break 문을 사용한 방법
- break 문은 가장 안쪽에 있는 반복문 하나만 종료합니다.
- 중첩된 반복문을 한꺼번에 종료하려면 레이블(label)을 사용할 수 있습니다.
- 레이블을 사용한 break 레이블을 사용하면 특정 레이블이 붙은 반복문을 종료할 수 있습니다.
- 레이블은 식별자 뒤에 콜론(:)을 붙여 선언합니다.
public class BreakWithLabel {
public static void main(String[] args) {
outerLoop: // 레이블 선언
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6)
{ break outerLoop; // outerLoop 레이블이 붙은 반복문 종료 }
System.out.println("i: " + i + ", j: " + j);
}
}
System.out.println("반복문 종료");
}
}
(2) return 문을 사용한 방법
- 메서드 내에서 중첩된 반복문을 모두 빠져나가고자 할 때 return 문을 사용할 수 있습니다.
- return 문을 사용하면 현재 메서드의 실행을 종료합니다.
public class ReturnExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6) { return; // 메서드 종료 }
System.out.println("i: " + i + ", j: " + j);
}
}
System.out.println("이 문장은 출력되지 않습니다.");
}
}
(3) 플래그 변수를 사용하는 방법
- 플래그 변수를 사용하여 조건이 충족되었음을 표시하고, 각 반복문에서 플래그 변수를 확인하여 반복문을 종료하는 방법도 있습니다.
public class FlagExample {
public static void main(String[] args) {
boolean flag = false;
for (int i = 0; i < 5 && !flag; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6) { flag = true; break; // 내부 반복문 종료 }
System.out.println("i: " + i + ", j: " + j);
}
}
System.out.println("반복문 종료");
}
}
ㅁ continue문
- for, while, do-while문에서만 사용.
- for문의 증감식이나 while, do-while문의 조건식으로 이동. // 그 아래 실행문들을 실행하지 않음.
- 주로 if 문과 함께 사용.
'혼자 공부하는 자바' 카테고리의 다른 글
혼자 공부하는 자바 (34강 ~ 39강) (0) | 2024.05.29 |
---|---|
혼자 공부하는 자바 (27강 ~ 33강) (0) | 2024.05.28 |
혼자 공부하는 자바 (20강 ~ 26강) (0) | 2024.05.26 |
혼자 공부하는 자바 (7강 ~ 12강) (0) | 2024.05.23 |
혼자 공부하는 자바 (1강 ~ 6강) (0) | 2024.05.23 |