DDIT/Java

10.11 Java 연산자

검은참깨유과 2022. 10. 11. 20:07

1. 부호연산자

- 부호 연산자의 결과는 int타입으로 바뀐다 (!!!)

즉, byte 타입 변수 -> 부호 연산 -> int 타입 변환

예제1)
byte b = 100;

byte result = -b;  // <- 컴파일 에러 발생! byte = int 

//올바른 코딩
byte b = 100;
int result = -b;

byte b =100;
int result = (byte) -b; // 이것도 된다고 생각. 범위내이기도 하니까

 

2. 증감연산자(++, --)

i++ ++i
i-- --i

위 연산식의 차이를 처음 봤을 때는 이해 못했는데.. 피연산자의 값이 계산 수행 전에 바뀌거나 후에 바뀌는 것의 차이였다.

ex)  i = 1인 경우

(1) i++

result = i + 1 -> 1 + 1 // 결과 : 2

( 계산후 i연산자가 +1이 되어 i = 2 / 즉 이후 i가 사용되는 식에서는 2로 들어가는 것.)

(2) ++i

result2 = i + 1 -> 2 + 1  // 결과 : 3

(i연산자에 +1이 계산 전에 이미 적용된 경우 / 즉 계산식에 바로 적용)

 

즉 답이 다르게 도출 되는 것이다. 

선생님께서 연산CPU와 저장RAM이 달라서 위와 같이 적용이 된다고 알려주셨다.

 

 

3. 산술연산자(_,-,*,/,%)

- 피연산자들이 byte, short, char 타입인 경우 -> 모두 int 타입으로 변환된 후에 연산 수행 

- 피연산자들이 모두 정수타입 + long 타입포함 -> 모두 long 타입으로 변환된 후에 연산 수행

- 피연산자 중 실수타입(float, double)이 있을 경우, 허용 범위 큰 실수 타입으로 변환된 후에 연산 수행

byte byte1 = 1;
byte byte2 = 2;
byte byte3 = byte1 + byte2; // <- 오류 발생. byte+byte 는 int로 변환되므로 수정요.
int result3 = byte1 + byte2;
(또는 byte result3 = (byte) (byte1 + byte2);

 

4. char 타입 산술 연산

- char 타입도 정수라서 산술 연산 가능

- but int타입으로 변환연산됨!!!! 

char c1 = 'A' + 1;  
char c2 = 'A'; 
char c3 = c2 + 1; << 오류발생. 비슷하게 생긴 c1은 오류가 없는데 왜일까? 

char c1 = 'A'+1; 은 리터럴 끼리의 연산으로, 유니코드 A의 숫자 65 + 1 = 66이 된다. 결과는 같아도 타입변환X
char c3 = c2 + 1; 은 c2(변수) + 정수를 더하는 것이라 c2가 int타입인 65(int) + 1 = 66(int)이 된다.

즉, char c3 = (char) (c2 + 1);으로 강제변환(int->char)을 해야 char인 변수에 맞출 수 있다.

 

5. 비교연산자

- 비교 연산자도 연산 수행 전에 피연산자의 타입을 일치시킴

'A' == 65 -> 65 == 65 -> True
3 == 3.0 -> 3.0 == 3.0 -> True
큰 타입으로 변환된다.

한 가지 예외 
0.1 == 0.1f -> false
원래라면 실수 기본 타입인 0.1(double)로 자동변환 되어서 0.1(더블) == 0.1(더블) -> true여야 하겠지만.. false.
0.1f는 0.1의 근사값으로 표현되기 때문에 실수 저장방식이 0.1을 정확히 표현할 수 없다.

해결방법)
(float) 0.1 == 0.1f;

 

6. String 변수 비교

- String은 클래스 참조타입.

- 문자비교는 o 문자열 비교는 x

(참조타입 특성으로 같은 String a = "A"와 String b = "A" 에서도  A의 고유주소가 다르다.)

- String은 equals() 메소드를 사용한다.

String strVar1 = "사과";
String strVar2 = "사과";
System.out.println(strVal1.equals(strVal2)); //true
System.out.println(!strVar1.equals(strVal2)); // false

 

7. 논리연산자(&&, ||, &, |,^,!)

&& (AND) &
|| (OR) |

- 차이점 : &&나 || 같은 경우는 앞의 피연산자에서 나온 값만으로 바로 산출되는 경우 뒤의 피연산자를 굳이 계산X

                &나 | 같은 경우는 앞의 피연산자에서 답이 산출되더라도 뒤의 피연산자까지 꼭 본다.

즉, &&나 ||가 더 효율적으로 작동한다고 볼 수 있다. (이게 쌓이면 컴퓨터 연산에 영향을 준다고 한다.)

- 주로 흐름 제어문인 조건문(if), 반복문(for, while) 등에서 이용.

 

8. 대입연산자(=,+=,-=,*=,/=,%=)

- 아직 생소하게 보이는 연산자..

int StudentScore = 0;
StudentScore = StudentScore + 1;
StudentScore += 1; // 바로 위와 같은 식인데, 이렇게 간략하게 표현 가능하다고 한다. 

'DDIT > Java' 카테고리의 다른 글

Java) Random 메소드 사용  (1) 2022.10.13
Java 문자열 비교  (0) 2022.10.12
Q.printf 형식문자열 생략가능 여부?  (1) 2022.10.08
Q.문자->숫자 변환 오류 왜일까?  (1) 2022.10.06
Day2. Character, String 개념  (0) 2022.10.05