티스토리 뷰

Java

[JAVA] 연산자

TreeBomb 2023. 10. 16. 21:43

연산자란?

- 연산이랑 데이터를 처리하고 결과를 산출하는 작업
- 연산은 항(피연산자)과 연산자로 이루어짐
- 항은 연산에 사용되는 값을 의미하며, 연산자는 기호를 의미
- 항과 연산자를 이용해서 연산 과정을 나열한 것을 연산식 이라 함

연산자의 종류

종류 연산자 기능
최고연산자 ., () 가장 먼저 연산
증감연산자 ++, -- 1씩 증감시킴
산술연산자 +, -, *, /, % 사칙연산, 나머지연산(%)
시프트연산자 >>, << 비트의 이동
비교연산자 <, >, <=, >=, ==, != 두 값을 비교
논리연산자 &&, ||, ! 논리의 연산
비트연산자 &, |, !, ^ 비트단위의 논리연산
대입연산자 =, +=, -=, *=, /=, %= 우변의 값을 좌변에 대입
삼항연산자 조건식 ? A : B 조건식이 참 일때 A반환  거짓일 때 B반환

 

산술연산자

말 그대로 산술을 해주는 연산자이다.

자바에서 곱은 *, 나눗셈은 / 으로 표기하고 %는 나머지 연산자이다.

int n1,n2,n3;

n1 = 20;

n2 = 7;

n3 = n1 + n2;

System.out.println("n3 = " + n3);

 

n3 = n1 - n2;

System.out.println("n3 = " + n3);

 

n3 = n1 / n2; //몫을 반환한다.

System.out.println("n3 = " + n3);

 

n3 = n1 % n2; //나머지를 반환

System.out.println("n3 = " + n3);

n3 = 27

n3 = 13

n3 = 2

n3 = 6

나머지 연산은 수가 짝인지 아닌지를 판단하는데 자주 쓰인다.

2로 나눈 나머지가 0 이면 짝수 1이면 음수이다.

 

대입연산자

대입연산자는 좌변에 있는 값을 우변으로 대입을 해준 것이다.

//대입연산자

 

int n1 = 10;

int n2 = 7;

 

System.out.printf("=연산자 : n1 = %d, n2 = %d\n",n1,n2);

=연산자 : n1 = 10, n2 = 7

 

복합대입연산자

복합대입 연산자는 +=, -=, *=, /=, %= 5가지가 있다

n1 += n1 을 풀어쓰면 n1 = n1 + n1 으로 자기 자신에 연산한 결과를 대입하는 연산자이다.

int x = 10;

int y = 1;

 

y += x; // y = y + x; -> y = 1 + 10;

 

System.out.println("y = " + y);

 

y *= x; //y = y * x -> y = 11 * 10;

 

System.out.println("y = " + y);

 

y %= x; // y = y % x;

System.out.println("y = " + y);

y = 11

y = 110

y = 0

 

비교연산자

비교연산자는 관계연산자를 사이에 두고 값을 비교하여 boolean 자료형(true,false)으로 반환한다.

<, >, <=, >=, ==, != 으로 6가지가 있다 순서대로 작다, 크다, 작거나 같나, 크거나 같다, 같다, 같지 않다 이다.

int a =10;

int b = 20;

boolean result;

 

result = a < b;

System.out.println("a < b : " + result);

 

result = a == b; //a의 값이 b와 같냐?

System.out.println("a == b : " + result);

 

result = a != b; //a의 값이 b와 다르냐?

System.out.println("a != b : " + result);

a < b : true

a == b : false

a != b : true

기준은 왼쪽 값이 기준이다.

boolean 값으로 반환되는 연산자들은 외우는 것이 좋다.

 

논리연산자

논리연산자는 boolean형 데이터를 가지고만 연산을 진행할 수 있다.

논리연산자는 &&, ||, ! 로 3가지가 있고 순서대로 논리곱(AND), 논리합(OR), 부정(NOT)이다.

||(논리합) '|' 이 기호는 일반적인 키보드 기준 엔터키와 백스페이스 사이에 있는 키를 쉬프트를 누르고 치면 나온다.

결과(&&)
true true true
true false false
false true false
false false false

 

결과(||)
true true true
true false true
false true true
false false false

!(NOT)은 참을 거짓으로, 거짓을 참으로 바꾸는 연산식이다.

int my_age = 30;

int limit = 25;

boolean result;

//&& : 논리곱(AND) -> 앞 뒤 항이 모두 참이면 참, 아니면 거짓

result = (limit - my_age) >= 5 && my_age > 30;

System.out.println("&&연산자 : " + result);

// 참 && 참 = 참

// 참 && 거짓 = 거짓

// 거짓 && 참 = 거짓

// 거짓 && 거짓 = 거짓

 

//|| : 논리합(OR) -> 앞 뒤 항 중에 하나라도 참이면 참, 아니면 거짓이면 거짓

int n1 = 10;

int n2 = 20;

boolean result2 = (n1+=10) > 20 || n2 - 10 == 11;

System.out.println("||연산자 : " + result2);

// 참 || 참 = 참

// 참 || 거짓 = 참

// 거짓 || 참 = 참

// 거짓 || 거짓 = 거짓

 

//! : 부정(NOT) -> 참을 거짓으로, 거짓을 참으로 연산

System.out.println("!연산자 : " + !result2);

&&연산자 : false

||연산자 : false

!연산자 : true

 

비트연산자

