목표
1. 다양한 연산자에 대해서 학습하고 사용방법을 익힌다.
2. 조건문과 반복문을 통해 프로그램의 문맥을 구성하는 방법을 배운다.
산술 연산자
+
(덧셈), -
(뺄셈), *
(곱셈), /
(나눗셈/몫), %
(나눗셈/나머지) <<
(왼쪽으로 자리수 옮기기), >>
(오른쪽으로 자리수 옮기기)비교 연산자
>
(크다) , <
(작다), >=
(크거나 같다), <=
(작거나 같다), ==
(같다), !=
(다르다)논리 연산자
&&
(AND = 피연산자 모두 참), ||
(OR = 피연산자 둘중 하나라도 참), !
(피연산자의 반대 boolean 값)대입 연산자
=
와 다른 연산을 함께쓰는 복합 대입 연산자가 있다. (+=
, -=
, *=
…)+= 1
는 ++
과 동일 (피연산자에 1 더해주기)-= 1
은 —-
와 동일 (피연산자에 1 빼주기) 대입 연산자 중 증감 연산자
++(피연산자)
연산 전에 피연산자에 1 더해준다
(피연산자)++
연산 후에 피연산자에 1 더해준다
--(피연산자)
연산 전에 피연산자에 1 빼준다
(피연산자)--
연산 후에 피연산자에 1 빼준다
// 대입 증감 연산자
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 10;
int val = ++a + b--; // a 는 연산전에 +1, b 는 연산후에 -1
System.out.println(a); // 11
System.out.println(b); // 9
System.out.println(val); // 21
// 11 + 9 가 왜 21이 나오는거죠??
// 그 이유는
// a 는 val 연산전에 ++ 가 수행되어서 11로 연산되었지만
// b 는 val 연산후에 -- 가 수행되어서 기존값이 10으로 연산된 후 -- 가 수행되었습니다.
// 따라서 연산된 a값인 11과 연산되기전 b값인 10이 더해져서 21이 된겁니다!
int c = a--; // c 에 a 값 대입 후 a-1 (즉, a=10, c=11)
int d = ++b; // b 값 +1 후에 d 에 대입 (즉, b=10, d=10)
int val = c-- * ++d; // c 는 연산후에 -1, d 는 연산전에 +1
System.out.println(a); // 10
System.out.println(b); // 10
System.out.println(c); // 11
System.out.println(d); // 10
System.out.println(val); // 11 * 11 = 121
// 11 * 10 이 왜 121이 나오는거죠??
// 그 이유는
// c 는 val 연산후에 -- 가 수행되어서 기존값이 11로 연산된 후 -- 가 수행되었지만
// d 는 val 연산전에 ++ 가 수행되어서 11로 연산되었습니다.
// 따라서 연산전 a값인 11과 연산된 b값인 11이 곱해져서 121이 된겁니다!
}
}
// 형변환 연산자
int intNumber = 93 + (int) 98.8; // 93 + 98
double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8
조건
/참결과
/거짓결과
)(조건)
?
(참결과)
:
(거짓결과)
// 삼항 연산자
int x = 1;
int y = 9;
boolean b = (x == y) ? true : false;
System.out.println(b); // false
String s = (x != y) ? "정답" : "땡";
System.out.println(s); // 땡
int max = (x > y) ? x : y;
System.out.println(max); // 9
int min = (x < y) ? x : y;
System.out.println(min); // 1
(객체명)
instance of
(클래스명)
산술 > 비교 > 논리 > 대입
// 연산자 우선순위
int x = 2;
int y = 9;
int z = 10;
boolean result = x < y && y < z; // <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // true
result = x + 10 < y && y < z; // +10 산술연산자 계산 후 <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // false
result = x + 2 * 3 > y; // 산술연산자 곱센 > 덧셈 순으로 계산 후 > 비교연산자 계산
System.out.println(result); // false (8>9)
result = (x + 2) * 3 > y; // 괄호안 덧셈 연산 후 괄호 밖 곱셈 계산 후 > 비교연산자 계산
System.out.println(result); // true (12>9)
📌 연산 전에 피연산자의 타입을 일치시키는 것
// 산술변환
public class Main {
public static void main(String[] args) {
short x = 10;
int y = 20;
int z = x + y; // 결과값은 더 큰 표현타입인 int 타입의 변수로만 저장할 수 있습니다.
long lx = 30L;
long lz = z + lx; // 결과값은 더 큰 표현타입인 long 타입의 변수로만 저장할 수 있습니다.
float fx = x; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
float fy = y; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
float fz = z; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
System.out.println(lz);
System.out.println(fx);
System.out.println(fy);
System.out.println(fz);
}
}
<<
(왼쪽으로 자리수 옮기기), >>
(오른쪽으로 자리수 옮기기)
왼쪽
으로 옮기는 횟수만큼 2의 배수
로 곱셈
이 연산되는것과 동일오른쪽
으로 옮기는 횟수만큼 2의 배수
로 나눗셈
이 연산되는것과 동일// 비트 연산
// 참고, 3의 이진수값은 11(2) 입니다. 12의 이진수값은 1100(2) 입니다.
// (2) 표기는 이 숫자가 이진수값이라는 표식 입니다.
System.out.println(3 << 2);
// 3의 이진수값인 11(2) 에서 왼쪽으로 2번 옮겨져서 1100(2) 인 12값이 됩니다.
System.out.println(3 >> 1);
// 3의 이진수값인 11(2) 에서 오른쪽으로 1번 옮겨져서 1(2) 인 1 값이 됩니다.
if(조건)
{ 연산 }
형태로 사용if
의 소괄호() 안의 조건이 boolean 값 true 를 만족하면 중괄호 {} 안의 연산을 수행if문
조건이 거짓일 경우에 따른 연산을 수행하기 위해 else { 연산 }
형태로 사용if
의 소괄호() 안의 조건이 boolean 값 false 를 만족하면 else
의 중괄호 {} 안의 연산을 수행if문
조건이 거짓일 경우에 다시한번 다른조건으로 체크해서 참일 경우에 연산을 수행하기 위해 else if(조건) { 연산 }
형태로 사용else if
의 소괄호() 안의 조건이 boolean 값 true 를 만족하면 else if
의 중괄호 {} 안의 연산을 수행// 조건문
int number = 2;
if (number == 1) {
System.out.println("number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("number 값은 2 입니다."); // number 값은 2 입니다. 출력
} else {
System.out.println("number 값은 모르는 값입니다."); // 미출력
}
if 문
에 else
, else if
로 해결할 수 없는 복잡한 조건이 있을 수 있다.if 문
또는 else if문
또는 else 문
안에 if 문
을 넣을 수 있다.// 중첩 조건문
boolean flag = true;
int number = 2;
if (flag) {
if (number == 1) {
System.out.println("flag 값은 true, number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("flag 값은 true, number 값은 2 입니다."); // flag 값은 true, number 값은 2 입니다. 출력
}
} else {
if (number == 1) {
System.out.println("flag 값은 false, number 값은 1 입니다."); // 미출력
} else if (number == 2) {
System.out.println("flag 값은 false, number 값은 2 입니다."); // 미출력
}
}
// 조건문으로 가위바위보 만들기
import java.util.Objects;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("A 입력 : ");
String aHand = sc.nextLine(); // A 입력
System.out.print("B 입력 : ");
String bHand = sc.nextLine(); // B 입력
if (Objects.equals(aHand, "가위")) { // 값을 비교하는 Obects.equals() 메서드 사용
if (Objects.equals(bHand, "가위")) {
System.out.println("A 와 B 는 비겼습니다."); // A 와 B 의 입력값을 비교해서 결과 출력
} else if (Objects.equals(bHand, "바위")) {
System.out.println("B 가 이겼습니다.");
} else if (Objects.equals(bHand, "보")) {
System.out.println("A 가 이겼습니다.");
} else {
System.out.println(" B 유저 값을 잘못 입력하셨습니다.");
}
} else if (Objects.equals(aHand, "바위")) {
if (Objects.equals(bHand, "가위")) {
System.out.println("A 가 이겼습니다.");
} else if (Objects.equals(bHand, "바위")) {
System.out.println("A 와 B 는 비겼습니다.");
} else if (Objects.equals(bHand, "보")) {
System.out.println("B 가 이겼습니다.");
}
} else if (Objects.equals(aHand, "보")) {
if (Objects.equals(bHand, "가위")) {
System.out.println("B 가 이겼습니다.");
} else if (Objects.equals(bHand, "바위")) {
System.out.println("A 가 이겼습니다.");
} else if (Objects.equals(bHand, "보")) {
System.out.println("A 와 B 는 비겼습니다.");
}
}
}
}
// 입/출력 예시
// A 입력 : 가위
// B 입력 : 보
// A 가 이겼습니다.
📌 switch 문은 case 문과 함께 사용하며 if문 보다 좀더 가독성이 좋은 조건문 표현식
switch(피연산자)
{ case(조건): (연산) }
이러한 형태로 많이 쓰임
<// switch/case 문
int month = 8;
String monthString = "";
switch (month) {
case 1: monthString = "1월";
break;
case 2: monthString = "2월";
break;
case 3: monthString = "3월";
break;
case 4: monthString = "4월";
break;
case 5: monthString = "5월";
break;
case 6: monthString = "6월";
break;
case 7: monthString = "7월";
break;
case 8: monthString = "8월";
break;
case 9: monthString = "9월";
break;
case 10: monthString = "10월";
break;
case 11: monthString = "11월";
break;
case 12: monthString = "12월";
break;
default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력
()
안에 조건 여러개를 지정하여 조건문을 수행할 수 있다.// if vs switch
// switch 문 실습코드를 if 문으로 바꿔보겠습니다.
// switch
int month = 8;
String monthString = "";
switch (month) {
case 1: monthString = "1월";
break;
case 2: monthString = "2월";
break;
case 3: monthString = "3월";
break;
case 4: monthString = "4월";
break;
case 5: monthString = "5월";
break;
case 6: monthString = "6월";
break;
case 7: monthString = "7월";
break;
case 8: monthString = "8월";
break;
case 9: monthString = "9월";
break;
case 10: monthString = "10월";
break;
case 11: monthString = "11월";
break;
case 12: monthString = "12월";
break;
default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력
// if 로 변환
if (month == 1) {
monthString = "1월";
} else if (month == 2) {
monthString = "2월";
} else if (month == 3) {
monthString = "3월";
} else if (month == 4) {
monthString = "4월";
} else if (month == 5) {
monthString = "5월";
} else if (month == 6) {
monthString = "6월";
} else if (month == 7) {
monthString = "7월";
} else if (month == 8) {
monthString = "8월";
} else if (month == 9) {
monthString = "9월";
} else if (month == 10) {
monthString = "10월";
} else if (month == 11) {
monthString = "11월";
} else if (month == 12) {
monthString = "12월";
} else {
monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력
for
(초기값;
조건문;
증가연산
) { (연산) }
형태로 사용초기값
과 조건문
을 통해서 정의증가연산
을 정의초기값
이 조건문
을 만족할때까지 (연산)
을 수행하면서 회차마다 증가연산
을 수행// for 문
for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}
// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력
for
(변수 타입
변수 명
: 목록변수
) { (연산) }
형태로 사용변수 타입
과 변수 명
은 for 문안에서 연산을 수행할 변수를 정의목록변수
는 3,6,9,12,15 처럼 값여러개를 하나의 변수로 저장하고 싶을때 사용// 향상된 for 문
int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
System.out.print(number + " ");
}
// 출력
3 6 9 12 15
// 만약 기존 for 문으로 구현한다면?
int[] numbers = {3,6,9,12,15};
for(int i = 0; i < numbers.length; i++) { // 배열에 .length 를 붙이면 길이값이 응답됩니다.
System.out.println(numbers[i]);
}
// 출력
3 6 9 12 15
while(조건문)
{ (연산) }
형태로 사용 (while 문)do { (연산) }
while(조건문)
형태로도 사용 (do-while 문)// while 문
int number = 0;
while(number < 3) {
number++;
System.out.println(number + "출력");
}
// 출력
1출력
2출력
3출력
// do-while 문
int number = 4;
do {
System.out.println(number + "출력");
} while(number < 3); // 연산을 한번 수행 후 조건문 체크
// 출력
4출력
break;
명령을 호출하면 가장 가까운 블럭의 for 문 또는 while 문을 중단 (또는 switch)break;
형태로 사용// break 명령
int number = 0;
while(number < 3) {
number++;
if (number == 2) {
break; // 2일때 반복 중단
}
System.out.println(number + "출력");
}
// 출력
1출력
// break 명령 범위
for (int i = 0; i < 10; i++) {
System.out.println("i: " + i);
if (i == 2) {
break; // i 가 2일때 가장 바깥 반복문이 종료됩니다.
}
for (int j = 0; j < 10; j++) {
System.out.println("j: " + j);
if (j == 2) {
break; // j 가 2일때 가장 안쪽 반복문이 종료됩니다.
}
}
}
// 출력
i: 0 // 바깥 반복문 부터 수행 시작
j: 0 // 안쪽 반복문 1회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 break;
i: 1 // 바깥 반복문은 아직 break; 호출이 안됬으므로 다음 반복수행
j: 0 // 안쪽 반복문 2회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 두번째 break;
i: 2 // i 가 2일때 바깥 반복문도 break; 호출되어 종료
continue;
형태로 사용// continue 명령
int number = 0;
while(number < 3) {
number++;
if (number == 2) {
continue; // 2일때 반복 패스
}
System.out.println(number + "출력");
}
// 출력
1출력
3출력
// 구구단 생성기
for (int i = 2; i <= 9; i++) { // 구구단 첫번째 지수 i
for (int j = 2; j <= 9; j++) { // 구구단 두번째 지수 j
System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
}
}
// 출력
2곱하기2는4입니다.
2곱하기3는6입니다.
2곱하기4는8입니다.
... 중략 ...
9곱하기8는72입니다.
9곱하기9는81입니다.
// 선택적 구구단 생성기
Scanner sc = new Scanner(System.in);
int passNum = sc.nextInt(); // 출력제외할 구구단수 값
for (int i = 2; i <= 9; i++) {
if (i == passNum) {
continue;
}
for (int j = 2; j <= 9; j++) {
System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
}
}
// 입력
2
// 출력 - 입력값인 2단은 건너띄고 구구단 출력
3곱하기2는6입니다.
3곱하기3는9입니다.
3곱하기4는12입니다.
... 중략 ...
9곱하기8는72입니다.
9곱하기9는81입니다.