JAVA 연산자, Instance Of
1. 연산자의 종류와 우선 순위
① 피 연산자의 개수에 따른 연산자의 종류
- 단항연산자 : 피 연산자가 1개인 연산자
- 이항 연산자 : 피 연산자가 2개인 연산자
- 삼항 연산자 : 피 연산자가 3개인 연산자
※참고 : 피 연산자란 연산에 참여하는 변수나 상수
② 용도에 따른 연산자 우선 순위
종류 | 연산자 |
최우선 | ( ), [ ] |
단항 연산자 | ++, --, +, -, (type), !, ~ |
산술 연산자 | %, /, *, +, - |
시프트 연산자 | >>, <<, >>> |
관계 연산자 | <, <=, >, >=, ==, != |
논리 연산자 | &, ^, |, ~, &&, || |
삼항 연산자 | ? : |
대입 연산자 | =, +=, -=, *=, %=, /=, >>=, <<= |
콤마 연산자 | , |
③ 최우선 연산자
- ( ) : 우선순위 변경을 위해사용
- [ ] : 배열의 크기나 첨자를 나타낼 때 사용
④ 단항(Unary) 연산자
- ~ : 1의 보수를 구해주는 연산자.
- 양수의 1의 보수의 부호는 음수가 되고 절대값 1증가
- 음수의 1의 보수의 부호는 양수가 되고 절대값 1감소
- ! : NOT(true -> false, false -> true)
- 부호 +, - : '+'는 형식적으로 제공, '-'는 2의보수 연산자 or 부호바꿈연산자
- 증감연산자 ++, -- : 일반적으로 단항연산자는 피 연산자의 왼쪽에 위치하지만 증감연산자는 왼쪽, 오른쪽 둘다 가능.
- ++ : 피 연산자 1증가
- -- : 피 연산자 1감소
- 증감연산자의 위치에 따라 연산결과가 달라질 수 있습니다.
⑤ 산술연산자
- (+, -, *, /), 나머지 연산자( % )는 두 개의 피연산자를 가지는 이항연산자이며 산술 연산자는 피 연산자의 크기가 4byte보다 작으면 4byte(int형)로 변환한 다음에 연산을 수행
- 연산하기 전에 데이터형 일치시키기 (둘 중 더 큰 자료형으로)
- 정수와 정수 나눗셈시 정수로 나와야 하므로 소수는 버려지고 정수만 출력 된다.
⑥ Shift 연산자 (<< , >> , >>>)
- 정수형데이터에서만 사용가능하고 2진수로 표현했을때 각 자리를 오른쪽 또는 왼쪽으로 이동
- 오른쪽으로 n비트 이동하면 피연산자를 2의 n승으로 나눈 것과 같은 결과이다.
- '<<' 연산자의 경우, 피연산자의 부호에 상관없이 자리를 왼쪽으로 이동시킵니다.
- '>>' 연산자는 음수인 경우 부호를 유지시켜주기 위해서 빈자리를 1로 채웁니다.
- '>>>' 연산자는 부호에 상관없이 항상 0으로 빈자리를 채워줍니다.
⑦ 관계 연산자
- 이항 연산자로 피 연산자의 크기를 비교하는 연산자
- 연산의 결과는 true or false
- <, >, <=, >= : 두 피 연산자의 크기를 비교(boolean형을 제외한 나머지 자료형 사용가능)
- ==, != : 두 피연산자의 값이 같은지 비교
⑧ 논리 연산자
- 논리연산자는 이항 연산자로 조건의 참, 거짓을 비교하는 조건 논리 연산자와 비트 논리 연산자로 나뉜다
- 조건 논리 연산자 ( ||, && ) : boolean형의 값을 결과로 하는 조건식만 허용 (조건문, 반복문에서 많이 사용된다.)
- '||'은 OR 결합이고 '&&'은 AND결합이다.
- 비트 논리 연산자 ( |, &, ^, ~) : 피연사자끼리 이진 비트 연산을 수행해서 결과를 정수로 반환하는 연산자( 정수형만 사용가능)
- '|'은 OR연산자, '&'은 AND연산자, '^'은 XOR연산자, '~'은 NOT연산자이다.
- AND, OR, XOR진리표
a | b | AND | OR | XOR |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
⑨ 삼항연산자
- 삼항 연산자는 조건 연산자라고도 하며 3개의 피연산자를 필요로 하게 되는데 첫 번째 피연산자는 조건이며 두 번째 피연산자는 조건이 true일 때 반환 값 세 번째 피연산자는 조건이 false일 때 반환 값입니다.
- 기본형식 : 조건식? 식1:식2
⑩ 대입연산자
- 대입 연산자는 변수에 값 또는 수식의 연산결과를 저장하는데 사용됩니다.
- EX) x = y = 3일때 y = 3이 진행후 x= y가 수행된다.
- 대입연사자는 다른연산자와 결합하여 사용할 수 있다.
EX) i = i + 3 ---------------> i += 3
2. Instance Of
instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용하는 연산자입니다.
instanceOf를 어떻게 사용하고, 어떻게 동작하는지 알아보겠습니다.
Syntax
Syntax는 다음과 같습니다. object가 type이거나 type을 상속받는 클래스라면 true를 리턴합니다. 그렇지 않으면 false를 리턴합니다.
object instanceOf type
instanceOf 예제
간단히 표현하면 ArrayList와 List 클래스의 구조는 다음과 같습니다.
public class ArrayList<E> implements List {
}
public List {
}
아래와 같이 ArrayList 객체가 있을 때, instanceOf를 사용하면 이 객체가 ArrayList인지, List로부터 상속받은 클래스의 객체인지 확인할 수 있습니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
Output:
true
true
하지만 다음과 같이 Set의 클래스인지 확인해보면 false를 리턴하게 됩니다. ArrayList는 Set도 아니고, Set를 상속하지도 않기 때문입니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof Set);
Output:
false
Object에 대한 instanceOf
모든 클래스는 Object를 상속하기 때문에 object instanceOf Object는 항상 true를 리턴합니다.
ArrayList list = new ArrayList();
System.out.println(list instanceof Object);
Output:
true
null 객체에 대한 instanceOf
object가 null이라면 instanceOf는 항상 false를 리턴합니다.
ArrayList list = null;
System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
System.out.println(list instanceof Set);
Output:
false
false
false
false
Generics의 instanceOf
ArrayList<String>처럼 Generic으로 생성된 객체도 동일하게 instanceOf로 타입을 체크할 수 있습니다.
ArrayList<String> list = new ArrayList<>();
System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
Output:
true
true
true
false
하지만 Generic 클래스 내에서 T와 같은, 타입이 결정되지 않은 상태에서 instanceOf로 타입 체크는 할 수 없습니다. T는 컴파일 과정에서 실제 타입으로 변경되기 때문입니다.
public <T> void printListItem(List<T> list) {
if (T instanceof String) {
for (T item : list) {
System.out.println(item);
}
}
}
위 코드는 다음과 같은 컴파일 에러가 발생합니다.
Error:(41, 13) java: cannot find symbol
symbol: variable T
location: class example.InstanceOf
다음과 같이 List<T>의 타입을 확인하는 것도 컴파일 에러가 발생합니다.
public <T> void printListItem(List<T> list) {
if (list instanceof List<String>) {
for (T item : list) {
System.out.println(item);
}
}
}
Error:(41, 33) java: illegal generic type for instanceof