연산자
- 프로그래밍에서 계산을 하기 위해 수행되는 기호(연산의 대상이 되는 피연산자와 연산자의 조합)
- 수행되는 항에 따라서, 연산 기능에 따라서 종류가 나뉨
단항/이항/삼항
산술/논리/비트/관계(비교)/기타
항과 연산자
- 단항 연산자: 항이 1개
ex) num++
- 이항 연산자: 항이 2개
ex) 1 + 1
- 삼항 연산자: 항이 3개
ex) (3 > 1) ? : 1 : 0
삼항 연산자는 간단한 if-else 문을 더 간결하게 표현하는 방법이다.
public class TernaryOperatorExample {
public static void main(String[] args) {
int age = 20;
// 삼항 연산자를 사용하여 나이에 따라 메시지 결정
String message = (age >= 18) ? "성인" : "미성년자";
System.out.println(message); // 출력: 성인
}
}
대입 연산자, 부호 연산자
- 대입 연산자: 우측의 데이터를 좌측의 변수에 대입
- 부호 연산자: 부호를 나타내는 연산자
산술 연산자, 증가/감소 연산자
- 산술 연산자: +, -, *, /, %
- 증가/감소 연산자: ++, --
++num, --num (전위 증가, 감소 연산자): 변수의 값을 먼저 증가, 감소시킨 후에 그 값을 반환합니다.
num++, num-- (후위 증가, 감소 연산자): 변수의 현재 값을 반환한 후에 값을 증가, 감소시킵니다.
- 피연산자가 정수형인 경우, 나누는 수가 0이면 에러 발생
- 연산에 따라 결과값에서 값 손실이 발생할 수 있음
public class IncrementExample {
public static void main(String[] args) {
int num = 5;
// 전위 증가 연산자 사용
System.out.println(++num); // 출력: 6
// num의 값이 먼저 증가된 후에 그 값이 출력됩니다.
// 변수를 리셋
num = 5;
// 후위 증가 연산자 사용
System.out.println(num++); // 출력: 5
// num의 현재 값이 출력된 후에 증가됩니다.
// num의 현재 값 출력
System.out.println(num); // 출력: 6
// 위에서 후위 증가 연산자를 사용하여 증가시킨 결과
}
}
관계 연산자
- 두 항의 값 크기 비교
- 결과 값은 비교 결과에 따라 true 혹은 false
논리 연산자
- &&, ||, !
- 논리식에 대해 참 거짓 판단
- 결과 값은 판단 결과에 따라 true 혹은 false
복합 대입 연산자
- 대입 연산자와 다른 연산자를 조합한 연산
- 코드를 간결하게 작성할 때 사용
2진법
2진법
- 컴퓨터에서 데이터 표현에 사용한다.
- 2를 기반으로 하는 숫자 체계이다.
2의 보수
- 2의 제곱수에서 빼서 얻은 이진수
- 2진수 3의 2보수: 11 -> 01
2의 보수는 컴퓨터에서 음수를 표현하는 방법 중 하나이다.
2의 보수를 얻는 과정은 다음과 같다:
주어진 이진수의 모든 비트를 반전시킨다 (0을 1로, 1을 0으로).
반전된 이진수에 1을 더한다.
예를 들어, 5의 2의 보수를 구하는 방법을 살펴보자.
5의 이진 표현: 0101
비트 반전: 1010
1 더하기: 1011
따라서, 5의 2의 보수는 1011이다.
public class TwosComplementExample {
public static void main(String[] args) {
int num = 5;
int twosComplement = ~num + 1;
System.out.println(Integer.toBinaryString(num)); // 출력: 101
System.out.println(Integer.toBinaryString(twosComplement)); // 출력: 1011 (음수 이진 표현에서는 앞에 있는 0들이 생략되지 않고 1로 채워짐)
}
}
비트 연산자
- 비트 단위로 연산
- &, |, ...
비트 논리 연산자
- &, |, ^, ~
AND 연산자(&)
- 두 개의 비트 값이 모두 1인 경우에만 결과 1
- 0101 & 0011: 0001 --> 1
OR 연산자(|)
- 두 개의 비트 값 중 하나라도 1이면 결과 1
- 0101 | 0011: 0111 --> 7
XOR 연산자(^)
- 두 개의 비트 값이 같으면 0, 다르면 1
- 0101 ^ 0011: 0110 --> 6
반전 연산자(~)
- 비트 값이 0이면 1로, 1이면 0으로 반전
- ~0101: 1010 --> -6
비트 이동 연산자
<< 연산자
- 비트를 왼쪽으로 이동
- 3 << 1: 0011 << 1 --> 0110
>> 연산자
- 비트를 오른쪽으로 이동
- 3 >> 1: 0011 >> 1 --> 0001
>>> 연산자
- 비트를 오른쪽으로 이동(부호비트 상관없이 0으로 채움)
부호 없는 오른쪽 시프트 연산자(unsigned right shift operator)이다. 이 연산자는 피연산자의 모든 비트를 지정된 수만큼 오른쪽으로 이동시키며, 왼쪽 빈 비트는 0으로 채워진다.
public class UnsignedRightShiftExample {
public static void main(String[] args) {
int num = -5;
// -5의 이진 표현 출력 (32비트 시스템에서)
System.out.println(Integer.toBinaryString(num));
// 출력: 11111111111111111111111111111011
// 부호 없는 오른쪽 시프트 연산
int shifted = num >>> 1;
// 시프트된 값의 이진 표현 출력
System.out.println(Integer.toBinaryString(shifted));
// 출력: 01111111111111111111111111111101
// 시프트된 값 출력
System.out.println(shifted);
// 출력: 2147483645
}
}
기타 연산자
조건 연산자
- 특정 조건에 부합하는지 검사 후, 참 또는 거짓에 해당하는 값 반환
- 삼항 연산자에서 많이 사용
Instanceof
- 참조 변수의 타입이 같은지 비교
대입 연산자
- 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는 데 사용
- 값을 저장하는 대입 연산자(=) 와 연산 후 저장하는 복합 연산자(op=) 가 존재