본문 바로가기
Backend

05월 17일 금 | OOP 04 - JAVA의 제어문 (if, switch)

by 구라미 2019. 5. 17.

 

 

프로그램언어 활용 수업순서

-변수

-연산자

-제어문

-배열

-함수

-클래스 (생성자, 상속, 인터페이스~)

 

수업내용 정리 웹사이트

http://pretyimo.cafe24.com/

id: java0513/ pw: java1113 (수시로 변경)

 


4. 자바의 연산자

비트연산자는 자바에서 그렇게 자주 쓰지는 않는다.

하지만 개념을 알아두기.

정보처리에 관련된 개념을 점검하고 가기.

 

컴퓨터 용량의 단위

컴퓨터의 신호체계는 0과 1만 인식할 수 있다.

0, 1 <- 이 값 하나를 Bit라고 한다.

이 bit가 8개가 모여야 사람이 인식할 수 있는 신호체계가 된다. = 8bit = 1byte

예) A=01000001, B=01000010, C=01000011

2byte 언어(-> 한글,한자,일어 등) 라는 것이 있다. 1byte로 표현할 수 없음

 

2^10 -> 1024byte -> kilo byte

2^20 -> Mega byte

2^30 -> Giga byte

2^40 -> Tera byte

K < M < G < T

*백업 잘 해놓기...

 

비트연산자

1) shift(시프트)연산자

<< left shift 연산자 

>> right shift 연산자

 

비트연산자를 이해하려면 수의 체계에 대한 이해가 어느 정도 필요하다.

수의 체계 : 2진수, 8진수, 10진수, 16진수

2진수 : 0 1

8진수 : 0 1 2 3 4 5 6 7

10진수 : 0 1 2 3 4 5 6 7 8 9

16진수 : 0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15) *hex코드도 16진수 표현

 

연습문제 1) 10진수 5를 2진수로 변환하라

5는 홀수이니까

나머지 1 

2의 자리 0

4의 자리 1

그러므로 101 이다.

-> 00000101 (8bit 이기 때문에 0,1의 조합이 총 8자리가 나와야함)

 

연습문제 2) 10진수 9를 2진수로 변환하라

9는 홀수이니까

나머지 1

2의자리 0

4의 자리 0

8의 자리 1

그러므로 1001 이다.

-> 00001001

 

65536(16승) 32768 16384 8192 4096 2048 1024(10승) 512 256(8승) 128 64 32 16 8 4 2 1

 

연습문제 3) 10진수 16를 2진수로 변환하라

짝수 이므로

나머지 0

2의 자리 0

4의 자리 0

8의 자리 0

16의 자리 1

-> 00010000 (8bit로 표현)

 

System.out.println(16<<3); //128
System.out.println(16>>3); //2

10진수 16을 레프트시프트 연산자 <<을 이용하여 3비트 이동하였을 때

00010000 -> 10000000 (128) // 16*2의 3승

-> 결과값은 128

 

10진수 16을 라이트시프트 연산자 >>을 이용하여 3비트 이동하였을 때

00010000 -> 00000010 (2) // 16/2의 3승

-> 결과값은 2

 

<< left shift 연산자 : 대상*2의 n승

>> right shift 연산자: 대상/2의 n승

 

2) 1의 보수 연산자

반대의 수

System.out.println(~3); //-4

음수(signed값)을 표현하는 방식

  • 1의 보수
  • 2의 보수
  • 부호화 절대치 방식

3) 비트곱과 비트합 연산자

반대의 수

System.out.println(5&3);//1
System.out.println(5|3);//7

& 비트곱연산

00000101(5)  

00000011(3) 

----------------

00000001(1)

 

| 비트합연산

00000101(5)

00000011(3)

----------------

00000111(7)

 

각각의 비트연산을 수행했을 때 이러한 결과값이 나온다.

 

 

5. 자바의 제어문

프로그램의 흐름을 제어하는 것을 제어문이라고 한다.

