본문 바로가기
백엔드/JAVA

JAVA 연산자에 대해

by SoonJae lee 2023. 3. 9.

부호/증감 연산자

지금까지 배웠던 JS와 달리 JAVA에서는 증감연산자의 위치에 따라 결과가 다르다는걸 알게 되었는데

for문에서 자주 사용했던 i++ 같은 코드가 모두 실행되면 현재 i에서 하나를 증가시킨다의 의미로 알고 있었는데

JAVA에서도 I++은 동일 했지만 ++i 같은 경우 코드를 실행하기 전에 i의 수를 먼저 증가 시키고 코드를 실행하는 의미로 사용된다고 한다.

쉽게 설명하면 앞에 연산자가 존재한다면 연산을 먼저 실행하고 뒤에 존재한다면 모든 코드가 실행되고 나서 연산을 실행한다.

뭔가 쉽다고 생각하고 결과값을 먼저 생각한 후 예제코드를 실행했지만 내 생각과는 다르게 결과값이 나와 살짝 햇갈렸지만 집중하고 살펴보니 생각보다 어렵지 않은 문제였다.

int a = 10;
int b = 10;
int c = 0;

a++;
++a;
System.out.println("a = " + a);

System.out.println("----------------");
y--;
--y;
System.out.println("y = " + y);

System.out.println("----------------");
c = a++;
System.out.println("c = " + c);  
System.out.println("a = " + a);   

System.out.println("----------------");
c = ++a;
System.out.println("c = " + c);
System.out.println("a = " + a);

c =  a++ 의 코드를 보면 a++은 연산이 끝난후 a의 값을 하나 증가시키기 때문에 c에 위에서 실행되었단 결과값인 12를 할당하고 c의 값을 화면에 보여주는 코드에서는 12의 값이 보여지지만 밑에 a를 호출할때는 연산이 끝나고 난후 a의 값을 호출하기 때문에 기존에 12의 값에서 1을 더한 13의 결과값이 화면에 보여지게 된다.

 

그 밑에  c = ++a 의 코드는 위에서 실행되었던 a의 값인 13에서 1을 더한 14의 값이 c에 할당이되서 c의 결과값은 14이고

a 또한 마찬가지로 이미 연산이 먼저 실행되는 ++a 이므로 c와 같은 14의 값이 결과값으로 할당이 된다.

 

산술연잔자의 경우 연산의 경우 다른부분은 별로 없었지만 중요하다고 생각한 내용은 3가지인데

피연산자가 정수타입(byte, short, char, int)이면 결과값은 int타입이다
피연산자가 정수티입이고 그 중에 하나가 long 타입이면 결과값은 long타입이다.
피연산자 중 하나가 실수타입이면 연산의 결과값은 실수타입이다.

산술 연산자에서 주의해야할 점은 위의 3가지만 조심하면 될것같다.

 

오버플로우/ 언더플로우

JAVA를 공부하면서 조금은 생소한 개념을 다루고 있는데 오버플로우와 언더플로우 라는 개념을 다루고 있다.

오버플로우란 타입이 허용하는 최대값을 벗어나는 것을 말하고

언더플로우는 오버플로우의 반대로 타입이 허용하는 최소값을 벗어나는 것을 말한다.

정수타입 연산에서 오버플로우나 언더플로우가 발생하면 실행오류가 나는것 같았지만 오류가 발생하는것이 아니라

각 타입의 최소값과 최대값이 벗어나면 각각 반대의 끝의 값으로 돌아서 시작한다.

byte 타입의 허용범위는 -128 ~ 127 인데 만약 내가 byte 타입으로 연산을 실행하고 그 결과값이 130이라면 최대 허용범위인 127이후 128이 오는게 아니라 최소값의 끝인 -128부터 시작해 -126이 결과로 보여진다.

 

위에서 다룬 증감연산자로 byte타입의 최대 허용범위에서 하나를 더한다면

결과로는 -128이 결과로 나오는 것을 볼수있는데 

byte over = 127;
over++;
System.out.println(over);

이러한 값들은 개발자가 원하는 결과가 아니므로 항상 허용범위를 생각하며 코딩을 해야한다고 한다.

연산과정에서 오브플로우나 언더플로우가 발생한다면 더 많은 허용범위를 가진 타읍으로 실행해야 한다.

 

