현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

3. 조건문 (if, switch)

자 오늘 파트는 조건문이다.
조건문은 if - else 와 switch - case - default 두가지며 외울때 같이 외워두는것이 좋다.
참고로 필자는 switch를 쓸때 default를 같이 안외워서 그런지 계속 까먹는다.

조건문의 기본 성질은 true 와 false의 값을 가진다는 것이다.
(조건문을 쓸때 true와 false의 값을 가지지 않는 회색분자가 나오게 되면 그 프로그램은 오류가 발생하게 된다.)
조건문은 하나의 식 (이제부터 조건식이라고 부르겠다.)을 꼭 가지고 있는데 그 조건식이
true냐 false냐에 따라 출력이 달라지는 것이다.




if문. 

첫번째로 if문에 대해 알아보자.
if문은 가장 일반적으로 사용하는 조건문이며 기본공식은 아래와 같다.

 if (조건식){ true }
else{  false }

먼저 if문을 선언한뒤 조건식을 적어 넣는다.
(if문의 조건식은 무조건 true나 false를 반환하는 식이나 메소드가 들어와야 된다. )
그 조건식이 true면 위 { true } 안에 적힌 식들이 실행될것이며
false이면 위 { false } 안에 적힌 식들이 실행될것이다.

간단한 예제로 확실히 알아보자.

if ( a >= 0 ) //if 선언하고 조건문을  a >= 0으로 두었다.

   {  

    System.out.println("a 양수이다"); 

   } //{}안에 "a 양수이다" 프린트하라고 명령을 내렸다.

   else{ System.out.println("a 음수이다");

   } //{}안에 "a 음수이다" 프린트하라고 명령을 내렸다.


위 식에서 a의 값이 양수이면 조건식이 true가 되면서 "a는 양수이다"를 프린트 할것이고
a의 값이 음수이면 조건식이 false가 되면서 "a는 음수이다"라고 프린트 할것이다.

이처럼 true와 false의 값에 따라 서로 출력하는 값이 달라지게 만드는것이 조건문이다.
몇가지 if의 특성을 간단히 말해보면

1. { }를 쓰지 않아도 조건식 뒤의 한줄 ( ; 으로 구별하기 전까지가 한줄이다) 의 명령은 실행된다.
    ( 이말은 true일때 2가지의 식을 수행해야되는데 1가지의 식밖에 안된다는것이다 하지만
      { } 안에 
있는 식은 모두다 실행이 되기때문에 왠만하면 { }를 꼭 집어 넣길 바란다.)
     
2. else를 쓰지 않았을때 false가 되면 그냥 if문을 무시해버린다. (오류가 나는게 아니다.)

3. else뒤에는 조건문을 달지못한다.
 
(else뒤에 조건문을 달면 true도 아니고 false도 아닌  회색분자가 발생돌 확률이
  높기 때문에 처음부터 막아버린듯 하다.) 

4. if문은 중첩도 된다.

자 위의 1, 2, 3번은 혼자서 한번 프로그램을 짜보도록 하고 4번특성에 대해 자세히 알아보자.
(설명이 너무 길어지면 지겹다. 자기가 해보는게 좋다! 귀찮아서 그러는거 아니다..)


자 점수에 따라 학점을 내는 프로그램을 짜본다고 생각하자
if ( a  >= 90) { A } .....
대충 식을 적자면 위의 식처럼 일단 90점이상이면 "A"학점을 주는데..... 나머지 학점은 어떻게 할지 문제다.
 
그럼 90점 이상이 아닐경우 "B"학점도 있고 "C"학점도 있는데 위식을 보면 90점 이상은 "A"이지만 90점 이상이 아닐경우 모든 학점이 통일될수 밖에 없다. 이럴때 if문을 중첩해서 사용하는것이다.
아래 예제를 보자.

char a ;    

int c = '?'