삼항연산자도 제어문이라 할 수 있음.

 

조건문

판단 후 조건이 만족되면 수행하게 되는 것.

if문, switch문이 있다.

 

1) if 조건문

if (조건) { 조건이 true일 때만 수행 } //조건이 나오면 반환되는 타입 boolean 타입,true인지 false인지 판별한 후 수행.

 

if(조건) {조건이 true일 때 수행}

 else {조건이 false일 때 수행} //참 거짓이 있는 삼항연산자와 같은

 

조건을 여러 개 제시해서 물어볼 수도 있음.

if(조건) {조건이 true일 때 수행}

else if(조건) {이 조건이 true일 때 수행} //조건을 계속 사이에 추가할 수 있음

else {조건이 false일 때 수행}

 

데이터 양이 많아지면 배열 -> DB로

 

연습문제 1) 무궁화 학생의 평균이 95점 이상이면 "장학생"을 출력하시오.

String name ="무궁화";
int kor=60, eng=95, mat=100;
//평균 만들기
int avg = (kor+eng+mat)/3;
		
//평균이 95점이상인지 알아보기
System.out.println("이름: " + name);
System.out.println("국어: " + kor);
System.out.println("영어: " + eng);
System.out.println("수학: " + mat);
System.out.println("평균: " + avg);
		
//95점 이상인지 조건문 작성하기		
if(avg>=95){ //85>=95
System.out.println("축하합니다! " + name +"님은 장학생입니다.");
}//if end 

결과값은,

이름: 무궁화
국어: 60
영어: 95
수학: 100
평균: 85

85>=95 이므로 값이 출력되지 않는다.

 

연습문제 2) 국어점수가 70이상이면 "합격"을 출력하시오.

테스트를 위해 국어점수값을 80으로 변경하였다. 주어진 조건대로 if문 작성해서 출력해보면

if(kor>=70){
	System.out.println(name + "님 국어: 합격!");
	}//if end
else {
	System.out.println(name + "님 국어: 불합격");
}//else end 

결과는 조건을 만족하므로

무궁화님 국어: 합격! 이 출력된다.

 

*(이상,이하) ,(초과, 미만)을 잘 구분해서 쓰기.

이상 미만

초과 이하

 

연습문제 3) 수학점수가 90이상이면 "A학점"을, 89이하 80이상이면 "B학점"

79이하 70점이상는 C학점, 69점이하 60점 이상는 D학점을, 그 외는 F학점을 출력하시오.

if (mat >= 90) {
	System.out.println("A학점");
	} else if (mat >= 80) {
		System.out.println("B학점");
	} else if (mat >= 70) {
		System.out.println("C학점");
	} else if (mat >= 60) {
		System.out.println("D학점");
	} else {
		System.out.println("F학점");
	}

마지막의 else는 필요없으면 안써도 됨.

결과값은 무궁화 학생은 수학이 100점이므로 첫번째 조건을 만족하여 A학점이 출력되었다.

굳이 (mat>= 80 && mat <=89) 라고 쓰지 않는 이유는 이미 첫 조건에서 아래로 내려갈 수록 조건에 따라 걸러져서 이다.

 

연습문제 4) 평균이 70점 이상이면 "합격"이다. 단, 세 과목 중 한 과목이라도 40미만이면 과락으로 "재시험" 

 

이름, 점수와 평균 정의

String name = "무궁화";
	int kor = 100, eng = 90, mat = 39;
	// 평균 만들기
	int avg = (kor + eng + mat) / 3;

내 풀이

if (avg >= 70 && kor >= 40 && eng >= 40 && mat >= 40) {
		System.out.println("합격");
	} else if (avg >= 70 && (kor < 40 || eng < 40 || mat < 40)) {
		System.out.println("재시험");
	} else if (avg < 70) {
		System.out.println("불합격");
	}

