제어문(Control Statement)
: 선택문과 반복문 같은 것을 이용해, 프로그램의 흐름(스래드 - Thread)을 바꾸어 주는 문장
=> 선택문(if, switch), 반복문(for, while), 기타(break, continue, return)
-선택문: 명령을 선택해 수행할 수 있게 함 / if문을 더 많이 쓴다
-반복문: 명령을 여러번 수행해야 하는 상황에서 사용
IF
: 조건식에 의해 명령을 선택 실행
형식1) if(조건식) { 명령; 명령; ... }
- 조건식의 결과가 참(true)인 경우 블럭({}) 내부에 작성된 명령들을 실행
- 블럭 내부에 명령이 하나만 작성된 경우 블럭({}) 기호 생략 가능
ex1) 변수값이 50 이상인 경우에만 화면에 출력되도록 프로그램을 작성
int su = 90;
//int su = 40;
if(su >= 50) {
System.out.println("su = " + su);
}
// if 구문에 명령 하나만 존재할 겨우 {}기호 생략 가능 (권장X)
if (su >= 50) System.out.println("su = " + su);
ex2) 변수값이 60 이상인 경우 합격 메세지를 출력하고 60 미만인 경우 불합격 메세지가 출력되도록 프로그램 작성
int score = 50;
if(score >= 60) {
System.out.println("[결과]점수가 60점 이상이므로 합격입니다.");
}
if(score < 60) {
System.out.println("[결과]점수가 60점 미만이므로 불합격입니다.");
}
//[결과]점수가 60점 미만이므로 불합격입니다.
형식-2) if(조건식) { 명령; 명령; ... } else { 명령; 명령; ...}
-조건식 결과가 참(true)인 경우와 거짓(false)인 경우를 구분하여 블럭 내부에 작성된 명령들을 실행
ex1) 변수값이 60 이상인 경우 합격 메세지를 출력하고 60 미만인 경우 불합격 메세지가 출력되도록 프로그램 작성
if(score >= 60) {
System.out.println("[결과]점수가 60점 이상이므로 합격입니다.");
} else {
System.out.println("[결과]점수가 60점 미만이므로 불합격입니다.");
}
ex2) 변수값을 홀수 또는 짝수로 구분하여 출력하는 프로그램 작성
=> X % Y == 0 >> X는 Y의배수 - 배수표현조건식
int num = 10;
if(num % 2 != 0) {
System.out.println(num + " >> 홀수");
} else {
System.out.println(num + " >> 짝수");
}
//10 >> 짝수
ex3) 문자변수에 저장된 문자값을 영문자와 비영문자로 구분하여 출력하는 프로그램 작성
=> X >= 작은값 && X <= 큰값 : X는작은값부터큰값사이의범위안에표현되는값 (범위조건식)
char mun = 'O';
if(mun >= 'A' && mun <= 'Z' || mun >= 'a' && mun <= 'z') {
System.out.println("[결과]" + mun + " = 영문자");
} else {
System.out.println("[결과]" + mun + " = 비영문자");
}
ex4) 조건식 대신 boolean 변수값을 사용하여 명령을 선택하여 실행 가능
boolean sw = false;
if(sw) {
System.out.println("현재 변수값은 [참]입니다.");
} else {
System.out.println("현재 변수값은 [거짓]입니다.");
} //현재 변수값은 [거짓]입니다.
//not연산자 사용하여 부정적 요소를 참으로 선택 실행할 때
if(!sw) {
System.out.println("현재 변수값은 [거짓]입니다.");
} else {
System.out.println("현재 변수값은 [참]입니다.");
} ////현재 변수값은 [거짓]입니다.
형식-3) if(조건식) { 명령; 명령; ... } else if (조건식) { 명령; 명령; ...}
else if (조건식) { 명령; 명령; ...} else { 명령; 명령; ...}
- 조건식이 여러 개인 경우 명령을 구분하여 블럭 내부에 작성된 명령 실행
- 마지막 else에 작성된 명령은 모든 조건식이 거짓인 경우 실행 - else 생략 가능
ex1) 변수값이 0~100 범위의 유효값인지 아닌지를 구분하여 출력하는 프로그램 작성
=> 입력값에 대한 유효성 검증
int jumsu = 85;
if (jumsu >= 0 && jumsu <= 100) {
System.out.println("[결과]0~100 범위의 정상적인 점수가 입력되었습니다.");
//[결과]0~100 범위의 정상적인 점수가 입력되었습니다.
ex 1-1) 변수값으로 등급을 구분하여 출력하는 프로그램 작성
100 ~ 90 : A, 89 ~ 80 : B, 79 ~ 70 : C, 69 ~ 60 : D, 59 ~ 0 : F
int jumsu = 85;
//int jumsu = 185;
if(jumsu >= 0 && jumsu <= 100) {
String grade = ""; // 학점을 저장하기 위한 변수
//=> 변수를 선언할 때는 미리 초기값을 줘야 에러 생기지 않음 (항상 그런것은 X)
if (jumsu <= 100 && jumsu >= 90) {
grade = "A";
} else if (jumsu <= 89 && jumsu >= 80) {
grade = "B";
} else if (jumsu <= 79 && jumsu >= 70) {
grade = "C";
} else if (jumsu <= 69 && jumsu >= 60) {
grade = "D";
} else if (jumsu <= 59 && jumsu >= 0) {
grade = "F";
}
System.out.println("[결과]"+jumsu+"점 = "+grade+"학점");
} else {
System.out.println("[결과]0~100 범위를 벗어난 비정상적인 점수가 입력 되었습니다.");
}
//[결과]85점 = B학점
ex 1-2) 변수값으로 등급을 구분하여 출력하는 프로그램 작성 ( 더 효율적인 방식)
100 ~ 90 : A, 89 ~ 80 : B, 79 ~ 70 : C, 69 ~ 60 : D, 59 ~ 0 : F
int jumsu = 85;
if(jumsu >= 0 && jumsu <= 100) {
String grade = ""; // 여기서는 생략 가능
if(jumsu >= 90) {
grade = "A";
} else if(jumsu >= 80) {
grade = "B";
} else if(jumsu >= 70) {
grade = "C";
} else if(jumsu >= 60) {
grade = "D";
} else {
grade = "F"; // 모든 조건이 거짓인 경우 무조건 실행되는 명령이기 때문에 초기값 주지 않아도 된다
} // (하지만 초기값 주는 것이 낫다)
System.out.println("[결과]"+jumsu+"점 = "+grade+"학점");
} else {
System.out.println("[결과]0~100 범위를 벗어난 비정상적인 점수가 입력 되었습니다.");
}
Switch
: 값을 비교하여 명령 선택 실행(값이 같을 때만 명령을 실행) - 실수값 제외 (double 쓸 수 없다)
형식) switch(비교대상) {
case 값1: 명령; 명령; ... [break;]
case 값2: 명령; 명령; ... [break;] => []는 생략 가능한 것 의미
case 값3: 명령; 명령; ... [break;]
...
[default: 명령; 명령; ...]
}
- 비교대상에는 변수 또는 연산식을 작성하여 비교하고자 하는 값 제공
- 비교대상의 값을 case 키워드로 제공된 값과 차례대로 비교하여 같은 case 키워드의 값을 가지고 있는 위치로부터 작성된
모든 명령 실행
- case 키워드로 제공되는 값은 리터럴 또는 상수(Constant)만 작성 가능 (변수, 연산식 등은 사용할 수 없다)
- case 키워드로 제공되는 값이 중복되어 작성될 경우 에러 발생
- break 키워드를 만나면 switch 구문 강제 종료 (break 이후의 명령 실행x)
- case 키워드로 제공되는 값이 모든 다른 경우 default 키워드의 명령을 실행 - 생략 가능
※ if문이 광범위한 선택을 할 수 있는 반면, switch는 제한적인 선택만 가능
따라서 switch는 if로 바꿀 수 있다 (if는 안되는 경우도 있음)
ex1)
//int choice = 1; // 수성,금성,화성
//int choice = 2; // 금성, 화성
int choice = 3;
switch(choice) {
case 1:
System.out.println("수성으로 이동합니다.");
case 2:
System.out.println("금성으로 이동합니다.");
case 3:
System.out.println("화성으로 이동합니다.");
//화성으로 이동합니다.
ex 1-1)
//switch의 값과 case 값이 모두 다른 경우 명령 미실행
int choice = 4;
switch(choice) {
case 1:
System.out.println("수성으로 이동합니다.");
case 2:
System.out.println("금성으로 이동합니다.");
case 3:
System.out.println("화성으로 이동합니다.");
}
ex 1-2)
//switch의 값과 case 값이 모두 다른 경우 default에 작성된 명령을 무조건 실행
int choice = 4;
switch(choice) {
case 1:
System.out.println("수성으로 이동합니다.");
case 2:
System.out.println("금성으로 이동합니다.");
case 3:
System.out.println("화성으로 이동합니다.");
default:
System.out.println("지구로 이동합니다.");
}
//지구로 이동합니다.
ex 1-3) break문 사용
int choice = 1;
switch(choice) {
case 1:
System.out.println("수성으로 이동합니다."); break;
case 2:
System.out.println("금성으로 이동합니다."); break;
case 3:
System.out.println("화성으로 이동합니다."); break;
}
//수성으로 이동합니다.
ex2) 변수값이 0~100 범위의 유효값인지 아닌지를 구분하여 출력하는 프로그램 작성
//문자열을 비교하여 명령 선택 실행 가능
String kor = "둘";
String eng = "";
switch(kor) {
case "하나" : eng = "One"; break;
case "둘" : eng = "Two"; break;
case "셋" : eng = "Three"; break;
}
System.out.println("[결과]" + kor + " = " + eng);
ex3) 문자열을 비교하여 명령 선택 실행 가능
String kor = "둘";
String eng = "";
switch(kor) {
case "하나" : eng = "One"; break;
case "둘" : eng = "Two"; break;
case "셋" : eng = "Three"; break;
}
System.out.println("[결과]" + kor + " = " + eng);
//[결과]둘 = Two
지역변수(Local Variable)
: 특정 구문에서 선언된 변수 - 블럭({}) 내부에서 선언
=> 지역변수는 선언된 구문에서만 사용 가능
-> 지역변수가 선언된 구문이 종료되면 지역변수 자동 소멸되기 때문
※참고) 전역변수: 특정 영역 바깥에서 만들어짐.
-> but 자바는 전역변수라는 개념이 없다!
자바에서는 모든 것들은 클래스 안에 있어야 동작할 수 있기 때문 (캡슐화 - 하나의 덩어리로 이루어져 있어야 함)
대신 멤버변수 존재.
public class LocalVariableApp {
// int number = 100; //지역변수X 멤버변수.
public static void main(String[] args) {
int num1 = 100; //지역변수
//임의블럭
{
int num2 = 200;
System.out.println("========= 임의블럭 내부 =========");
System.out.println("num1 = " + num1 + " num2 = " + num2);
}
System.out.println("========= 임의블럭 외부 =========");
System.out.println("num1 = " + num1);
//임의블럭 종료시 num2 변수가 자동 소멸되므로 사용 불가능
// System.out.println("num2 = " + num2);
int num2; //재선언 가능 (앞선 num2변수는 임의블록이 종료되면서 소멸되었기 때문)
}
}
For
: 조건에 의해 명령을 반복 실행
=> 반복의 횟수가 명확한 경우 사용하는 반복문(Loop Statement)
형식) for (초기식;조건식;증감식) { 명령; 명령; ... }
- 초기식: 변수에 초기값을 저장하는 연산식
- 증감식: 변수값을 증가시키거나 감소시키는 연산식
=> 초기식, 조건식, 증감식은 반드시 ; 를 이용하여 구분 - for문에 ; 기호를 반드시 2번 사용
실행)
초기식 >> 조건식(참) >> 블럭 내부의 명령 실행 >> 증감식 >> 조건식(참)
>> 블럭 내부의 명령 실행 >> 증감식 >> 조건식(참) >> 블럭 내부의 명령 실행
-> 조건식의 결과가 거짓인 경우 반복문 종료
※ 주의) 조건식의 결과가 계속 참인 경우 무한반복 - 무한루프(Endless Loop) >> 프로그램 강제종료(Terminate)
(네트워크 서버 프로그램 만들기 전까지는 무한루프가 나와서는 안된다)
-초기식, 증감식은 , 기호를 사용하여 나열 작성 가능
-초기식, 조건식, 증감식은 생략이 가능 - 조건이 생략된 경우 무조건 참으로 처리
ex1) "Java Programming"를 화면에 5번 출력
ex 1-1)
System.out.println("Java Programming");
System.out.println("Java Programming");
System.out.println("Java Programming");
System.out.println("Java Programming");
ex 1-2)
for(int i=1;i<=5;i++) {
System.out.println("Java Programming");
}
ex 1-3)
for(int i=5;i>=1;i--) {
System.out.println("Java Programming");
}
ex 1-4)
for(int i=2;i<=10;i+=2) {
System.out.println("Java Programming");
}
ex2) "1 2 3 4 5"를 화면에 출력
for(int i=1;i<=5;i++) {
System.out.print(i+"\t");
}
System.out.println();//Enter 출력
ex3) "5 4 3 2 1"를 화면에 출력
ex3-1)
for(int i=5;i>=1;i--) {
System.out.print(i+"\t");
}
System.out.println();
ex3-2)
for(int i=1;i<=5;i++) {
System.out.print((6-i)+"\t");
}
System.out.println();
ex4) "2 4 6 8 10"를 화면에 출력
ex 4-1)
for(int i=2;i<=10;i+=2) {
System.out.print(i+"\t");
}
System.out.println();
ex 4-2)
for(int i=1;i<=10;i++) {
if(i%2==0) {
System.out.print(i+"\t");
}
}
System.out.println();
ex5) 1~100 범위의 정수들의 합계를 계산하여 출력하는 프로그램 작성 - 1+2+...+99+100 = ?
int tot=0;//정수들의 합계를 저장하기 위한 변수
for(int i=1;i<=100;i++) {
tot+=i;//tot = 1+2+...+99+100
}
System.out.println("1~100 범위의 정수들의 합계 = "+tot);
//1~100 범위의 정수들의 합계 = 5050
ex6) 두 변수에 저장된 정수들의 범위 합계를 계산하여 출력하는 프로그램 작성
int begin=20, end=80;
int sum=0;
for(int i=begin;i<=end;i++) {
sum+=i;
}
System.out.println(begin+"~"+end+" 범위의 정수들의 합계 = "+sum);
//20~80 범위의 정수들의 합계 = 3050
ex 6-1) 시작값이 종료값보다 큰 경우 에러 메시지를 출력하고 프로그램을 강제로 종료
** System.exit(0); : 프로그램 강제 종료 메소드 호출
int begin=80, end=20;
if(begin>end) {
System.out.println("[에러]시작값이 종료값보다 작아야 됩니다.");
System.exit(0);//프로그램 강제 종료 메소드 호출
}
int sum=0;
for(int i=begin;i<=end;i++) {
sum+=i;
}
System.out.println(begin+"~"+end+" 범위의 정수들의 합계 = "+sum);
//[에러]시작값이 종료값보다 작아야 됩니다.
ex 6-2) 시작값이 종료값보다 큰 경우 두 변수에 저장된 값을 서로 바꾸어 저장되도록 작성
**치환 알고리즘(Swap Algorithm) : 변수값을 서로 바꾸어 저장하는 알고리즘
**알고리즘(Algorithm) : 프로그램 작성시 발생되는 문제를 해결하기 위한 명령의 흐름
int begin=80, end=20;
if(begin>end) {
//치환 알고리즘(Swap Algorithm) : 변수값을 서로 바꾸어 저장하는 알고리즘
//알고리즘(Algorithm) : 프로그램 작성시 발생되는 문제를 해결하기 위한 명령의 흐름
int temp=begin;
begin=end;
end=temp;
}
int sum=0;
for(int i=begin;i<=end;i++) {
sum+=i;
}
System.out.println(begin+"~"+end+" 범위의 정수들의 합계 = "+sum);
//20~80 범위의 정수들의 합계 = 3050
* 프로그램의 흐름을 파악하기 위한 이클립스 기능
- Debug Perspctive 사용 (원래는 흐름을 파악하기 위한 용도는 아님)
- 디버그 :프로그램을 실행했는데, (신텍스 에러가 아니고) 결과가 이상하게 나올 때. 잘못된 곳을 확인하기 위해 이용함
이를 사용하기 위해 브레이크 포인트를 먼저 설정 해주는 것임.
디버그 모드를 통해 프로그램의 흐름을 눈으로 볼 수 있다
-> 처리 결과가 이상하게 나왔을 때, 왜 이상한지 명령을 하나씩 실행하면서 역추적 하려는 목적!
실행 방법 및 순서
=> 중지점(BreakPoint) 설정(왼쪽 행 번호 더블클릭) - [F11] : Debug 실행 단축키 - Debug Perspctive 변환
- [F6] : 현재 스레드 위치의 명령을 하나씩 실행 >> 반복 - Debug 처리 완료
- 프로그램 강제종료(Terminate : Ctrl + F2) - Java Perspective 변환 - 중지점 제거
'학원 > 복기' 카테고리의 다른 글
0404 - 난수 출력, 가위바위보 게임, Java 자료형, Java 메모리 영역, 배열, 향상된 for문, 로또 프로그램, 2차원 배열 (0) | 2023.04.04 |
---|---|
0403 - For문 추가, 이중for문, While문, do while문, break, continue, Scanner Class (0) | 2023.04.03 |
0330 - 문자형 리터럴, 논리형 리터럴, 자료형 변환, 연산자 (0) | 2023.03.30 |
0329 - JDK, 깃허브, 자료형, 변수 (0) | 2023.03.29 |
0328 - JDK 설치, 소스파일 (클래스,메소드), 터미널 명령어, 이클립스 설치 및 설정, 주석문 (0) | 2023.03.28 |