NaN, Infinity 처리

JS를 배울때 항상 조심하라고 배운 NaN과 Infinity를 처리하는 방법을 JAVA에서 해결하는 방법을 배웠는데

산술연산자중 나눗셈(/)과 나머지(%)를 구하는 연산에서 발생하는데 간단하게 코드로 표현하면

int a = 13;
int b = 0;
int result = 13 / 0;

위의 코드를 보면 나눗셈에 피연산자가 0일 경우 무한대의 값이 발생해 예외가 발생한다. 정수로는 무한대의 값을 표현할수 없기 때문인데 만약 0이 실수인 0.0이나 0.0f이면 예외(ArithmeticException)가 발생하지않고 결과값으로 Infinity 또는 NaN이 된다.

 

만약 Infinity 나 NaN이 결과로 나오게 된다면 이후 연산을 실행하면 안되는데 그 이유는 연산을 실행하더라도 결과값은 계속 Infinity 또는 NaN이 되므로 나눗셈과 나머지 연산을 실행할 경우 항상 Infinity, NaN 인지 확인한 후 연산을 수행해야한다.

확인하기 위해서는 Double.inInfinite(), Double.isNaN() 이라는 코드를 실행해서 해당연산의 결과가 Infinity인지 NaN일 경우에는 true 아니라면 false의 결과가 나오므로 항상 주의하면서 / 와 %의 연산을 행해야한다.

 

비교 연산자

내가 알고있던 비교연산자 ==, !=와 크기를 비교하는 <, <=, >= 는 조건문이나 반복문에서 많이 사용하는데

다른 연산자들의 사용방법은 동일했지만 문자열을 비교할 때에는 동등연산자인 ==, != 연산자를 사용하는 것보다

equals()나 !equals()를 사용하라고 하는데 이건 좀더 다양한 강의를 보면서 현직에서 사용하는 방법을 알고나서 사용하는 것이 좋아보인다.

일단 비교연산을 할 경우 지금배운 equals를 사용하는 것으로 가닥을 잡았다.

 

삼항(조건) 연산자

JS를 공부하면서 제일 어렵다고 느꼇던 연산자인데 JAVA에서 다시한번 공부하면서 이 삼항이 왜 삼항인지 어떤 방식으로 작동하는지 확실하게 집고 넘어 갈 수 있었다.

먼저 삼항연산자에서 삼항은 (피연산자 ? 피연산자 : 피연산자) 이렇게 총 3개의 피연산자를 가지기 때문에 삼항이라고 칭하며 ? 앞에 피연산자는 boolean변수 또는 조건식이 온다고 한다.

JS에서 프로젝트나 개인공부를 할때 자주 사용해왔던 연산자라 확실하게 삼항이 왜 삼항인지를 알고나니까 지금까지 썻던 코드가 더 확실하게 와 다으며 왜 ? 앞에는 조건식이나 true인지 false인지를 사용하는지 알수 있었다.

뒤에 2가지의 피연산자는 ?앞에 피연산자가 true인지 false인지에 따라 true이면 : 앞에 피연산자가 false이면 : 뒤에 피연산자가 선택된다는 걸 알 수 있었다.

 

 

 

 

JAVA를 공부하며 느꼈던것들...

지금까지 해왔던 공부가 너무 주먹구구식이었으며 시간에 쫒기면서 공부를 해와서 인지 기본기가 정말 부족했던걸 느낄수 있었다. JAVA를 공부하면서 JS를 배우면서 얻었던 작은 지식들이 도움이 되는 모습을 보며 프로그래밍 언어란 서로 유기적으로 연결될 수 있다는 걸 느낄 수 있었고 그래도 5개월이라는 시간동안 JS를 공부했던게 큰 도움은 아니지만 그래도 JAVA공부에 많은 도움이 될 수 있다는 걸 알게 되었다.

 

'백엔드 > JAVA' 카테고리의 다른 글

JAVA 조건/반복문 #2  (0) 2023.03.14
JAVA 조건/반복문  (0) 2023.03.13
JAVA 변수 (2)  (0) 2023.02.22
JAVA 변수  (0) 2023.02.20
JAVA 개발환경 설정 #2  (0) 2023.02.15

댓글