연산자(Operators)
✒️ 2025-05-16 17:02 내용 수정
- 연산자 정보는 TCP School.com의 내용을 기반으로 정리하였다.
- 수업 내용(멘토씨리즈 자바, 학원강의)과 참고 자료로 자주 사용하거나 기억해둘 내용만 정리하였다.
주의사항
- 연산하는 데이터들의 타입이 다르면 연산 후 데이터 타입이 변한다.
byte 5 + byte 7 + byte 2 = int 14long 5 + int 7 + byte 2 = long 14int 5 + byte 7 + int 2 = int 14
- why? 사칙 연산할 때는 대상자들의 data type 이 중요하다
- 사칙연산 대상들의 data type 이 int 이하일 경우 결과의 data type 은 무조건 int 이다.
- int 이상인 대상이 있을 경우엔 대상들 중 제일 큰 type이 결과의 data type 이 된다.
- java의 기본 데이터 타입이 int 이기 때문에 연산 결과를 int 로 취급한다.
- 그러나 큰 data type 이 연산에 포함되거나, 소수점이 포함된 경우에는 해당 data type 을 따라간다.
- 물론 예외 사항도 존재하기 때문에 필요 시엔 확인해야 한다.
연산자 종류
| 종류 | 연산자 | 기능 |
|---|---|---|
| 최고연산자 | . () | 가장 먼저 연산 |
| 증감연산자 | ++, -- | 1씩 증감 |
| 산술연산자 | +, -, /, % | 사칙연산, 나머지연산 |
| 시프트연산 | >>, << | 비트의 이동 |
| 비교연산자 | >, < >=, <=, ==, != | 두 값의 비교 |
| 논리연산자 | &&, ||, !, ^ | 논리의 연산 |
| 비트연산자 | &, |, ~, ^ | 비트단위의 논리연산 |
| 대입연산자 | =, +=, -=, *=, /=, %=* | 우변의 값을 좌변에 대입 |
| 삼항연산자 | 조건식 ? A : B | 조건식의 결과에 따라 A(true)와 B(false)를 선택 |
| instanceof 연산자 | A instanceof B | 참조 변수가 참조하고 있는 인스턴스의 실제 타입 반환 |
-
시프트연산과 비트연산자는 사용빈도가 낮다(이진법, 복호화, 암호화에 사용)
-
Java 연산자 우선순위(Precedence)
| 우선순위 | 연산자 | 설명 |
|---|---|---|
| 1 | ()[]new.:: |
괄호 배열 접근 객체 생성 멤버 접근 메서드 참조 |
| 2 | ++-- |
단항 후위 증가 단항 후위 감소 |
| 3 | +-!~++-- |
단항 플러스 단항 마이너스 논리 NOT 비트 NOT 단항 전위 증가 단항 전위 감소 |
| 4 | (type) |
형변환 (캐스팅) |
| 5 | *, /, % |
곱셈, 나눗셈, 나머지 연산 |
| 6 | +, -+ |
덧셈, 뺄셈 문자열 연결 |
| 7 | <<, >>>>> |
비트 시프트 |
| 8 | <, <=>, >=instanceof |
관계 연산 타입 비교 (instanceof) |
| 9 | ==!= |
동등성 검사 |
| 10 | & |
비트 AND |
| 11 | ^ |
비트 XOR |
| 12 | | |
비트 OR |
| 13 | && |
논리 AND |
| 14 | || |
논리 OR |
| 15 | ?: |
삼항 조건 연산자 |
| 16 | =, +=, -=, *=/=, %=, &=, ^=|=, <<=, >>=>>>= |
대입 연산 |
| 17 | ->-> |
람다표현식 스위치 표현식 |
산술 연산자
- 기본적인 사칙 연산자
- 결합 방향 : 왼쪽 -> 오른쪽
| 산술 연산자 | 설명 |
|---|---|
| + | 덧셈 |
| - | 뺄셈 |
| * | 곱셈 |
| / | 나눗셈 후 몫을 반환 |
| % | 나눗셈 후 나머지를 반환 |
대입 연산자
- 변수(variable)에 값을 대입할 때 사용
- 결합 방향 : 오른쪽 -> 왼쪽
- 오른쪽의 결과 값을 왼쪽에 대입 하는 걸 잊지 말자.
- 왼쪽 데이터 타입 공간에 오른쪽 데이터 값을 넣는다!
| 대입 연산자 | 설명 |
|---|---|
| A = B | A에 B 대입 |
| A += B | A + B , 결과를 A에 대입 |
| A -= B | A - B , 결과를 A에 대입 |
| A *= B | A * B , 결과를 A에 대입 |
| A /= B | A / B , 결과를 A에 대입 |
| A %= B | A % B , 결과를 A에 대입 |
- 축약연산자(복합대입연산자)
a = a + 1;
a += 1; // 둘은 같은 역할을 한다.
int x = 10;
int y = 1;
y += x;
System.out.println("y += x : " + y);
y *= x;
System.out.println("y *= x : " + y);
y %= x;
System.out.println("y %= x : " + y);
y += x : 11
y *= x : 110
y %= x : 0
비교 연산자
- 변수나 상수 값을 비교하여 참과 거짓을 판별하는 연산자
- 항상 논리형 데이터(true, false)로 값을 반환한다.
- 항상 왼쪽에 있는 값을 기준으로 판단한다.
- 객체끼리
==으로 비교할 때는 값을 비교하는게 아니라 주소값을 비교하는 것이다.
| 비교연산자 | 설명 |
|---|---|
| A > B | A가 B보다 크다 |
| A < B | A가 B보다 작다 |
| A >= B | A가 B보다 크거나 같다 |
| A <= B | A가 B보다 작거나 같다 |
| A == B | A와 B가 같다 |
| A != B | A와 B가 다르다 |
int a = 10;
int b = 20;
boolean result;
result = a < b;
System.out.println("a < b : " + result);
result = a == b;
System.out.println("a == b : " + result);
result = a != b;
System.out.println("a != b : " + result);
a < b : true
a == b : false
a != b : true
증감 연산자
- 피연산자(연산을 받는 항)를 +1 혹은 -1 할 때 사용한다.
- 피연산자를 1개만 사용한다.
- 전위 증감 연산자는 연산을 먼저 진행하고, 후위 증감 연산자는 호출 등의 동작을 한 뒤에 연산을 진행한다.
| 증감 연산자 | 설명 |
|---|---|
| ++n | n 값을 1 증가시키고 연산 진행 호출 시 연산을 먼저 진행하고 호출함 |
| n++ | 연산 진행 후 n 값을 1 증가시킴 호출 시 호출을 먼저 한 뒤에 연산을 진행함 |
| --n | n 값을 1 감소시키고 연산 진행 호출 시 연산을 먼저 진행하고 호출함 |
| n-- | 연산 진행 후 n 값을 1 감소시킴 호출 시 호출을 먼저 한 뒤에 연산을 진행함 |
int a = 0;
int b = 4;
a = ++b; // b = 5, a = b = 5
System.out.println("a : "+ a + "b : " + b)
a : 5
b : 5
int a = 0;
int b = 4;
a = b++; // a = 4, b = 4 + 1 = 5
System.out.println("a : "+ a + "b : " + b)
a : 4
b : 5
- Resources/Java/기본 구성 요소/제어문/조건문#반복문에서 자주 사용한다
for (int i = 0; i < 10; i++) {
// i = 0 부터 for 이내의 연산을 시행하고
// i + 1 을 수행한 다음 다시 연산을 진행해서
// i = 9 가 될 때까지 연산을 반복한다
}
논리 연산자
- 논리식을 판단해서 true와 false를 결정한다.
| 논리 연산자 | 설명 |
|---|---|
| && | 논리 AND 연산. 논리식이 모두 true일 때 true 값을 반환 |
| || | 논리 OR 연산. 논리식 중 하나라도 true일 때 true 값을 반환 |
| ! | 논리 NOT 연산. 논리식 결과가 true일 때 false 값을, 결과가 false일 때 true 값을 반환 |
| ^ | 논리 XOR 연산, 두 항이 다르면 true, 같으면 false |
// && 연산자
int myAge = 30;
int limit = 35;
boolean result = (limit - myAge) >= 5 && myAge > 30;
System.out.println("result : " + result);
// || 연산자
int n1 = 10;
int n2 = 20;
boolean result2 = (n1+=10) > 20 || n2 -10 == 11;
System.out.println("result2 : " + result2);
//! 연산자
System.out.println("!result2 : " + !result2);
result : false
result2 : false
result3 : true
비트 연산자
- 사진 자료 : https://www.tcpschool.com/java/java_operator_bitwise
- 논리 연산자와 유사하지만 비트(2진수) 단위의 연산만 가능하다.
- 정수값을 비트(2진수)로 환산하여 각 자리 수를 비교하고, 결과값을 정수로 반환한다.
- 1 -> true, 0 -> false
- 비트(2진수)로는 음수를 표현할 수 없기 때문에, 비트의 맨 앞자리 수의 표현을 부호의 표현으로 쓴다.
- int는 4 byte = 32 bit이므로, 32 bit의 맨 앞자리의 bit가 부호의 표현이다.
- 0 -> 양수, 1 -> 음수
| 비트 연산자 | 설명 |
|---|---|
| & | 논리 AND 연산, 두 항이 모두 true일 때 true 값을 반환 |
| | | 논리 OR 연산, 두 항 중 하나라도 true일 때 true 값을 반환 |
| ^ | 논리 XOR 연산, 두 항이 다르면 true, 같으면 false |
| ~ | 논리 NOT 연산, 참을 거짓으로, 거짓을 참으로 체크. -(값+1)을 반환 |
// & 연산자
int a = 10; // 1010
int b = 7; // 0111
int c = a & b;
System.out.println("c : " + c);
// | 연산자
int a2 = 12; // 1100
int b2 = 8; // 1000
int c2 = a2 | b2;
System.out.println("c2 : " + c2);
// ^ 연산자
int a3 = 9; // 1001
int b3 = 11; // 1011
int c3 = a3 ^ b3;
System.out.println("c3 : " + c3);
// ~ 연산자
int x = 7;
System.out.println("~x : " + ~x);
c : 2
c2 : 12
c3 : 2
~x : -8
시프트 연산자
- 비트의 이동을 다룬다.
| 시프트 연산자 | 설명 |
|---|---|
| << | 비트를 왼쪽으로 이동 |
| >> | 비트를 오른쪽으로 이동 |
// 시프트 연산자
int i = 2; //0010
System.out.println("i << 2 : " + (i << 2));
System.out.println("i >> 2 : " + (i >> 2));
i << 2 : 8
i >> 2 : 0
예제
package exam02;
public class OperatorExam01 {
public static void main(String[] args) {
int num01 = 100;
byte byNum01 = 10;
long lyNum01 = 20;
double dyNum01 = 33.3333;
// byte 끼리 더했는데 결과는 int 로 나온다..
//byte byResult = byNum01 + byNum01;
int inResult01 = byNum01 + byNum01;
long longResult01 = lyNum01 + num01;
inResult01 = byNum01 + num01;
int target = 10;
System.out.println(target % 3); // % 는 나누기 후 몫을 출력한다
}
}
package exam02;
public class UpDownExam {
public static void main(String[] args) {
int num = 10;
int sum = 0;
sum = num++;
String str = ""; // String 의 빈 값
str = "sum = " + sum + ", num : " + num;
System.out.println(str);
sum = ++num;
System.out.println("sum = " + sum + ", num : " + num);
}
}
package exam02;
public class CompareExam {
public static void main(String[] args) {
int a = 10;
int b = 15;
int c = 12;
System.out.println(a >= b); // a가 b보다 크거나 같다.
System.out.println(a < b); // a가 b보다 작다.
System.out.println(c == b); // c와 b가 같다.
System.out.println(a != b); // a와 b가 같지 않다.
System.out.println("=============================");
//논리연산 &&(AND) ||(OR)
System.out.println( (a < b) && (b > c)); //a가 b보다 작고, b는 c보다 크다
System.out.println( (a > b) && (b > c)); //a가 b보다 크고, b는 c보다 크다
System.out.println( (a > b) || (b > c)); //a가 b보다 크거나, b는 c보다 크다
}
}