프로그램언어 활용 수업순서
-변수
-연산자
-제어문
-배열
-함수
-클래스 (생성자, 상속, 인터페이스~)
수업내용 정리 웹사이트
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);
정보처리기사 참고
'Backend' 카테고리의 다른 글
05월 21일 화 | OOP 06 - JAVA의 반복문(while)과 연습문제 (0) | 2019.05.21 |
---|---|
05월 20일 월 | OOP 05 - JAVA의 반복문 (for, break, continue) (0) | 2019.05.20 |
05월 16일 목 | OOP 03 - JAVA의 연산자 (0) | 2019.05.16 |
05월 15일 수 | OOP 02 - JAVA 코딩규칙과 자료형 (0) | 2019.05.15 |
05월 14일 화 | OOP 01 - JDK설치와 CMD사용 (1) | 2019.05.15 |
댓글