제어문(Control Statement)
- 프로그램의 흐름을 변경하는 명령어
- 프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 순서대로 처리되는데 이러한 흐름을 변경하는 명령어
1.종류
1) 분기문
- 조건이나 값을 가지고 분기(갈림길)
if 와 switch
2) 반복문(Loop)
- 동일한 패턴의 문장을 반복 수행
while, do~while, for
3) 기타 제어문break, continue, return
2.if
1) 단순 if
if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
() 안의 내용이 true일 때 수행할 내용
}
2) if ~ else
if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
() 안의 내용이 true일 때 수행할 내용
}else{
() 안의 내용이 false일 때 수행할 내용
}
3) if ~ else if ~ else
if(boolean 데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){
() 안의 내용이 true일 때 수행할 내용
}else if(새로운 비교 내용){
앞의 조건이 false 이고 ()안의 조건이 true 일 때 수행할 내용
}else{
() 안의 내용이 false일 때 수행할 내용
}
- else if는 무제한 사용이 가능
- else는 생략이 가능
실습1)
- 점수를 입력받아서 60점이 넘으면 합격이라고 출력하기
//키보드로부터 입력받기 위한 객체를 생성
Scanner sc = new Scanner(System.in);
//점수 입력받기
System.out.print("점수 입력:");
int score = sc.nextInt();
//점수가 60이상이면 합격이라고 출력
if(score >= 60){
System.out.println("합격");
}
sc.close();
실습2)
- 점수가 60이상이면 합격 아니면 불합격
// 키보드로부터 입력받기 위한 객체를 생성
Scanner sc = new Scanner(System.in);
// 점수 입력받기
System.out.print("점수 입력:");
int score = sc.nextInt();
// 점수가 60이상이면 합격 아니면 불합격 이라고 출력
if(score >= 60) {
System.out.println("합격");
}else {
System.out.println("불합격");
}
sc.close();
실습3)
90 - 100 이면 A
80 - 90미만이면 B
70 - 80미만이면 C
60 - 70미만이면 D
0 - 60미만이면 F
- 자바는 위의 조건이 아래 조건을 포함하면 에러가 발생
- 결코 도달할 수 없는 코드를 만들면 에러가 발생
- 이런 경우 else 의 용도 ?
// 키보드로부터 입력받기 위한 객체를 생성
Scanner sc = new Scanner(System.in);
// 점수 입력받기
System.out.print("점수 입력:");
int score = sc.nextInt();
// 점수가 90-100 사이이면 A, 80-90미만이면 B
// 점수가 70-80미만이면 C, 60-70미만이면 D
// 점수가 0-60미만이면 F 라고 출력
if(score >= 90 && score <= 100) {
System.out.println("A");
}else if(score >= 80 && score < 90) {
System.out.println("B");
}else if(score >= 70 && score < 80) {
System.out.println("C");
}else if(score >= 60 && score < 70) {
System.out.println("D");
}else if(score >= 0 && score < 60){
System.out.println("F");
}else {
System.out.println("잘못된 점수 입력");
}
//else는 예외적인 상황 발생에 대한 처리를 해주는 것이 좋습니다.
sc.close();
3.switch
- 값에 의한 분기
switch(정수나 문자열 변수 또는 연산식 그리고 메소드 호출){
case 값1:
( )안의 내용이 값1일 때 수행할 내용;
(break;)
case 값2:
( )안의 내용이 값2일 때 수행할 내용;
(break;)
...
default:
일치하는 값이 없을 때 수행할 내용;
(break;)
}
- 문자열은 자바 1.7 버전부터 지원
- case 옆에 작성하는 값은 리터럴이거나 final 변수이어야 합니다.
- 변수를 만들 때 자료형 앞에 final을 기재하면 자바에서는 읽기 전용 변수(상수)가 됩니다.
- case 구문안에서 break를 생략하면 break를 만날 때 까지 모든 문장을 전부 수행
실습
)
정수를 1개 입력받아서 1이면 한식 2이면 중식 3이면 분식 나머지 경우는 일식이라고 출력
값을 가지고 분기하는 경우인데 if 로 작성이 가능하지만 값에 따라 다른 문장을 실행할 때는 switch를 사용하는 것을 권장
// 키보드로부터 입력받기 위한 객체를 생성
Scanner sc = new Scanner(System.in);
// 메뉴 입력받기
System.out.print("메뉴 입력(1-한식 2-중식 3-분식 기타-일식):");
int menu = sc.nextInt();
//읽기 전용의 변수를 생성
final int KOREA = 1;
final int CHINA = 2;
final int SNACKBAR = 3;
switch(menu) {
case KOREA:
System.out.println("한식");
break;
case CHINA:
System.out.println("중식");
break;
case SNACKBAR:
System.out.println("분식");
break;
default:
System.out.println("일식");
break;
}
sc.close();
4.반복문
- 패턴을 갖는 문장을 연속적으로 사용해야 하는 경우 반복문을 사용할 수 있습니다.
1) while
while(boolean 데이터 또는 boolean이 리턴되는 연산식 또는 메소드 호출){
( )의 값이 false가 아닐 때 수행할 내용;
}
//Hello Java 를 3번 출력
System.out.println("Hello Java");
System.out.println("Hello Java");
System.out.println("Hello Java");
int i = 0;
while(i<3){
System.out.println("Hello Java");
i = i + 1;
}
2) do ~ while
do{
반복 수행할 내용;
}while(조건);
- 무조건 반복 수행할 내용을 하고 조건을 확인해서 false가 { }안의 내용을 반복
- do ~ while을 while 로 변경할 수 있지만 반드시 1번은 수행해야 한다 라는 의미를 전달하기 위해서 사용
i = 0;
do{
System.out.println("Hello Java");
i = i + 1;
}while(i<3);
3) for
for(처음 한번만 수행할 내용; 조건; 두번째 부터 수행할 내용){
조건이 false가 아니라면 수행할 내용;
}
- 각 영역은 생략이 가능
for(int i=0; i<3; i=i+1){
System.out.println("Hello Java");
}
int i=0;
for( ; i<3; i=i+1){
System.out.println("Hello Java");
}
for(int i=0, int j=0 ; i<3; i=i+1){
System.out.println("Hello Java");
}
4.제어문을 사용할 때 주의 할 점
- if 나 switch, while, for를 쓸 때 주의할 점은 ( ) 뒤에 ;을 하는 것입니다.
- ( ) 뒤에 ;을 하게 되면 조건은 무시되고 { }안의 내용을 무조건 한 번만 수행합니다.
실습 - 반복문 : Hello Java를 3번씩 출력하기
//while은
//한번만 수행할 내용 -> while(조건) -> { }내에 반복수행할 내용
int i = 0;
while(i<3){
System.out.println("Hello Java");
i = i + 1;
}
System.out.println("======================");
//do~while은
//한번만 수행할 내용 -> do{반복 수행할 내용} -> while(조건);
i = 0;
do {
System.out.println("Hello Java");
i = i + 1;
}while(i<3);
System.out.println("======================");
//for
//for(한번만 수행할 내용; 조건; 두번째부터 수행할 내용){반복 수행할 내용}
for(i=0; i<3; i=i+1) {
System.out.println("Hello Java");
}
자바에서의 제어문
1.분기문: if(조건에 의한 분기 - boolean), switch(값에 의한 분기 - 정수, 문자열)
2.반복문: while, do~while, for
3.규칙
1)제어문은 하나의 블록이어서 제어문 안에 만든 변수는 제어문 안에서만 사용이 가능
2)제어문 내의 실행 문장이 하나의 명령어라면 { } 생략 가능
3)제어문 안에 제어문을 포함 할 수 있음
for(int i=0; i<10; i=i+1){
System.out.println("i:" + i);
}
System.out.println("i:" + i); //이 구문은 에러
for(int i=0; i<10; i=i+1)
System.out.println("i:" + i);
//이 경우 실행 명령어가 1개 이므로 { }를 생략할 수 있음
//이 경우 들여쓰기를 정확하게 하지 않으면 코드의 가독성을 떨어뜨릴 수 있기 때문에 권장하지는 않음
기타 제어문
1.break
- switch 구문에서 switch 구문을 종료하거나 반복문에서 조건문과 함께 사용되서 반복문을 중단하는 역할을 수행하는 명령어
2.continue
- 반복문에서 조건문과 함께 사용되서 다음 반복으로 넘어가는 역할을 수행하는 명령어
// 1부터 10까지 출력하는 구문
for (int i = 1; i < 11; i = i + 1) {
// 4의 배수가 되면 반복문 중단 - 1, 2, 3 중단
if (i % 4 == 0) {
break;
}
System.out.println("i:" + i);
}
System.out.println("============================");
// 1부터 10까지 출력하는 구문
for (int i = 1; i < 11; i = i + 1) {
// 4의 배수가 되면 다음 반복으로 이동
//1,2,3,5,6,7,9,10
if (i % 4 == 0) {
continue;
}
System.out.println("i:" + i);
}
3.java 에서는 반복문에 레이블을 설정할 수 있고 break 나 continue를 할 때 뒤에 레이블을 붙이면 레이블이 반복문을 빠져 나가거나 다음 반복으로 이동할 수 있습니다.
- C 언어에는 go to 가 있어서 특정할 레이블이 붙은 곳으로 바로 이동이 가능
- 구조적 프로그래밍 기법에서 go to 사용을 배제하는 것을 권장
- java 에서는 go to 사용을 배제하기 위해서 예약어지만 사용할 수 없도록 함
- 여러 개의 반복문에서 break 만으로 여러 개의 반복문을 빠져 나가거는 것이 복잡해 졌습니다.
- 반복문에 레이블을 붙일 수 있도록 함
1) 레이블 추가레이블 : 반복문
2) 레이블 사용break 레이블;
3) 레이블이 없는 경우는 가장 가까이서 만든 반복문을 중단
제어문 연습
1.교번 처리
- 일정한 패턴 반복, 나머지 연산자 이용
- ON 과 OFF를 교대로 10번 출력
for(int i=0; i<10; i = i+1){
if(i%2 ==0){
System.out.println("ON");
}else{
System.out.println("OFF");
}
}
2.반복문을 이용한 일정한 패턴의 문자열 만들기
동아일보에서 자바로 검색했을 때 총 데이터 건수는 1164개이고
url은 아래와 같은 형태, 페이지마다 p의 값이 15씩 증가
제어문을 이용해서 전체 데이터를 스크랩 할 수 있는 URL을 생성
먼저 구해야 하는 것은 전체 데이터 건수를 가지고 몇 번 반복문을 수행해야 하는지 찾아야 하고
반복문안에서 URL을 만들어 주어야 합니다.
http://www.donga.com/news/search?p=1&query=자바
http://www.donga.com/news/search?p=16&query=자바
http://www.donga.com/news/search?p=31&query=자바
//첫번째 페이지 URL
//http://www.donga.com/news/search?p=1&query=자바
//각페이지 마다 기사가 15개씩 있어서 p의 값이 15씩 증가
//총 데이터 건수는 1164
int total = 1164;
//페이지 개수 만들 때는 나누어 떨어지지 않으면 몫 + 1
int pagesu = 1164 / 15;
if(total % 15 != 0 ) {
pagesu = pagesu + 1;
}
for(int i=0; i<pagesu; i=i+1) {
//페이지 별 기사의 시작 번호
int p = 15 * i + 1;
//기사의 URL 만들기
System.out.println(
"http://www.donga.com/news/search?p=" + p +
"&query=자바");
}
3.정수를 입력받아서 소수 판별하기
- 소수(prime): 2부터 자신의 절반이 되는 숫자까지 나누어서 한번도 나누어 떨어지지 않으면 소수
//하나의 정수 입력받기
Scanner sc = new Scanner(System.in);
System.out.print("소수 판별할 정수 입력:");
int su = sc.nextInt();
//소수 판별을 위한 플래그 변수를 생성
boolean flag = false;
//소수 판별 반복문
for(int i=2; i<= su/2; i=i+1) {
//이 경우는 소수가 아님
//조건을 만족한 경우 플래그 변수의 값을 변경
if(su % i == 0) {
flag = true;
break;
}
}
//su가 소수인지 출력
if(flag == false) {
System.out.println(su + "는 소수");
}else {
System.out.println(su + "는 소수가 아님");
}
sc.close();
4. 2-1000까지 소수의 개수 구하기
5.반복문 2개를 이용한 별 출력
*
1개 출력 : System.out.print("*")
줄바꿈: System.out.print("\n");
System.out.println("");
*****
*****
*****
*****
*****
for(int i=0; i<5; i=i+1){
for(int j=0; j<5; j=j+1){
System.out.print("*");
}
System.out.print("\n");
}
*
**
***
**
*
위처럼 계속 하나의 패턴이 적용되는 것이 아니고 일정한 패턴이 적용되다가 다른 패턴이 적용되면 분할해서 구현
처음 3줄은 늘어나고 다음 2줄은 줄어드는 패턴
for(int i=0; i<5; i=i+1){
if(i <= 2){
for(int j=0; j<i+1; j=j+1){
System.out.print("*");
}
}else{
for(int j=0; j<5-i; j=j+1){
System.out.print("*");
}
}
System.out.print("\n");
}
연습문제
하나의 정수를 입력받아서 아래처럼 출력하기
5를 입력한 경우
0
1 2
3 4
5 6
78901234
0앞에 공백이 4개
1앞에 공백이 3개 그리고 1과 2사이에 공백 1개
3앞에 공백이 2개 그리고 3과 4 사이에 공백이 3개
5앞에 공백이 1개 그리고 5와 6 사이에 공백이 5개
아래쪽에는 숫자가 9개의 숫자를 출력
9다음의 숫자는 다시 0
'Language_Study > JAVA' 카테고리의 다른 글
[JAVA, App] 5.데이터정렬 (0) | 2020.12.23 |
---|---|
[JAVA, App] 4.Array (0) | 2020.12.23 |
[JAVA, App] 2.연산자 (0) | 2020.12.21 |
[JAVA, App] 1.자료형 (0) | 2020.12.21 |
[JAVA, App] 0.Intro (0) | 2020.12.19 |