비트연산자는 비트 단위로 연산을 하는 것이다. 논리연산자와 비슷하다.

0이 false, 1이 true이고 &, |, ^, ~ 4가지 순서대로 논리곱, 논리합, 배타적 논리합, 부정이다.

결과(&)
1 1 1
1 0 0
0 1 0
0 0 0

&(and) 결과표

결과(|)
1 1 1
1 0 1
0 1 1
0 0 0

|(OR) 결과표

결과(^)
1 1 0
1 0 1
0 1 1
0 0 0

~(NOT) 은 1을 0으로 0을 1로 바꾸는 연산식이다

int a = 10; //1010

int b = 7; //0111

 

int c = a & b; //0010

System.out.println("c : " + c);

 

int a2 = 12; //1100

int b2 = 8; //1000

int c2 = a2 | b2; //1100

System.out.println("c2 : " + c2);

 

int a3 = 9; //1001

int b3 = 11;//1011

int c3 = a3 ^ b3;//0010

System.out.println("c3 : " + c3);

 

int x = 7;

System.out.println("~x : " + ~x); // ~x = -(x + 1)

c : 2

c2 : 12

c3 : 2

~x : -8

마지막 ~(NOT)에 대한 값이 이상한 것을 확인할 수 있다.

2진수로 음수를 표현할 수 없기 때문에 비트의 맨 앞자리는 수의 표현이 아닌 부호의 표현으로 쓰기로 했다.

자료형 int는 32비트이다 7을 2진수로 표현하면

00000000 00000000 00000000 00000111이다. 여기서 맨 앞에 있는 0은 부호를 의미하고 ~(NOT)을 하게 되면

11111111 11111111 11111111 11111000인데 이러면 숫자가 많이 커져서 보수라는 것을 사용하는데 보수에 대한 개념은 아직 이해하지 못해서 간단하게 값을 찾을 수 있는 방법은 ~x는 -(X+1)이라고 생각하면 된다.

 

시프트연산자

시프트연산자는 비트를 이동시키는 연산자이다.

>>, << 두 개고 화살표 방향대로 << 왼쪽으로 >> 오른쪽으로 이동시킨다.

int i = 2; //0010

System.out.println("i << 2 : " + (i << 2)); //i를 왼쪽으로 두 칸 이동해라

System.out.println("i << 2 : " + (i >> 2)); //i를 오른쪽으로 두 칸 이동해라

i << 2 : 8

i << 2 : 0

2(0010)를 왼쪽으로 두 칸 이동하면 1000이되면서 10진수로 변경한 8이 출력이 된다.

오른쪽으로 두칸 이동하면 이동할 곳이 더 없으므로 사라지면서 0이 출력된다.

 

비트연산자와 시프트연산자는 암호화, 복호화 작업에 자주 쓰인다.

 

증감연산자

증감연산자는 값을 1씩 증감시키는 연산자이다.

++, --가 있다.

증감 연산자는 데이터의 앞에 붙는지 뒤에 붙는지에 따라 선행증감, 후행증감으로 나누어진다.

선행증감은 증감을 시키고 코드가 진행이 되고, 후행 증감은 코드가 진행된 후에 증감이 된다.

//선행증감

//변수의 앞에서 사용

int a = 10;

System.out.println("++a : " + ++a);

 

//후행증감

//변수의 뒤에서 사용

int b = 10;

System.out.println("b++ : " + b++);

System.out.println("b : " + b);

++a : 11

b++ : 10

b : 11

후행 증감이 이해가 잘 안 될 수도 있다. 아래에 있는 코드의 결과를 예상해 보자.

int x = 5;

int y = x++;

 

System.out.println("x : " + x);

System.out.println("y : " + y);

x : 5

y : 6

이라고 생각했으면 틀렸다

처음에 x에 5가 들어가고 y에 x++이 들어간다 x++은 후행 증감으로 y에 x의 값이 들어간 후 x를 1 증가시키므로

x : 6

y : 5

위와 가은 결과가 나온다

x : 6

y : 5

 

삼항연산자

삼항연산자는 조건식에 대한 값을 통해 데이터를 반환하는 연산자이다.

조건식은 기본적으로 boolean 자료형으로 반환이 돼야 한다.

상항연산자 : 조건식 ? 참일 때 반환할 값 : 거짓일 때 반환할 값;

int a = 10;

int b = 15;

 

boolean result = ++a >= b ? true : false;

System.out.println("result : " + result);

 

int n1 = 10;

int n2 = 20;

 

char result2 = (n1 + n2) == n2 ? 'O' : 'X';

System.out.println("result2 : " + result2);

result : false

result2 : X

이런 식으로 반환값의 자료형은 정해진 게 없다. 예시로 boolean과 char의 자료형을 썼지만 int나 String 같은 자료형들도 사용할 수 있다.

 

[JAVA] 제어문(if, switch)

제어문이란? 일반적으로 프로그램은 위에서 부터 아래로 순차적으로 실행이 된다. 순차적으로만 실행이 된다면 코드의 길이 매우 길어지거나 표현하기 어려운 상황이 발생할 수도 있다. 예를

treebomb-code.tistory.com

 

'Java' 카테고리의 다른 글

[JAVA] 제어문(for,while)  (0) 2023.11.28
[JAVA] 제어문(if, switch)  (0) 2023.10.24
[JAVA] 형 변환  (0) 2023.10.09
[Java] 변수  (0) 2023.10.02
[JAVA] 자바 출력문 print(), printf(), println()  (0) 2023.09.25