오늘은 강의를 들어서 TIL의 문시해알이 아닌 공부한 내용을 정리할거다!!
연산자의 종류
● 연산자는 사칙연산 외에도 여러가지 연산자가 존재한다.
산술 연산자 | +, -, *, /, %, <<, >> | 사칙 연산과 비트연산 |
비교 연산자 | >, <, >=, <=, ==, != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | &&, ||, ! | 그리고(AND)와 또는(OR) 으로 조건을 연결 |
대입 연산자 | =, ++, -- | 우변의 값을 좌번에 저장, 연산 복합 대입 |
기타 연산자 | (type), ? :, instance of | 형변환 연산자, 삼항 연산자, instance of연산자 |
📖 산술 연산자
● 사칙 연산 및 비트연산을 포함한다.
● 사칙 연산을 계산한 결과값을 응답한다.
● +(덧셈), -(뺄셈), *(곱셈), /(나눗셈 / 몫), %(나눗셈 / 나머지)
// 사칙 연산
System.out.println(4 + 2); // 6
System.out.println(4 - 2); // 2
System.out.println(4 * 2); // 8
System.out.println(4 / 2); // 2
System.out.println(5 / 2); // 2
System.out.println(2 / 4); // 0
System.out.println(4 % 2); // 0
System.out.println(5 % 2); // 1
// 우선 순위 연산
System.out.println(2 + 2 * 2); // 6
System.out.println((2 + 2) * 2); // 8
System.out.println(2 + (2 * 2)); // 6
// 변수를 이용한 연산
int a = 20;
int b = 10;
int c;
// 덧셈
c = a + b;
System.out.println(c); // 30
// 뺄셈
c = a - b;
System.out.println(c); // 10
// 곱셈
c = a * b;
System.out.println(c); // 200
// 나눗셈 (몫)
c = a / b;
System.out.println(c); // 2
// 나눗셈 (나머지) = 나머지 연산
c = a % b;
System.out.println(c); // 0
📖 비교 연산자
● 값의 크고 / 작음을 비교하거나 같고 / 다름을 비교하여 참 / 거짓 값인 boolean 값을 출력한다.
● > (크다), <(작다), >=(크거나 같다), <= (작거나 같다), ==(같다), !=(다르다)
// 비교 연산자 (참이면 true, 거짓이면 false)
System.out.println(10 > 9); // 10 는 9 보다 크다 (참이면 true, 거짓이면 false)
System.out.println(10 >= 9); // 10 는 9 보다 크거나 같다 (true)
System.out.println(10 < 9); // 10 는 9 보다 작다 (false)
System.out.println(10 <= 9); // 10 는 9 보다 작거나 같다 (false)
System.out.println(10 == 10); // 10 는 10 와 같다 (true)
System.out.println(10 == 9); // 10 는 9 과 같다 (false)
System.out.println(10 != 10); // 10 는 10 와 같지 않다 (false)
System.out.println(10 != 9); // 10 는 9 과 같지 않다 (true)
📖 논리 연산자
● 비교 연산의 결과값으로 받을 수 있는 boolean 값을 연결하는 연산자 이다.
● 조건을 연결 하였을때의 boolean 값들을 조합하여 참(true)/거짓(false) 값인 boolean 값을 출력한다.
● && (AND = 피연산자 모두 참), || (AND = 피연산자 모두 참), ! (피연산자의 반대 boolean 값)
// 논리 연산자
boolean flag1 = true;
boolean flag2 = true;
boolean flag3 = false;
System.out.println(flag1); // true
System.out.println(flag2); // true
System.out.println(flag3); // false
// 피연산자 중 하나라도 true 이면 true
System.out.println(flag1 || flag2); // true
System.out.println(flag1 || flag2 || flag3); // true
// 피연산자 모두 true 이면 true
System.out.println(flag1 && flag2); // true (flag1, flag2 모두 true 라서)
System.out.println(flag1 && flag2 && flag3); // false (flag3은 false 라서)
// And 연산
System.out.println((5 > 3) && (3 > 1)); // 5 는 3 보다 크고, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) && (3 < 1)); // 5 는 3 보다 크고, 3 은 1 보다 작다 (false)
// Or 연산
System.out.println((5 > 3) || (3 > 1)); // 5 는 3 보다 크거나, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) || (3 < 1)); // 5 는 3 보다 크거나, 3 은 1 보다 작다 (true)
System.out.println((5 < 3) || (3 < 1)); // 5 는 3 보다 작거나, 3 은 1 보다 작다 (false)
// System.out.println(1 < 3 < 5); // 불가능한 코드
// 논리 부정 연산자
System.out.println(!flag1); // false (flag1 값의 반대)
System.out.println(!flag3); // true (flag3 값의 반대)
System.out.println(!(5 == 5)); // false
System.out.println(!(5 == 3)); // true
📖 대입 연산자
● 변수를 바로 연산해서 그자리에서 저장하는 연산자
● 기본 대입 연산자인 = 와 다른 연산을 함께쓰는 복합 대입 연산자가 있다. ( +=, -=, *= ...)
● 복합 대입 연산자는 기본 대입 연산자를 심플하게 작성하게 해주는것이지 기능은 같다.
● 추가로 += 1 은 ++과 동일하다. (피연산자에 1 더해주기)
● 똑같이 -= 1 은 --와 동일하다. (피연산자에 1 빼주기)
// 대입 연산자
int number = 10;
number = number + 2;
System.out.println(number); // 12
number = number - 2;
System.out.println(number); // 10
number = number * 2;
System.out.println(number); // 20
number = number / 2;
System.out.println(number); // 10
number = number % 2;
System.out.println(number); // 0
number = number++;
System.out.println(number); // 2
number = number--;
System.out.println(number); // 0
// 복합 대입 연산자
number = 10;
number += 2;
System.out.println(number); // 12
number -= 2;
System.out.println(number); // 10
number *= 2;
System.out.println(number); // 20
number /= 2;
System.out.println(number); // 10
number %= 2;
System.out.println(number); // 0
🙅🏼♂️ 대입 연산자 중에 증감 연산자 쓸때 주의할점 🙅🏼♂️
● ++ 또는 -- 를 붙이면 피연산자가 1 더해지거나 1 빼기가 된다고 말씀드렸지요?!
● 주의할 점은 피연산자 뒤에 붙이냐, 앞에 붙이냐에 따라서 연산순서가 달라집니다!!
연산자 | 연산자 위치 | 기능 | 연산 예 |
++ | ++ {피연산자} | 연산 전에 피연산자에 1을 더해줌 | val = ++num; num값+1 후에 val 변수에 저장 |
++ | {피연산자}++ | 연산 후에 피연산자에 1을 더해줍니다. | val = num++; num값을 val변수에 저장 후 num+1 |
-- | —{피연산자} | 연산 전에 피연산자에 1을 빼줍니다. | val = —num; num값-1 후에 val변수에 저장 |
-- | {피연산자}— | 연산 후에 피연산자에 1을 빼줍니다. | val = num—; num값을 val변수에 저장 후 num-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이 된겁니다!
}
}
📖 기타 연산자
✔️ 형변환 연산자
● 1일차 강의에서 배운내용으로 괄호 안에 변환할 타입을 넣으면 피연산자의 타입이 변경
// 형변환 연산자
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
📖 연산자 우선순위
📌 연산자 우선순위 : 산술 > 비교 > 논리 > 대입
● 연산자 여러개가 함께 있는 연산을 계산할때는 우선순위가 있다.
● 위 우선순위에 따라서 최종적인 응답값이 결정됨.
● 단 괄호로 감싸주면 괄호안의 연산이 최우선순위로 계산됨
✔️ 연산자 우선순위 예제
// 연산자 우선순위
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)
📖 산술변환
📌연산 전에 피연산자의 타입을 일치시키는 것
두 피연산자의 타입을 같게 일치시킨다. (둘중에 저장공간 크기가 더 큰 타입으로 일치)
● 피연산자의 타입이 int 보다 작은 short 타입이면 int로 변환
● 피연산자의 타입이 long 보다 작은 int, short 타입이면 Long 으로 변환
● 피연산자의 타입이 float 보다 작은 long, int, short 타입이면 float 으로 변환
● 피연산자의 타입이 double 보다 작은 float, long, int, short 타입이면 double 로 변환
● 이처럼 변수 여러개를 연산했을 때 결과값은 피연산자 중 표현 범위가 가장 큰 변수 타입을 가지게 된다.
✔️ 연산자 우선순위 예제
// 산술변환
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);
}
}
📖 비트 변환
● Byte 를 8등분한게 Bit 라고 알고있을 것이다.
● Bit 는 0,1 둘중의 하나의 값만을 저장하는 컴퓨터가 저장(표현)가능한 가장 작은 단위이고
● 컴퓨터의 가장작은 단위인 Bit이기 때문에 연산중에서 Bit 연산이 제일 빠르다.
● 물론 이전에 배운대로 0,1 값으로 산술연산을 하거나, 비교연산을 할 수 있지만 비트 연산을 통해 자리수를 옮길수도 있다.
● 이처럼 Bit의 자리수를 옮기는 것을 비트 연산이다.
● << (왼쪽으로 자리수 옮기기), >> (오른쪽으로 자리수 옮기기)
● 0,1 은 2진수 값이기 때문에, 자리수를 왼쪽으로 옮기는 횟수만큼 2의 배수로 곱셈이 연산되는것과 동일하고. (<<)
● 0,1 은 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 값이 됩니다.
'TIL, WIL > TIL' 카테고리의 다른 글
문시해알, 맞왜틀 TIL - 20230623 (0) | 2023.06.23 |
---|---|
문시해알, 맞왜틀 TIL - 20230622 (0) | 2023.06.22 |
문시해알, 맞왜틀 TIL - 20230526 (0) | 2023.05.26 |
문시해알, 맞왜틀 TIL - 20230524 (1) | 2023.05.24 |
문시해알, 맞왜틀 TIL - 20230523 (0) | 2023.05.23 |