Java 연산자

김재영·2022년 11월 8일
0

항해99 Pre_Onboarding

목록 보기
2/5

2일차

챕터3 - 연산자

연산자의 우선순위

  • 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다
  • 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다
  • 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽으로 한다
  • 괄호 ()로 감싼 연산이 최우선순위를 갖기 때문에 연산순서를 정하고 싶을때는 사용한다

자바는 위와 같은 연산자를 가지며 각 연산자 마다 우선순위가 상이하다
연산식은 반드시 하나의 값을 산출하며, 값 대신에 연산식을 사용할 수 있다

증감 연산자의 연산속도

소스 코드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

문자열과 숫자가 혼합된 +연산식은 왼쪽에서 오른쪽으로 연산이 진행된다

  • str1
    "JDK" + 3 이 먼저 연산되어 "JDK3" 이라는 문자열이 되고, 이것을 다시 3.0과 연산하여
    "JDK33.0"이라는 문자열 결과가 나온다
  • str2
    3 + "JDK"가 먼저 연산되어 "3JDK"의 문자열이 되고, 다시 3.0과 연산하여
    "3JDK3.0"이라는 문자열 결과가 나온다
  • str3
    3 + 3.0이 먼저 연산되어 6.0이라는 실수값이 되고 이것을 "JDK"와 연산하여
    "6.0JDK"이라는 문자열 결과가 나온다

어떤 것이 먼저 연산되느냐에 따라 다른 결과가 나올 수 있다

논리연산자

AND(논리곱)

  • &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false를 낸다
  • &는 두 피연산자 모두를 평가해서 산출 결과를 낸다
    → 따라서 &보다는 &&가 더 효율적으로 동작한다

OR(논리합)

  • ||는 앞의 피연산자가 true라면 뒤의 피연산자를 평가하지 않고 바로 true를 낸다
  • |는 두 피연산자를 모두 평가해서 산출 결과를 낸다
    → 따라서 |보다는 ||가 더 효율적으로 동작한다

비트연산자

  • 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다

  • 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며
    두 비트가 모두 0일 때만 0을 반환한다

  • 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환합니다

  • 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환합니다

시프트(Shift) 연산자

연산식설명
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

  • 2를 32비트로 분해한 후 왼쪽으로 3비트를 이동
  • 이동시 왼쪽 3비트는 밀려서 버려진다
  • 맨 오른쪽에는 0으로 채워진다

-16 >> 3

  • 16을 32비트로 분해한 후 오른쪽으로 3비트를 이동
  • 이동시 맨 오른쪽 3비트는 밀려서 버려진다
  • 맨 왼쪽에는 최상위 부호비트와 같은 1로 채워진다

-16 >>> 3

  • 16을 32비트로 분해한 후 오른쪽으로 3비트를 이동
  • 이동시 맨 오른쪽 3비트는 밀려서 버려진다
  • 맨 왼쪽에는 최상위 부호비트와 관계없이 무조건 0으로 채워진다

삼항연산자

삼항 연산자는 자바에서 유일하게 피연산자를 3개 가지는 조건 연산자이다

조건식 ? 반환값1 : 반환값2

? 앞의 조건식의 결과가 ture이면 반환값1을 반환하고 false이면 반환값2를 반환한다

instanceof 연산자

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
  • parent는 Parent클래스 이므로 true를 반환한다
  • child는 Parent를 상속받은 Child클래스 이므로 true를 반환한다
  • parent는 Parent클래스 이지만 Child로 비교하니 false를 반환한다
  • child는 Child클래스 이므로 true를 반환한다

후기

기초부분이라 그냥 넘어가는 내용을 다시한번 짚어볼 수 있었다
특히 비트,시프트,삼항연산자를 늦지않게 지금 다시 볼 수 있어서 다행이다

3일차 시험 파이팅!

profile
Kickoff 22-10-19

0개의 댓글