course 2021/JAVA

day03 - operator

코딩하는토끼 2021. 8. 15. 20:04

> 연산자 operator

변수의 값 변경/대입 시 사용

연산자에 따라 연산 대상 datatype이 정해져 있다

overflow/underflow 등 범위 벗어나는 연산은 결과에 불필요한 값이 저장된다


1. 단항 연산자 Unary Operator

피연산자(operand)가 하나인 연산자

1)증감 연산자 (++, --) : 변수의 앞/뒤에 붙어서 값을 하나 증가/감소 시킴 (ex. a++;)

증감연산자가 변수의 앞에 붙는 경우 - 전위연산자, 먼저 값을 증감 후 연산/대입

증감연산자가 변수의 뒤에 붙는 경우 - 후위연산자, 먼저 값을 연산/대입 후 증감

int i = 1;
int j = ++i; //i=2, j=i=2
System.out.println(i + " " + j); // 2 2

int x = 1;
int y = x++; // y=x=1, x=2
System.out.println(x + " " + y); // 2 1
int i = 1;
System.out.println(i++); // 1 //1출력, i=2
System.out.println(++i); // 3 //i=3, 3출력
int x = 1;
int y = (x++) + (x++) + 10; // 1 + 2 + 10 = 13
System.out.println(y); // 13
System.out.println(x); // 3

2)부호 연산자 (+, -) : 양수/음수 표현

int a = 5;
int b = -a;
System.out.println(b); // -5

3)비트 반전 연산자 (~) : 비트의 값 반전 (ex. 1010→0101)

byte b = 8; // 0000 1000 
System.out.println(~b); // 1111 0111 = -9

4)논리 반전 연산자 (!) : 논리대수의 값 반전, 부정의 의미 (ex. true→false, false→true)

boolean b = true;
System.out.println(!b); // false

5)캐스트 연산자 ((type)) : datatype 바꿔줌


2. 2항 연산자 Binary Operator

피연산자가 2개인 연산자

(int형보다 크기가 작은 datatype은 모두 int형으로 자동 변환되어 연산, boolean형 제외)

1)산술 연산자 (+, -, *, /, %)

-나머지 연산: 몫(/) 나머지(%), 결과 항상 정수, 0으로 나누면 에러 발생

ex. 5/2=2, 5%2=1

2)비교 연산자 (<, >, <=, >=, ==, !=)

결과 값: 조건 만족 시 true, 그렇지 않으면 false

(비교되는 값들의 datatype이 다르면 크기가 더 큰 datatype에 맞추어 연산)

int a = 1;
int b = 2;
System.out.println(a == b); //false
System.out.println(a != b); //true
System.out.println(a < b); //true

int c = 35;
System.out.println(c % 2 == 0); //false, 짝수가 아니다

*문자열 비교 .equals() 

두 문자열(String)이 서로 같은지 비교할 때, "==" 대신 "문자열 이름.equals(비교할 문자열 이름)" 을 사용

("=="를 사용해도 작동하지만 정확도가 떨어짐)

*문자열과 다른 객체 비교 - .contentEquals()

3)비트 연산자 (&, |, ^)

두 수의 2진수 값 비트 연산

- & (and, 비트곱) : 두 비트 모두 1이면 1, 하나라도 0이면 0 (ex. 0001 & 0101 = 0001)

- | (or, 비트합) : 두 비트 모두 0이면 0, 하나라도 1이면 1 (ex. 0001 | 0101 = 0101)

- ^ (xor, 배타적 논리합) : 두 비트가 다르면 1, 같으면 0 (ex. 0001 ^ 0101 = 0100)

int a = 5; // 0000 0101
int b = 3; // 0000 0011
System.out.println(a & b); // 0000 0001 = 1
System.out.println(a | b); // 0000 0111 = 7
System.out.println(a ^ b); // 0000 0110 = 6

4)비트 이동 연산자 (<<, >>)

왼쪽 항을 2진수로 변환, 오른쪽 항의 숫자만큼 왼쪽(<<)/오른쪽(>>)으로 이동

int a = 33; // 0000 0010 0001
System.out.println(a << 3); // 0001 0000 1000 = 264

5)논리 연산자 (&, |, &&, ||)

boolean 형 변수 연산자

- & : 모두 true → true

- | : 하나라도 true → true 

- && : 왼쪽 항이 false → false (오른쪽 항 고려X) 

(왼쪽 항이 ture이면 &와 동일)

- || : 왼쪽 항이 true → true (오른쪽 항 고려X)

(왼쪽 항이 false면 |와 동일)

* &&, || : short circuit operator

* &보다 &&를 쓰는 것이 보편적!

int a = 10;
int b = 20;

// if (조건식)이 true이면 if블럭 실행, false이면 else블럭 실행

if(a != 10 && ++b == 21) {    // false && true = false
    System.out.println("참");
} else {
    System.out.println("거짓");
}
//거짓

*대입 연산자 Assignment Operator

기본형 = 외에 +=, -=, *=, /=, %= 존재

int a = 3;
a += 2; // a = a + 2   //5
a -= 2; // a = a - 2   //3
a *= 2; // a = a * 2   //6
a /= 2; // a = a / 2   //3
a %= 2; // a = a % 2   //1

 

*random 값 받기

Math.random() : 0 ≤ n < 1 인 임의의 실수 값 n 

Math.random()*100 : 0 ≤ n < 100 인 임의의 실수 값 n 

(int)(Math.random()*100) + 1 : 1≤ n < 101 (1≤ n ≤100) 인 임의의 정수 값 n

ex. -5~5 사이의 정수? 5 - (int)(Math.random()*11)


3. 3항 연산자

피연산자가 3개인 연산자

구조: < 조건식 ? 연산식1 : 연산식2 >

조건식이 true→연산식1 / false→연산식2

*조건식은 boolean형

int a = (int)(Math.random()*10);
int b = (int)(Math.random()*10);
System.out.println(a);
System.out.println(b);
int c = a < b ? a : b;  //c에 a와 b 중 더 작은 값 대입
//a가 b보다 더 작은가? true -> c = a, false -> c = b
System.out.println(c);

 

★계산순서 : 소괄호 > 단항 > 이항 > 삼항 > 대입