if( c >= 60 )// if문을 선언한뒤 조건식을 c >= 60이라고 주었다.

    a = 'E'; // c 점수라고 생각하면 점수가 60 이상이면 E 주게된다.

    if( c >= 70)// 그리고 다시 if문을 선언하고난뒤c >= 70이라고 조건식을 주었다.

     a = 'C'  

//여기서 c 점수가 90점이라고 생각해보자 점수가 90점이면 위의 if문에서 E 받게 된다.

그리고 여기서 C 받게 된다그러면 a 값은 E C 두개다 가지게 되는것일까?

그렇게 생각하는 사람은 변수파트 제일 처음문장을 읽어보고 오길 바란다.

변수는 하나의값을 저장하는곳이라고 맨처음에 설명하였다

E 받고 난뒤 C 받게 되면 앞서 받은 E 사라지게 되고 C a 대입되는것이다.

     

   if( c >= 80){//그럼 80점이상일때는점수가 90점이기때문에 여기서도 B 받게된다.

      a = 'B';    // 그럼 당연히 C 밀어내고 그자리를 B 차지하게 될것이다.

      if( c >= 90)//이렇게 겹치는 범위가 있는것을 조건으로 둘때에는

                      //범위가 큰것부터 작은것순으로 조건식을 주어야 한다

       a = 'A';    //범위가 큰것이 제일 아래에 오게 되면 A 나와야되는데
                    //모두 E 나오는 경우가 생긴다. 궁금하면 여기 있는 조건식을 

                    //반대로 두고 90 이상이 먼저나오게 프로그래밍을 실행해보자

}

     }

    }

   } 

else{ a = 'F';} 


위에 설명이 너무 길어서 식이 너무 복잡해 보인다 ;;

아래 공식으로 실험해보기 바란다.

public class Ex3_1 {

 public static void main(String[] args){


char a;

int c = '?'

if( c >= 60 ){ // 여기를 90으로 바꾸고 아래를 80,70,60 순으로 바꾸면 될것이다.

    a = 'E'

    if( c >= 70){ 

     a = 'C';   

     if( c >= 80){

      a = 'B';

      if( c >= 90){

       a = 'A';   

      }

     }

    }

   }else{ a = 'F';}


System.out.print(a+"입니다.");

}}


개인적으로 조건식, 반복식 그리고 연산자는 일단 대략적인 기능을 알아두고 난뒤
문제를 풀어보는것이 훨신더 도움이 되는거 같다. 
기본적인 기능과 사용방법을 알아도 응용에 따라 정말 다양하게 활용을 할수 있기 때문이다.
(하지만 인터넷에 초급자용 문제를 찾기가 힘들다. 그래서 나혼자 문제를 만들어보다 공유를 할려고 까페및 블로그를 만들어본것이다.)

간단하게 말했지만 대략적인 기능은 다 설명한거 같다. 나머지는 문제를 통해서 익히도록 하자.



이제 두번째 switch를 배우기전에 이전 연산자에서 설명을 빼놓은 
삼항연산자에 대해 알아보자.
삼항연산자를 일부러 조건문으로 뺀 이유는 삼항연산자도 true와 false의 값을 가지기 때문이다.
삼항 연산자의 기본 공식은 아래와 같다.

(조건식) ? true : false ;

간단한 예제를 들겟다.

( a > 0 ) ? a = 1 : a = -1 ;

위 식을 해석하면 a가 0보다 클경우(같거나 클경우는 >=으로 표현해야된다)
true면 (a의 저장값이 0보다 크다) a에 1을 넣고
false면 (a의 저장값이 0보다 작다) a에 -1을 넣는다.
: 표시를 기준으로 true와 false가 나뉘게 되는것이다.

자 그럼 a에 값을 넣어보자.
int a = 0 ;
(a > 0) ? a = 1 ; a = -1 ;
위식에서 a를 출력하면 어떤 값을 뜰까?
정답은 -1이다.  a가 0보다 클때에 1을 출력하게 되고 0보다 같거나 작으면 -1을 출력하게 되기 때문이다.

