Java 연산자, 조건문, 반복문

이재하·2023년 7월 25일
0

항해99

목록 보기
4/48
post-thumbnail

목표
1. 다양한 연산자에 대해서 학습하고 사용방법을 익힌다.
2. 조건문과 반복문을 통해 프로그램의 문맥을 구성하는 방법을 배운다.


연산자

  • 연산자 : 계산할 기호 ➕
  • 피연산자 : 연산자로 인해 계산되는 숫자 🔢

연산자 종류

  • 산술 연산자

    • 사칙 연산 및 비트연산을 포함
    • 사칙 연산을 계산한 결과값을 응답한다
    • +(덧셈), - (뺄셈), *(곱셈), /(나눗셈/몫), % (나눗셈/나머지) <<(왼쪽으로 자리수 옮기기), >>(오른쪽으로 자리수 옮기기)
  • 비교 연산자

    • 값의 크고/작음을 비교하거나 같고/다름 을 비교하여 참(true)/거짓(false) 값인 boolean 값을 출력한다.
    • > (크다) , < (작다), >= (크거나 같다), <= (작거나 같다), == (같다), != (다르다)
  • 논리 연산자

    • 비교 연산의 결과값으로 받을 수 있는 boolean 값을 연결하는 연산자
    • 조건을 연결 하였을때의 boolean 값들을 조합하여 참(true)/거짓(false) 값인 boolean 값을 출력한다.
    • && (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
  • 삼항 연산자
    • 비교 연산의 결과값에 따라 응답할 값을 직접 지정할 수 있는 연산
    • 삼항 연산자는 3가지 피연산자가 존재하여 삼항 연산자 라고 한다. (조건/참결과/거짓결과)
    • (조건) ? (참결과) : (거짓결과)
// 삼항 연산자
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 연산자
    • 조건에 명시된 클래스의 객체인지 비교하여 참/거짓을 응답해주는 연산자
    • (객체명) 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);
	}

}

비트연산

<<(왼쪽으로 자리수 옮기기), >>(오른쪽으로 자리수 옮기기)

  • 0,1 은 2진수 값이기 때문에,
    • 자리수를 왼쪽으로 옮기는 횟수만큼 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, switch

if 문

  • if(조건)
    • 특정 조건에 따라 다른 연산을 수행하고 싶을때 사용하는 문맥
    • 기본적인 조건에 따른 연산을 수행하기 위해 if(조건) { 연산 } 형태로 사용
    • if 의 소괄호() 안의 조건이 boolean 값 true 를 만족하면 중괄호 {} 안의 연산을 수행
  • if(조건)-else
    • if문 조건이 거짓일 경우에 따른 연산을 수행하기 위해 else { 연산 } 형태로 사용
    • if 의 소괄호() 안의 조건이 boolean 값 false 를 만족하면 else 의 중괄호 {} 안의 연산을 수행
  • if(조건)-else if(조건)
    • 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(조건)
    • 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 입니다."); // 미출력
	}
}

중첩 if 문 활용

  • 입력
    • 첫번째 입력값으로 A 유저가 낸 가위바위보
    • 두번째 입력값으로 B 유저가 낸 가위바위보
  • 출력
    • A, B 유저중에 누가 이겼는지 출력
// 조건문으로 가위바위보 만들기

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(조건)

📌 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 문과 switch 문

  • 차이점1. 복합조건
    • if 문은 복합조건을 지원
      • 복합조건 : 괄호()안에 조건 여러개를 지정하여 조건문을 수행할 수 있다.
    • switch 문은 피연산자 한개에 대한 조건만 지원
  • 차이점2. 코드중복
    • if 문은 상대적으로 코드중복이 많다.
    • switch 문은 코드중복이 적다.
// 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, while, do-while

for 문

  • 특정 조건에 따라 연산을 반복해서 수행하고 싶을때 사용하는 문맥
  • for (초기값; 조건문; 증가연산) { (연산) } 형태로 사용
  • 특정 조건은 초기값조건문을 통해서 정의
  • 반복할때마다 값을 증가 시키려면 증가연산을 정의
  • 초기값조건문을 만족할때까지 (연산)을 수행하면서 회차마다 증가연산을 수행
// for 문

for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
    System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}

// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력
  • 향상된 for 문
    • for 소괄호 안에 값이 3개나 들어가기 때문에 이걸 2개로 줄여주는 방법이 향상된 for문
    • 향상된 for 문은 연속된 변수목록을 출력할때 쓰임
    • 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 문, do-while 문

  • for 문과 동일하게 특정 조건에 따라 연산을 반복해서 수행하고 싶을때 사용하는 문맥
  • 다만, 초기값 없이 조건문만 명시하여 반복
  • while(조건문) { (연산) } 형태로 사용 (while 문)
    • 위처럼 while 문으로 사용하면 조건문을 만족해야지만 연산이 반복수행
    • 한번 반복할때마다 조건문을 체크해서 조건문이 불만족(false) 이면 반복을 중단
  • do { (연산) } while(조건문) 형태로도 사용 (do-while 문)
    • 위처럼 do-while 문으로 사용하면 최초 1회 연산수행 후 조건문을 체크하여 더 반복할지 결정
    • 반복하게 된다면 그 이후에는 한번 반복할때마다 조건문을 체크해서 조건문이 불만족(false) 이면 반복을 중단
// 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 명령

  • 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 명령

  • for 문 또는 while 문에서 해당 순서를 패스하고 싶을때 continue 명령을 사용합니다.
  • 반복문 안에서 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곱하기24입니다.
2곱하기36입니다.
2곱하기48입니다.
... 중략 ...
9곱하기872입니다.
9곱하기981입니다.
// 선택적 구구단 생성기

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곱하기26입니다.
3곱하기39입니다.
3곱하기412입니다.
... 중략 ...
9곱하기872입니다.
9곱하기981입니다.

0개의 댓글