노션으로 다시 돌아갔습니다 😅

Java 연산자 주의사항

by mignon25
오늘 배운 것을 나에게 설명해주기.

 

연산자 별거 아니라고 생각했는데 은근히 신경써야 할 부분이 많은 것 같다. 

시간 지나면 헷갈릴 것 같은 부분만 다시 적어본다. 

 

 

1. 연산자 우선순위

  • 산술 > 비교 > 논리 > 대입  => 대입이 가장 마지막에 수행된다!
  • 단항 > 이항 > 삼항

 

2. 산술 변환 규칙

  • 두 피연산자의 타입을 같게 일치시키는데, 보다 큰 타입으로 일치시킨다. 
    (그래서 chrt -> int 때는 결과 값에 아무 것도 안 붙여도 되고, int -> char 때는 (char) 를 붙였던 것..)
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.

 

3. 증감연산자의 전위형(prefix)/후위형(postfix) 

값이 참조되기 전에 증가시킨다든지(전위형), 값이 참조된 후에 증가시킨다든지(후위형) 설명은 봐도 사실 잘 와닿지 않는다. 

근데 그냥 보이는 대로 왼쪽에서 오른쪽으로 생각하면 편한 것 같다. 

  • j = ++i; (전위형)
    1. j = :  j에 어떤 값을 대입시킬 건데,
    2. ++ :  ++가 먼저 나옴. j = ++ 는 말이 안되니까
    3. j = (i+1); :  i 값에 1을 증가시킨 후에 j에 대입
  • j = i++; (후위형)
    1. j = :  j에 어떤 값을 대입시킬 건데,
    2. i :  i가 먼저 나오고 있으니까 
    3. j = i :  일단 j 에는 i  값을 대입해주고,
    4. i++; :  마지막에 i 값을 1 증가시키기.

 

4. 산술연산자

  • int 끼리  연산했을 때 연산결과도 int 라는 것!!!
    • 9 / 4 의 결과는 2.5가 아니라 2다. 
    • 반올림도 발생하지 않는다. 
    • 그러므로 실제 값을 반환받고 싶다면 피연산자 중 어느 한 쪽은 실수 타입으로 바꾸고 연산해야 한다. 
  • 연산 도중에도 중간결과 값이 자료형의 범위를 넘어서는 값이 발생하면 오버플로우가 발생 주의.
    => 연산 순서와 자료형의 타입 모두 유의해야 한다. 
  • 문자와 숫자를 더하는 리터럴 연산
char c1 = 'a';

char c2 = (char)(c1 + 1);
char c3 = 'a' + 1; // 'b'; 로 컴파일러가 미리 연산수행 후 저장
int i = 'a' + 1; // 98

c2연산의 경우 형변환이 필요하지만 c3은 리터럴 연산이기 때문에 형변환을 해주지 않아도 에러가 발생하지 않는다. 

 

5. 나머지 연산자 %

  • 음수도 나머지 연산할 수 있다. 부호는 무시되고 절대값으로 연산한 결과 리턴
  • 그냥 피연산자들 부호 모두 무시하고 나머지 연산한 결과에 왼쪽 피연산자 부호를 붙이면 된다. 

 

6. 문자열 비교 == , equals

  • 문자열 리터럴은 == 로 비교가 가능하다.
    (참조형이지만 내용이 같은 문자열 리터럴은 주소값을 공유한다)
  • 그러나 Sting 클래스로 생성한 인스턴스 문자열은 equals로 비교해야 한다.
    (각각 다른 인스턴스라 문자열 내용은 같을 수 있지만 주소값이 다르다)

 

7. 논리 연산자의 효율적인 연산 (short circuit evaluation)

  • OR 연산  ||  의 경우 왼쪽 피연산자가 참이라면 우측 피연산자는 평가하지 않는다. 
    • 그러므로 조금이라도 참일 가능성이 더 높은 조건식을 좌측에 놓으면 더 빠른 연산결과를 얻을 수 있다. 
  • AND 연산  &&  의 경우 왼쪽 피연산자가 거짓이라면 우측 피연산자는 평가하지 않는다. 
    • OR과 마찬가지 원리. 그러므로 좌측에 거짓일 가능성이 더 높은 조건식을 놓자. 

 

 

 

 

 

 

 

 

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기