본문 바로가기

학원/복기

0331 - 제어문(IF문, Switch문, For문), 전역변수, Debug Perspctive

제어문(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 변환 - 중지점 제거