Java 연산자 주의사항
by mignon25오늘 배운 것을 나에게 설명해주기.
연산자 별거 아니라고 생각했는데 은근히 신경써야 할 부분이 많은 것 같다.
시간 지나면 헷갈릴 것 같은 부분만 다시 적어본다.
1. 연산자 우선순위
- 산술 > 비교 > 논리 > 대입 => 대입이 가장 마지막에 수행된다!
- 단항 > 이항 > 삼항
2. 산술 변환 규칙
- 두 피연산자의 타입을 같게 일치시키는데, 보다 큰 타입으로 일치시킨다.
(그래서 chrt -> int 때는 결과 값에 아무 것도 안 붙여도 되고, int -> char 때는 (char) 를 붙였던 것..) - 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
3. 증감연산자의 전위형(prefix)/후위형(postfix)
값이 참조되기 전에 증가시킨다든지(전위형), 값이 참조된 후에 증가시킨다든지(후위형) 설명은 봐도 사실 잘 와닿지 않는다.
근데 그냥 보이는 대로 왼쪽에서 오른쪽으로 생각하면 편한 것 같다.
- j = ++i; (전위형)
- j = : j에 어떤 값을 대입시킬 건데,
- ++ : ++가 먼저 나옴. j = ++ 는 말이 안되니까
- j = (i+1); : i 값에 1을 증가시킨 후에 j에 대입
- j = i++; (후위형)
- j = : j에 어떤 값을 대입시킬 건데,
- i : i가 먼저 나오고 있으니까
- j = i : 일단 j 에는 i 값을 대입해주고,
- 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과 마찬가지 원리. 그러므로 좌측에 거짓일 가능성이 더 높은 조건식을 놓자.
'Java' 카테고리의 다른 글
| 객체지향 프로그래밍 공부를 시작하며... (0) | 2023.02.21 |
|---|---|
| 배열을 복사하는 방법들 (0) | 2023.02.20 |
| 연산자 우선순위와 비트 연산자 (0) | 2023.02.18 |
| 데이터의 저장과 변수 (0) | 2023.02.17 |
| String, StringBuffer, StringBuilder 비교 및 사용법 (0) | 2023.02.17 |
블로그의 정보
Mignon'S Dev Log
mignon25