이번엔 좀 복잡하게 가보도록 하겠다. 
삼항연산자도 if문처럼 중첩이 가능한데 아래는 성적에 따른 학점을 
계산하는 프로그램의 일부이다.

char b = (c > 90) ? 'A' : (c > 80) ? 'B' : (c > 70) ? 'C' : 'F' ;


일단 char형태를 가진 변수 b 선언하였다.


대입 연산자 = 있는것을 보니 오른쪽의 값이 b 저장될것으로 예상할수 있다.


뒤에 (C >90 )? 이라는 식이 먼저 보인다 ? 나오면 삼항연산자라는것을 알수있다.

이제 삼항연산자를 왼쪽부터 차근차근 보자


c라는 변수가 90보다 클때 true A라는 값이 b 저장될것이다.

하지만 false 되면?

여기서 포인트가 또다시 조건문이 나오는것이다.

false 되면 c라는 변수를 다시 80 비교를 해본다.

80 비교했을경우 true 될경우 B라는 값이 변수 b 저장될것이다.

또다시 false 될경우 이번엔 (c > 70)이라는 조건문이 한번더 반복된다.

조건문에서 true 될경우 C라는 값이 b 저장될것이고

false 될경우 이번엔 조건문이 아니라 F라는 값이 나왔기때문에

70보다 작을경우는 무조건 F b 저장되는것이다.

이렇게 삼항연산자도 중첩을 해서 사용할수 있기때문에 간단한 조건문은 if대신 삼항연산자로 프로그래밍을 해도 좋다.

위의 if문 예제와 비교를 해보기 바란다.

그리고 난뒤 위 if문 예제를 삼항연산자로 다시 프로그래밍을 해보자.

위 예제에서 거의다 나왔기때문에 몇가지만 고치면 쉽게 프로그래밍할수 있을것이다.




자 이제 거의다 왔다 .
마지막으로 switch이다.

switch문과 꼭 같이 있어야 되는것이 있는데 처음에 언급했듯이  case와 dafault이다.
switch문의 기본공식은 아래와 같다.
switech ( 조건식 )
case 값1 :  값1일때 출력문
case 값2 :  값2일때 출력문
default :   case 1도 case2도 아닐때 출력문
if문이나 삼항연산과 비교할때 약간 복잡해 보이기도 하다.
switch문은 case와 default와 항상 함께 쓰이기 때문에 기본공식은 복잡해 보일지 몰라도 실제로 사용방식은 매우 쉽다.
먼저 switch문을 선언한뒤 조건식을 둔다.
(switch문의 정확히 말하면 조건식이라고 말기 어렵다.
 true나 false의 값이 아니라 정수형 데이터를 결과값으로 가져야하기 때문에 그냥 n이라고 말하는게 더욱 더 정확한 표현이다.)
조건식에서 값1이 나오면 값1에 따른 출력문이 나오고 값2가 나오면 값2의 출력문 나오게 되는 방식이다. 
자 예제를 보자

public class Ex3_2 {