나는 문제의 문장을 하나하나 뜯어 그 내용을 그대로 코드로 작성하였다.

진짜 난리가 나버린 코드...

어떻게 문제를 해석하느냐에 따라 코드가 달라진다.

 

선생님 답안

-OR 조건을 사용한 방법

if (avg >= 70) {
        //OR버전			
		if (kor < 40 || eng < 40 || mat < 40) {
		//100<40 || 90 <39 || 39<40 -> f f t or 연산자 때문에 true
		System.out.println("결과: 재시험");
		} else {
			System.out.println("결과: 합격");
	}//바깥 if end
	} else {
		System.out.println("불합격");
	}//바깥 else end

결과: 재시험

선생님은 if안에 또 if와 else문을 사용하였다.  

if와 else를 큰 if로 감싸주었다.

if,else 중첩해서 사용할 수 있다는 개념을 알았더라면 더 깔끔한 코드를 작성할 수 있었을 것 같다...

 

-AND 조건을 사용한 방법

if (avg >= 70) {
	// AND버전
	if (kor >= 40 && eng >= 40 && mat >= 40) {
		System.out.println("결과: 합격");
	} else {
		System.out.println("결과: 재시험");
			}
} else {
	System.out.println("결과: 불합격");
}

역시 결과: 재시험

 

2) switch 문

switch-case문, break문

> switch문은 제시하는 값동일한 값을 찾아서 수행한다.

값으로 실수형, 논리형등 은 사용할 수 없다.

 

switch(10){
		case 10: System.out.println("seoul"); break;
		case 20: System.out.println("busan"); break;
		case 30: System.out.println("jeju"); break;
		default: System.out.println("etc...");
		
		}//switch end
        
        
//값이 10이므로 seoul 출력
//만일 일치하는 값이 없을 때는 무조건 default의 내용이 출력된다.

case 10: System.out.println("seoul"); break;

: <- case와 뒤를 연결

case □□ <- 값 정수값이 들어간다. *꼭 순차적일 필요는 없다. 그렇지만 보기 편하게 순서대로 한다.

break <- switch문에서 빠져나오기.

default 만일 일치하는 값이 없을 때는 default의 내용이 출력된다.

 

만약 break가 없다면?

switch (10) {
		case 10:
			System.out.println("seoul");
			break;
		case 20:
			System.out.println("busan");
		case 30:
			System.out.println("jeju");
			break;
		}// switch end

20을 넣었을 때 busan, jeju 모두 출력된다.

왜냐하면 break문이 없으면 쭉쭉 읽다가, 세번째 case에 나온 break에서 스위치 밖으로 나가기 때문에

 

연습문제 1) 평균 점수에 따라서 A,B,C,D,F 학점을 출력하시오.

String name = "무궁화";
int kor = 95, eng = 90, mat = 80;
// 평균 만들기
int avg = (kor + eng + mat) / 3;
System.out.println(avg);
		
switch (avg/10) { //10으로 나누어서 몫을 취한다.
case 10: 
	System.out.println("A");
	break;
case 9:
	System.out.println("A");
	break;
case 8:
	System.out.println("B");
	break;
case 7:
	System.out.println("C");
	break;
case 6:
	System.out.println("D");
	break;
default:
	System.out.println("F");
	break;
}// switch end

100점 만점을 가정하고, 점수산정 해보자.

위와 같은 경우는 90점대, 80점대 등 일정 점수대의 점수들의 공통점,

10단위 숫자가 같다는 규칙성을 찾아 10으로 나눈 몫으로 case 값을 가져온 것이다.

 

수학적 두뇌를 사용해야한다. 많은 경험을 해보아야한다. 많은 코드 읽고 실행해보기.

*규칙성과 공통점이 있는 것 -> 중복을 감소시킬 수 있는 키가 있음.

프로그래밍 언어에서는 숫자로 컴퓨터에게 일을 시켜야한다. 계산을 통해서 명령하기. 

 


 

