-
(국비교육) 4 - 자바 연산자 + 조건문과 반복문 + 2의 배수 만들기 + Fizz Buzz + 논리연산자 + 비트연산자 + 제어문개발/국비교육 2023. 6. 5. 17:50
■ 지난 주 수업 복습
- 컴파일 <-> 스크립트
- 소스코드.java -> 컴파일 -> .class
- 클래스 : 클래스변수, 메소드, 생성자
- 메소드 : 함수 function
- 명령어 :* 이름 만들기(apple, korea) = 영어대소문자, 숫자, _, $
- 클래스 : AppleKorea 첫글자 대문자로 시작 후 새로운 단어 대문자 = 파스칼 기법
- 메소드, 변수 : appleKorea 첫글자 소문자 이후 새로운 단어 나오면 대문자 = 카멜 기법
- 상수 : APPLE_KOREA 대문자로표시하고 중간은 _ 로 표시 스네이크 기법* 예시
1. 우리반 인원수를 저장하고 싶어요. 어떤 데이터타입을 쓰면 좋을지 적어주세요. (변수명은 member)
- byte member = 25;
위에 byte 로 member 를 선언했기 때문에 int member 로 중복 선언 불가능하다.
- 데이터 스코프 : 데이터를 쓸 수 있는 범위로, 변수를 선언하고 선언 ; 이후 부터 사용 가능하다.
따라서 System.out.println(member); 는 byte 변수 선언 전에 사용될 수 없다.
- num = num + 1;
- num++; //변수++
- num += 1; //num = num + 1; num = ++num; num = num++;
- num -= 1; //num = num - 1; num = --num; num = num--;
- num %= 2; //모듈러 : 나머지 값
Q) 위 num에 저장될 값? 몇 개?A) 0, 1 총 2개이다. 왜냐하면 2개로 나눠주기 때문에 나올 수 있는 것은 0, 1 두 개이기 때문이다.
만약 나눠주는 수가 7이라면 나올 수 있는 수는 7개이며 0, 1, 2, 3, 4, 5, 6 이다.
* 캐스트, 프로모션
- num은 int이고 member는 byte 타입이다.
- num = member; //작은 타입이 큰 타입에 자동대입(프로모션)
- member = (byte) num; //큰 타입이 작은 타입으로 들어갈 때는 반드시 타입 변경(캐스트)number++ 는 후행증감으로 처음은 1이 나오지만,
이후에는 후행증감이 되었기 때문에 출력시에 number는 2가 나온다.
++number 는 선행증감으로 처음도 2가 나오고,
이후에도 출력시에 number는 2가 나온다.
int num2 += --number 을 하게 되면 에러가 뜨게 된다.
이를 풀어쓰면 int num2 = num2 + --number 인데, 위에서 num2에 대해 값을 지정해준 적이 없다.
(선언만 함)
따라서 해당 코드는 오류가 뜨게 되고, 오류가 뜨지 않기 위해서는 num2에 값을 지정해줘야 한다.
* 연산순서 실습해보기
1. 선행증감
--number가 2번째이므로 우선 감소시켜주면 number는 0이 되고,
이후 3번째 + 를 통해 number와 10을 더해주고 9번째 대입을 통해 num2 에 저장한다.
그 결과 num2는 10이 된다.
아래 코드를 보면 ++ -- 가 2번째 순서이기 때문에 number는 1이 되고, num2는 9가 된다.
이를 3번째 +를 통해 더하고 9번째인 = 을 통해 대입하면 num3 가 나온다.
따라서 num3는 10이 된다.
2. 후행증감
+ 가 3번째 순서이기 때문에 먼저 num2와 num3를 더해주고 9번째 = 을 통해 number에 대입해준다.
따라서 number 는 0이 나오게 된다.
이후 10번째인 -- 와 ++ 를 각각 해주게 되면, num2는 -1 num3는 1이 된다.
3. 논리연산자
논리연산자 boolean 은 true 와 false로 확인 가능
1 + 2 != 4 가 아니다라는 말이므로 해당 값은 true 가 나온다.
※ != 는 같지 않다(=다르다)를 의미
4. 쉬프트 연산
40을 2진수로 표현하면 101000 으로 나타낼 수 있다.
>> 는 오른쪽으로 2칸 이동이므로 1010 인 숫자 10이 출력된다.
* 진법 (2, 8, 16진법)
- 2진법 : Integer.toBinaryString()
- 8진법 : Integer.toOctalString()
- 16진법 : Integer.toHexString()
- 2진법 입력 0B바이너리 입력
EX) num2 = 0B1010;
- 8진법 0을 입력한 후 8진법 입력
EX) num2 = 020;
- 16진법 0X
EX) num2 = 0X20;
* 비트반전
~로 표현한다.
단, 2의 비트반전 ~2의 값이 -2를 의미하지는 않는다.
■ 비트 연산자 (&, |, !)
* 논리곱(&)
- & 로 표현하며 비트 값 둘 다 1일때 1이다.
EX)
number = 2; //010
num2 = 6; //110-------------------------
//010 = 2가 나온다.
* 논리합(|)
- | 로 표현하며 하나라도 1이 있으면 1
EX)
number = 2; //010
num2 = 7; //111-------------------------
//111 = 7가 나온다.
* xor (^)
- ^ 로 표현하며 서로 값이 다를 때 1, 같을 경우 0
EX)
number = 2; //0010
num2 = 10; //1010-------------------------
//1000 = 8■ 논리 연산자 (&&, ||)
* 논리곱(&&)
- && 로 표현하며, 왼쪽 && 오른쪽 = 둘 다 참일 때 참
- 참 && 거짓 = 거짓
- 거짓 && 참 = 거짓
- 거짓 && 거짓 = 거짓
- 참 && 참 = 참* 논리합(||)
- || 로 표현하며, 둘 중 하나면 참이면 참
- 참 || 거짓 = 참
- 거짓 || 참 = 참
- 거짓 || 거짓 = 거짓
- 참 || 참 = 참* 조건식(조건식 ? 참일때 : 거짓;)
* 조건식
if(조건식) {
참일때 실행할 명령어;
} else {
조건이 거짓일 때 실행할 명령어;
}if 조건문 1줄로
조건식 ? 참일때 : 거짓;
으로 나타낼 수 있다.
number 값이 1이기 때문에 참일때 값 "1입니다." 출력된다.
아래 논리합 ||의 경우, 왼쪽은 거짓 오른쪽은 참이다.
따라서 논리합은 하나라도 참이면 참이기 때문에 "true" 가 출력된다.
■ 제어문 (조건문, 반복문)
- 조건문 : 조건에 따라 분기(갈림길)되는 문장
EX) if, switch- 반복문 : 특정 명령어를 반복적으로 수행하는 문장
EX) for, while, do-while■ 조건문 if
* 조건식 표현
1. 참일 경우에만 출력
if(조건식) {
조건식이 참일 때 실행할 명령;
}2. 참일 경우와 그렇지 않을 경우 출력
if(조건식) {
조건식이 참일 때 실행할 명령;
} else {
조건식이 거짓일 때 실행할 명령;}
3. 조건식이 2개 이상 (if ~esle if~else)
- 조건식에 들어가는 결과가 참 또는 거짓이 되는 문장?
EX)- boolean : true / false
- 부등호 : 1 > 5
- 1 == 2■ 사용자 입력한 숫자 판별 프로그램 실습
print 로 줄넘김 없이 코드를 입력할 수 있게 설정해 준다.
사용자가 입력할 수 있게 하는 코드 입력이 필요한데 이는 System.in.read() 를 해주면 된다.
그러나 해당 처리를 진행하면 오류 코드가 뜨지만, 오류 코드 중에서 처리될 수 있도록
오류 코드에 마우스를 대고 변경될 수 있도록 설정해준다.
코드를 입력하게 되면 내가 입력한 숫자가 아닌 다른 숫자가 나오는데 이는 아스키코드가 나오기 때문이다.
따라서 내가 원하는 숫자를 나오게 하기 위해서 0부터 나와야 함으로 0의 아스키코드 48을 빼는
int input = Syste m.in.read() - 48;
를 입력하면 된다.
* 혼자 코딩 실습 (사용자 입력한 숫자 판별 프로그램 실습)
■ 스캐너 이용하기
앞선 System.in.read() 의 경우 1글자만 입력이 가능하다.
그러나 Scanner 을 사용하게 되면 입력한 여러 글자를 가져올 수 있다.
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();※ nextInt() 은 정수 형태로 가져온다는 것을 의미한다.
- \n : 줄바꿈
- \t : 탭
5보다 큰 숫자를 입력하면 나오는 결과값을 상단에 위치시켜 준다.
왜냐하면 아래 결과값 중 5보다 큰 숫자를 입력하는 경우가 많기 때문에
데이터 처리 속도 및 효율성을 위해 위와 같이 배치해준다.
■ 반복문 for 문
- 프로그래밍에서 필요에 따라 특정 명령을 반복적으로 실행해야 할 때가 있습니다.
- 이 때 사용되는 구문이 반복문 입니다. 자바에서는 3개의 반복문이 있습니다.
EX) for, while, do-while
for(변수 초기화; 변수 조건문; 변수 증감식) {
변수 조건문이 참일때 실행할 반복문;
}해당 for 문의 i 의 영역을 나갔기 때문에 System.out.println(i); 는 에러가 발생한다.
데이터 스코프 때문이며 i를 쓸 수 있는 영역은 파란색 표시 영역 까지이다.
※ 데이터 스코프 : 데이터를 쓸 수 있는 범위로, 변수를 선언하고 선언 ; 이후 부터 사용 가능하다.
시작을 1로 시작하려면 i 의 값을 1로 설정해준다.
그렇게 되면 1에서부터 5까지의 수를 출력하게 된다.
* 유머 핵전쟁 코드 실습
10부터 시작해서 0까지 발사가 모두 나오도록 코딩해본다.
시작이 10이므로 i = 10으로 설정하고, 조건은 i >= 0 으로 설정해 0까지만 출력할 수 있도록 조건을 걸어준다.
i 값이 점점 낮아짐으로 i-- 로 후행증감을 넣어준다.
핵전쟁.coding | (백업)유머 게시판(2020-2021) (ruliweb.com)
그렇다면 올바르게 고치면 어떻게 될까?
반복문을 벗어나 주면 된다.
따라서 System.out.println("발사"); 를 for문 밖으로 빼주면 올바르게 출력된다.
* 2의 배수 옆으로 출력하기 (책 134 페이지에 if문, 148페이지 for문 참조)
2부터 시작하여 10까지 2의 배수를 찾으려 한다면,
우선 i를 2로 정해주고 i < 11 까지로 조건을 걸어줘 10까지 나올 수 있도록 설정해준다.
이후 if 조건문을 통해 2의 배수는 나머지의 값이 0 이므로 그럴 경우 i 그대로 출력,
그렇지 않을 경우 공백을 출력하게 한다.
또한 옆으로 출력을 위해서 println 이 아닌 print 를 써준다.
* 혼자 코딩실습 ( 2의 배수 옆으로 출력하기)
* 3의 배수 Fizz 5의 배수 Buzz 나타내기 (25까지)
단, 3과 5의 공배수는 Fizz Buzz 로 나타내기.
1부터 시작하여 25까지 나오기 위해서는 시작을 1 끝나는 지점을 25로 만들어 준다.
이를 위해 i = 1 로 지정하고 i < 26 으로 조건식을 만들고 1씩 증감시켜 준다.
여기서 중요한 것은 3의 배수와 5의 배수 즉 공배수가 "Fizz Buzz" 로 출력돼야 한다.
따라서 둘의 논리값이 모두 참이여야 실행되는 논리곱 && 를 사용해준다.
3의 배수는 3으로 나누었을때 나머지가 0, 5의 배수는 5로 나누었을때 나머지가 0인 수이다.
이를 코드로 나타내면
if ((i % 3) == 0 && (i % 5) == 0)
조건식으로 나타낼 수 있다.
해당 조건시일 경우 "Fizz Buzz" 가 출력되게 설정해준다.
이외 3의 배수일 경우 Fizz, 5의 배수을 경우 Buzz 는 else if 를 통해 조건을 걸어준다.
마지막으로 이외의 경우 i 값 그대로 출력하게 해주면 우리가 원하는 값을 얻을 수 있다.
https://en.wikipedia.org/wiki/Fizz_buzz
* 혼자 코딩실습 ( 3의 배수 Fizz 5의 배수 Buzz 나타내기 (25까지))
※ 단축키
- Ctrl + 해당 변수 클릭 : 해당 변수 코드줄로 이동
* 요청사항 <완료>
- 3의 배수 Fizz 5의 배수 Buzz 나타내기 (25까지)
단, 3과 5의 공배수는 Fizz Buzz 로 나타내기.
'개발 > 국비교육' 카테고리의 다른 글
(국비교육) 6 - 구구단 출력하기 + %활용문 + 배열 (0) 2023.06.08 (국비교육) 5 - 메소드 호출 + if, for 문 + 별찍기 + 10진법 2진법 나타내기 (0) 2023.06.07 (국비교육) 3 - 변수와 자료형 (0) 2023.06.02 (국비교육) 2 - 자바 기초 (0) 2023.06.01 (국비교육) 1 - 센터 담당자 소개 및 교육 진행 방향 (0) 2023.06.01