JAVA/JAVA Basic

[Java] 연산자 정리하기

IT록흐 2020. 11. 21. 22:19
반응형

부호 연산자

 

기능 1 : 실수 리터럴 앞에서 양수, 음수 표현

기능 2 : 변수 앞에서 부호 유지(+), 변환(-) 표현

 

int result2 = -x;

 

x 변수의 부호가 양수이면 음수로, 음수이면 양수로 변환한다.

부호 연산 시, 자료형 타입은 int로 바뀐다.

short result2 = -x; (컴파일 오류)

 

증감 연산자

 

++, -- 증감 연산자가 i = i + 1보다 빠르다는 통념이 있으나 틀린 말이다.

실제 컴파일을 하면 동일한 바이트 코드가 생성된다.

 

논리부정 연산자

 

논리부정연산자(!)falsetruetruefalse로 변경하는 토글 기능 구현에 사용된다.

play = false;

play = !play;

 

비트반전연산자(~)

 

정수타입의 피연산자에만 사용된다. 비트갑을 0->1, 1->0으로 반전한다. 최상위 부호비트까지 반전되기에 부호도 반대가 된다. 산출되는 타입은 int이므로 변수에 저장시 유의해야한다.

 

비트반전연산자를 이용하면 부호가 반대인 정수를 구할 수 있다.

 

int v2 = ~v1 + 1;

 

반전후 1을 더하면 부호가 반대인 정수를 구할 수 있다.

 

Integet.toBinaryString(value) => 정수를 32비트의 2진 문자열로 리턴하는 메소드

 

산술연산자

1) 산술 연산 시, 타입결정

 

산술연산자는 두 개의 피연산자의 타입이 서로 다르면

둘 중 큰 타입의 연산자로 크기를 맞춘 후, 연산을 진행 한다.

 

int + double -> double + double = double

 

산술 연산자 정수 타입은 long 제외한 모두 int로 산출된다. 

byte, short 타입이 연산되면 int가 된다. 결과를 byte, short 변수에 저장하면 컴파일 오류다.

 

char 타입을 산술연산하면 int형이 된다.

 

char c3 = c2 +; (컴파일 에러)

char c3 = (char)(c2+1);

 

2) 오버플로우 탐지

 

산술 연산 사용자에게 입력받아 처리하는 경우가 많다. 그러므로 연산시 오버플로우가 발생하는지, 메소드를 만들어 확인해주어야 한다.

 

3) 정확한 연산은 정수타입

 

정확한 계산을 위해서는 정수 타입을 사용한다.

 

부동소수점 타입은 이진 포맷의 가수를 사용하기에 0.1을 정확히 표현할 수 없어 근사치로 처리한다. 그러므로 연산시 정수를 사용해야 정확한 값을 구할 수 있다.

 

4) NaNInfinity 연산

 

정수 타입의 경우, 0으로 나누면 ArithmeticException이 발생한다.

하지만 실수 타입의 경우, 0/0으로 나누면 예외가 발생하지 않는다.

 

/% 연산자를 사용하면 연산의 결과가 Infinity (무한대) or NaN(Not a Number)이 나올 수 있다.

 

5 / 0.0 -> infinity

5 % 0.0 -> NaN

 

이 경우 예외처리가 발생하지 않아, 연산이 계속되는데 어떤 연산을 하든 infinityNaN이 나온다. 그러므로 데이터 산출이 엉망이된다. Double.isInfinite()Double.isNaN() 메소드를 이용하면 infinityNaN의 경우를 골라 낼 수 있다.(true값을 리턴)

 

부동소수점을 입력받을 때는 반드시 NaN 검사를 해야한다.

 

문자열을 입력 받을 때, “NaN”을 사용자로부터 입력받고 이를 Double.valueOf() 메소드에 의해 DOUBLE 타입으로 변환되면 NaN이 된다. 문제는 NaN이 산술 연산이 가능하다는 점이다. 그러므로 문자열을 입력받고 입력받은 문자열이 부동소수점과 연관있다면 NaN 검사를 반드시 실시해야한다.

 

Double.isNaN() 메소드를 이용하여 NaN 검사를 실시해야한다. == 와 같은 연산자는 NaN과 만나면 반드시 false를 리턴하기 때문이다.

 

 

비교 연산자

 

1) 정수와 실수의 비교

 

이진포맷의 가수를 사용하는 모든 부동소수점 타입은 0.1을 정확히 표현할수가 없어서 근사값으로 표현되어  0.1보다 큰값을 나타낸다. 

 

0.1 실수리터럴 과 0.1f는 서로 다른 값이다.

 

(float)0.1 == 0.1f

(int)(0.1*10) == (int)(0.1f*10) 

 

캐스팅하여 타입을 맞추어 준다.

 

2) 문자열의 비교

 

문자열은 대소를 비교할 수는 없으나 ==, != 동등 연산은 가능하다.

 

동등의 주체는 힙영역에 생성된 객체이다.

String 타입의 변수는 String 객체를 참조하도록 되어있다.

 

String str1 = "Java";

String str2 = "Java";

String str3 = new String("Java")

 

자바는 문자열 리터럴이 동일하면 같은 객체로 본다.

만약 new를 통해 새로운 객체를 만들면 문자열 리터럴 객체와는 다른 객체가 된다.

 

str1 == str2

str1 != str3

 

논리 연산자

 

&&, & : 하나라도 false면 false

(&&는 앞 피연산자가 false이면 두 번째는 check하지 않고 false결과를 낸다, 효율적)

 

|| , |  : 하나라도 true면 true

(||는 앞 피연산자가 true이면 두 번째는 check하지 않고 true 결과를 낸다, 효율적)

 

^ : 두개의 피연산자가 서로 다르면 true

 

! : 토글

 

 

비트 연산자

 

비트로 표현이 가능한 정수만 가능, 연산 후 산출 타입은 int이다.

 

비트 논리 연산자 : &, |, ^, ~

비트 이동 연산자 : <<, >>, >>>

 

대입연산자

 

a = b = c = 5;

 

우측부터 순서대로 연산이 진행된다.

 

삼항연산자

 

조건식 ? 값 또는 연산식 : 값 또는 연산식

(operand1) (피연산자2)    (피연산자3)

                  (true)             (false)

 

 

실행흐름을 변경할 때, if문을 사용하기 보다 한줄로 간단히 표현하려면 삼항연산자를 사용하는 것이 좋다.

 

   

 

 

 

 

 

 

 

 

반응형