연습문제 1) 임의의 수가 양수, 음수, 제로인지 출력하시오.

a값이 어떤 값이 들어가있는지 따라서 양수, 음수, 제로인지 알아보라.

if 문 사용해보기

 

내 풀이

int a=-3;
			
if(a>0){
	System.out.println("양수");
}else if (a<0){
	System.out.println("음수");
}else {
	System.out.println("제로");
}

//선생님 코드는 마지막 else if(a==0)가 되어있었음. 하지만 뜻은 같다.

선생님이 작성하신 코드와 거의 일치했다.

값을 주면 해당 수의 범위에 따라 문자열이 출력된다.

위의 결과값은 -3.

 

연습문제 2) 코드값에 따라 성별을 출력하시오.

if 문 사용해보기 짝수면 여자, 홀수면 남자

내 풀이

int code = 3;
			
if (code>0 && code<=4){
	if(code%2==0)
		System.out.println("여자");
	else {
		System.out.println("남자");
		}					
}

선생님 답안

-if 문의 경우

if (code==1 || code==3){
	System.out.println("남자");
} else if (code==2 || code==4){
	System.out.println("여자");
}

//위와 같은 경우도 있음 나처럼 범위 지정 후 홀짝으로 해도 됨.

-switch 문의 경우

switch (code%2){
	case 0: System.out.println("여자"); break;
	case 1: System.out.println("남자"); break;
}

진짜 리얼 충격적으로 간단함....

 

연습문제 3) 연산기호에 따라 결과값을 출력하시오.

switch문 사용? // 출력결과 op변수가 가진 기호에 따라 결과값이 다르게 나와야한다. 예를들면 op 변수가 +기호를 갖고 있으면 5+7이 나온다. 5-7=-2. 5*3==15, 5/7=0.17어쩌구 5%7=5

op의 값에 따라 달라진다. 

내 풀이

int c = 5, d = 7;
char op = '+';

switch (op) {
	case '+':
	System.out.println(5+7);
	break;
	case '-':
	System.out.println(5-7);
	break;
	case '*':
	System.out.println(5*7);
	break;
	case '/':
	System.out.println(5/7);
	break;
	case '%':
	System.out.println(5%7);
	break;
}

선생님 답안

-switch문과 if 문이 혼합되었다.

int c = 5, d = 7;
char op = '+';
int res1 = 0; //정수값인 결과
double res2 = 0.0;//실수값인 결과


switch (op) {
	case '+': res1=c+d;
	break;
	case '-': res1=c-d;
	break;
	case '*': res1=c*d;
	break;
	case '/': res2=(double)c/d;
	break;
	case '%': res1=c%d;
	break;
}

if(op == '/'){
	System.out.println(c+" "+op+" "+d+"="+res2);
}else{
	System.out.println(c+" "+op+" "+d+"="+res1);
}

결과값이 정수인지, 실수인지 판별해서 if문으로 가려내서 결과 출력.

case문 안에서 res1과 res2의 변수를 선언하고 값을 넣어주었다.

if문 안에서 정수 실수 판별한 후 맞는 조건에 따라 출력되는 것이다.

 

연습문제 4) 문제2의 코드를 참조해서 나이를 계산하시오.

switch문 사용?

myYear<- 탄생년도 10이다.

성별코드를 통해 1910년생인지, 2010년생인지 확인하기.

2000년대생부터 3,4 그 이전은 1,2

문제에서 코드를 참조하여 나이를 계산하라고 하였다.

나이는 2019-태어난년도이고 코드는 문제2에서

 

내 풀이

int myYear = 10;
// 나이를 계산 2019-나이

switch (code) {
	case 1:
	System.out.println(2019 - (myYear + 1900));
	break;
	case 2:
	System.out.println(2019 - (myYear + 1900));
	break;
	case 3:
	System.out.println(2019 - (myYear + 2000));
	break;
	case 4:
	System.out.println(2019 - (myYear + 2000));
	break;
}

