자바는 위와 같은 연산자를 가지며 각 연산자 마다 우선순위가 상이하다
연산식은 반드시 하나의 값을 산출하며, 값 대신에 연산식을 사용할 수 있다
소스 코드 | int i = 0; ++i; | int i = 0; i = i + 1;; |
---|---|---|
바이트 코드 | iconst_0 istore_1[i] iinc 1 1[i] | iconst_0 istore_1[i] iinc 1 1[i] |
i=i+1 =연산자와 +연산자가 있기 때문에 두번의 연산이 필요하지만
++i은 한번의 연산만 수행하기 때문에 i=i+1보다 ++i의 연산속도가 빠르다고 생각한다
하지만 컴파일된 바이트코드를 비교해보면 같은 바이트 코드로 변환되는것을 알 수 있다
따라서 연산 속도의 차이는 없다
public class Self03_2_1 {
public static void main(String[] args) {
String str1 = "JDK" + 3 + 3.0;
String str2 = 3 + "JDK" + 3.0;
String str3 = 3 + 3.0 + "JDK";
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
> Task :Self03_2_1.main()
JDK33.0
3JDK3.0
6.0JDK
문자열과 숫자가 혼합된 +연산식은 왼쪽에서 오른쪽으로 연산이 진행된다
어떤 것이 먼저 연산되느냐에 따라 다른 결과가 나올 수 있다
연산식 | 설명 |
---|---|
x << y | 정수 x의 각 비트를 y만큼 왼쪽으로 이동(빈자리는 0으로 채워진다) |
x >> y | 정수 x의 각 비트를 y만큼 오른쪽으로 이동(빈자리는 정수a의 최상위 부호비트와 같은 값으로 채워진다) |
x >>> y | 정수 x의 각 비트를 y만큼 오른쪽으로 이동(빈자리는 0으로 채워진다) |
public class Self_03_2_3 {
public static void main(String[] args) {
System.out.println("2 << 3 = "+(2<<3));
System.out.println("16 >> 3 = "+(16>>3));
System.out.println("-16 >> 3 = "+(-16>>3));
System.out.println("-16 >>> 3 = "+(-16>>>3));
}
}
> Task :Self_03_2_3.main()
2 << 3 = 16
16 >> 3 = 2
-16 >> 3 = -2
-16 >>> 3 = 536870910
2 << 3
-16 >> 3
-16 >>> 3
삼항 연산자는 자바에서 유일하게 피연산자를 3개 가지는 조건 연산자이다
조건식 ? 반환값1 : 반환값2
? 앞의 조건식의 결과가 ture이면 반환값1을 반환하고 false이면 반환값2를 반환한다
instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 반환한다
인스턴스이름 instanceof 클래스또는인터페이스이름
public class Self_03_2_4 {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
System.out.println( parent instanceof Parent );
System.out.println( child instanceof Parent );
System.out.println( parent instanceof Child );
System.out.println( child instanceof Child );
}
}
class Parent{}
class Child extends Parent{}
> Task :Self_03_2_4.main()
true
true
false
true
기초부분이라 그냥 넘어가는 내용을 다시한번 짚어볼 수 있었다
특히 비트,시프트,삼항연산자를 늦지않게 지금 다시 볼 수 있어서 다행이다
3일차 시험 파이팅!