 public static void main(String[] args){


int c = ?


char a;


switch(c/10){  // switch 범위를 지정할수 없기 때문에 10으로 나누어 주었다.

              // 이렇게 되면 96점은 9점이 84점은 8점이 되어버릴것이다.

             // c int형으로 선언되엇다는것을 기억하기 바란다.

    case 9 : a = 'A'break; // c 9일때 A a 저장될것이다.

    case 8 : a = 'B'break; // c 8일때 B a 저장될것이다.

    case 7 : a = 'C'break;

    case 6 : a = 'D'break;

    default : a = 'F'; // 모든 조건을 만족하지 못하면 F a 저장될것이다.

위 예제는 성적에 따른 학점을 구하는 식이다. 

해석하기 앞서 switch문은 필수조건 두가지를  알아두어야 한다.


1. 조건식의 연산결과가 int형 범위의 정수값이여야 된다. ( 범위를 지정할수가 없다.)


2. case뒤에 오는 값은 오직 byte, short, char, int 타입만 올수 있다.
( 모두 int형의 데이터타입으로 형병환이 가능한것이다.)


위처럼 까다로운 조건을 가진만큼 값이 x일때 x에 대한 case만 찾으면 되닌깐 사용시 매우 간결하며 한눈에 알아보기도 쉽다.


자 이제 예제를 해석해보자 우선은 범위를 지정할수 없기때문에 점수를 10으로 나누어 버렸다.

그러면 int형은 소숫점을 저장할수 없으니 96점은 9점이 되어버릴것이고 

84점은 8점이 되어버릴것이다.  그리고 난뒤 case를 9, 8, 7, 6으로 두었다.

96점이 9점이 되었으니 case 9를 찾아가보면 'A'라는 값을 a에 대입하라는 공식이 들어가있다.

만약 점수가 54점이면 10으로 나누어 5점이 되었지만 case 5는 찾아볼수 없다.

그럴때에는 default를 찾아보면 된다. case의 조건에 맞는것이 없으면 모두 default로 출력이 된다.


이렇게 if나 삼항연산자의 중첩처럼 복잡하지도 않고 간결하게 사용할수 있기때문에 

두가지 조건을 지킬수가 있으면 if문 보다 switch문을 이용하는것도 좋은 방법일것이다.


마지막으로 위 프로그래밍에서 break문이 나오는데 break는 {}안을 빠져나가라는 뜻이다.

switch는 원래 가입회원의 권한을 프로그래밍 할때 자주 사용하기 때문에 제일 첫번째 case의 

조건이 맞으면 두번째, 세번째, default의 값마저 같이 출력이 되어버린다.

예를 들자면

switch(회원){


             case 마스터 : 글삭제 권환
             case 운영자 : 글수정 권환
             case 맴버 : 글쓰기 권환;
             default 글읽기 권환

이런식이 있다면 마스터는 글삭제 권환, 글수정 권환, 글쓰기 권환, 글읽기 권환 

모두를 가지게 되는것이다.   그밑에 맴버는 글쓰기 권환과 글읽기 권환만 가질수 있고 맴버도 아닌사람은 글읽기 권환만 가지게 만드는것이다.


switch문은 이렇게 사용이 되기때문에 위의 성적을 구하는 식에서 만약 break문이 없으면

A,B,C,D,F를 모두 차례대로 대입을 하여서 어떤 값을 넣어도 마지막에 대입되는  F 만을 출력 될것이다.


그것을 방지하기 위해 break문이 있는것이다. case 9에서 A를 대입하고 난뒤 break를 실행하여

{ }를 빠져나가게 되어 a 에는 'A'만 대입하게 되는것이다.


break는 후에 반복문에서도 한번더 설명하도록 하겠다. 위 예제를 break문을 빼고도 한번 실행해보길 바란다.



자 조건문이 끝이 났다.  이제 반복문과 배열만 배우면 class의 기본구조를 다 배우는것이다.

반복문과 배열을 배우고 난뒤 충분히 문제를 풀고 난뒤에 class파트로 들어가길 바란다.

왜냐면 모든 프로그램의 기본이 되는것이 변수,연산자,제어문이기 때문이다.

기본도 모르면서 뒤로 넘어가면 점점 힘들어질것이다. (필자가 그랬다.)

아무튼 기본을 확실히 알고난뒤에 뒤로 넘어가길 권한다. 




------------------------------------------------------------------------------------
본 블로그의 글을 퍼가실때 꼬릿말, 퍼가시는곳 주소를 꼭 남겨주세요. 
출처 꼭 기재해주시고요. 상업적인 용도의 이용은 절대 금합니다.
혹 프린트를 할 경우 블로그주소와 함께 프린트 해주세요.
허락을 맡지 않고 무단도용을 할경우 법적인 제제가 있을수도 있습니다. 
(전 분명히 경고했습니다. 합의같은거 안합니다.)
그리고 혹 무단도용한것을 보신분은 신고해주시면 사례금 챙겨 드리겠습니다.
-----------------------------------------------------------------------------------

+ Recent posts