이렇게 짜보았다. 그런데 뭔가 중복되는 요소가 많다. 그리고 값은 나왔지만 syso가 빠져서 출력이 되지 않음...

 

선생님 답안

-switch문

int myYear = 10;
	// 나이를 계산 2019-나이

switch (code) {
case 1:
case 2: myYear= myYear + 1900; break;
case 3:
case 4: myYear= myYear + 2000; break;
}
		
int myAge = 2019-myYear;
System.out.println(myAge);

내가 짠 것과 내용이 비슷하긴 한데 훨씬 더 깔끔하고 중복이 적다.

왜냐하면 switch와 case 특성을 이용하여 중복을 줄였으며

case1,2는 같은 1900년대 case3,4로 같은 2000년대기 때문에 4번씩이나 연산할 필요없이 2번만 연산하면 됨.

새로운 myAge 변수를 만들어서 현재년도-탄생년도 계산을 넣었다.

그 후 myAge변수를 불러서 나이를 출력하였다.

 


 

오늘의 과제

과제 1) 운행거리에 따라 택시 요금을 계산하는 프로그램이 있다.

2000m까지는 기본요금이  900원이고

2000m 초과 운행시 200m 단위마다 기본요금에 100원씩 가산하여 요금을 계산한다.

if 문 연습하기

예1) 운행거리 : 1600m라면 기본요금: 900원

예2) 운행거리: 2900m라면 900m 초과 -> 요금 900+500원 = 1400원

 

1) 2000m 까지

2) 2000m 초과

3) 2000m 초과인데 +200m = 기본요금 + 100원

 

200m마다 100원

400m 200원

600m 300원

800m 400원

...

추가요금 거리가 초과운행 200m에 2의 배수 만큼 늘어나고 있음

 

package oop0517;

public class Test05_Worksheet {

	public static void main(String[] args) {

		int dist = 4000;
		int fare = 900;
		int addDist = 100;

		if (dist <= 2000) {
			System.out.println("요금은 " + fare + "원 입니다.");
		} 
		
		else if (dist+addDist>2000) {						
			if (addDist%200 == 0) { 
			fare = fare+(addDist/2);
			System.out.println("요금은 " + fare + "원 입니다.");}	
			
			else {System.out.println("요금은 " + fare + "원 입니다.");}
		}
	}
}

 

 

내 풀이

package test;

public class test {

	public static void main(String[] args) {
		
		int dist = 2000;
		int fare = 900;
		int addDist = 601;
		int totalDist = dist + addDist;

		// 1~200 100원 201~400 200원 ...401 600 300원 601 800 400
		
		
		if (totalDist <= 2000) {
			System.out.println("요금은 " + fare + "원 입니다.");
		} 
		
		else if (totalDist>2000) {
			if(1<=addDist && addDist<=200) {
				fare = fare+100;
			System.out.println("요금은 " + fare + "원 입니다.");}
			
			else if(addDist>200 && addDist%200==0) {
				fare = fare+((addDist/200)*100);
				System.out.println("요금은 " + fare + "원 입니다.");
			}
			else if(addDist>200){
				fare = fare+(((addDist/200)+1)*100);
				System.out.println("요금은 " + fare + "원 입니다.");}
			}
            
		}//main end
	}//class end

와씨 되나?

 

선생님 답안

int distance = 3000;
        int fee = 0;
        int overFee = 0;
        
        if(distance<=2000) {
          fee = 900;
        }else {
          int exceed = distance-2000;  //초과거리
          overFee = (exceed/200) * 100;
          fee = 900 + overFee; 
        }//if end
        
        System.out.println("총운행거리 : " + distance);
        System.out.println("기본요금 : 900");
        System.out.println("추가요금 : " + overFee);
        System.out.println("전체요금 : " + fee);

 

정보처리기사 참고

https://marlinbar.tistory.com/32?category=292159

댓글