Java

연산자 정리

OneMoreThing 2024. 1. 5. 20:12

연산자의 종류

  1. 산술 연산자 : 사칙연산() 및 비트연산(<<,>>)
  2. 비교 연산자 : 대소 비교(>,>=,<,<=) 및 등호(==,!=)
  3. 논리 연산자 : AND(&&) , OR(||), NOT(!)
  4. 대입 연산자 : 대입 연산자 (=, ++, --)
  5. 기타 연산자 : 형변환 연산자(: (type)), 삼항 연산자 (조건? true일때 : false일때 ), instance of 연산자(instance of)

위의 연산자들 중 자세히 다루면 좋은 연산자들을 따로 정리해보자.


1. 산술 연산자

기본적인 사칙연산인 덧셈(+),뺄셈(-),곱셈(*),나눗셈(*/,%)과 비트연산(<<,>>)을 포함한다.

산술 연산자 중 주의를 기울이거나 추가적인 이해가 필요한 것은 [나눗셈]과 [비트연산]이라 생각된다.

 

 [나눗셈 : 몫(/)과 나머지(%)]

나눗셈 연산자중 (/)는 몫을 구하는 연산자로 알려져있다. 이는 정수형 인 경우에만 해당한다.

즉, 정수형이 아닌 실수형인 경우에는 몫이 아닌 나눗셈의 결과를 나타낸다.

//정수의 나눗셈
int a = 5;
int b = 2;
int c = a/b;
System.out.println(c); // 5를 2로 나눈 결과는 2.5 이고 여기서 정수부분인 2가 출력됨

//실수의 나눗셈
double x = 5.0;
double y = 2.0;
double z = x/y;
System.out.println(z); // 5.0/2.0 의 결과는 2.5 이고 z=2.5 그대로 출력됨

 

정수의 나눗셈에서 / 의 결과가 몫으로 보이는 것은, 실수형 데이터를 정수형으로 형변환할 때, 소수부분을 버리는 것과 동일한 이유인 것으로 보인다.

 

나머지를 구하는 연산은 어떨까?

//정수의 나머지 연산
int a = 5;
int b = 2;
int c = a%b;
System.out.println(c); // 5를 2로 나눈 결과의 나머지인 1이 출력됨

//실수의 나머지 연산
double x = 5.0;
double y = 2.0;
double z = x/y;
System.out.println(z); // 5.0을 2.0 으로 나눈 나머지인 1.0 출력됨

 

$$몫과 나머지를 구한다는 것은 정수형에만 국한됨을 기억하자!

 

[비트연산자]

비트연산자인 <<과 >> 은 말그대로 비트의 자리를 옮기는 것을 의미한다. 그렇다면 굳이 비트연산자를 사용하는 이유가 무엇일까?

비트는 데이터를 저장하는 가장 작은 단위이다. 즉, 컴퓨터의 입장에서 메모리에 저장된 데이터를 왼쪽이나 오른쪽으로 한칸씩 움직이는 연산이기 때문에 속도가 가장 빠른 연산이다. 사용하는 경우는 특수하겠지만 잘 사용한다면, 속도에서 많은 이득을 볼 수 있을 것이다.

 

int a = 5;
int b = a << 2;// a의 각 비트를 왼쪽으로 2칸씩 옮긴 값을 b에 저장한다.
System.out.println(b); //5 * 4 = 20 출력
int c = a >> 2;// a의 각 비트를 오른쪽으로 2칸씩 옮긴 값을 c에 저장한다.
System.out.println(c); //5 / 4 = 1 출력

 

왼쪽으로 n번 옮기는 것이 왜 (2의 n승)을 하는 결과가 나올까? 이는 2진수를 10진수로 계산하는 원리와 동일하다.

8 4 2 1
0 1 1 1

 

위의 표를 보면 1행은 4bit의 공간에서 각 자리마다 대응되는 10진수를 표현하였다. 왼쪽으로 1칸씩 움직일 때마다 2배 차이가 난다.

참고로 위의 4bit 숫자는 10진수로 4+2+1=7을 나타낸다.

정리하자면, 2진수로 숫자를 인식하는 컴퓨터에게 왼쪽으로 1칸 움직이는 것은 2를 곱하는 것이고, 오른쪽으로 1칸 움직이는 것은 2로 나누는 것이다. 기억하기 쉽게 연산자의 모양을 화살표로 생각해서 기억하자.

<< n : [<-] 왼쪽을 가리키는 화살표 == 왼쪽으로 n칸 움직이세요 == 2를 n번 곱하세요.
>> n : [->] 오른쪽을 가리키는 화살표 ==오른쪽으로 n칸 움직이세요 == 2를 n번 나누세요.

 


2. 대입 연산자(=,++,--)

등호 기호(=) 는 가장 많이 사용되는 대입 연산자이다. 등호를 기준으로 오른쪽의 값을 왼쪽에 대입한다는 의미이다.

주의가 필요한 연산자는 (++,--) 이다. 왜냐하면 이 연산자는 변수의 앞에 붙이는 (prefix) 경우와 변수의 뒤에 붙이는 (postfix) 경우에 동작이 약간 다르기 때문이다. 예를 들어 이해해보자.

int a = 1;
int b;
b=a++; //b에 a의 값을 전달하고 a를 1만큼 증가시킴
System.out.println(b);//1
System.out.println(a);//2

a = 1;
b = ++a; //a를 1만큼 증가시키고 b에 a의 값을 전달함
System.out.println(b);//2
System.out.println(a);//2

 

정리하자면,

++a 또는 --a: prefix 의 경우 먼저 증가/감소 를 시키고 대입(명령어 실행)을 함
a++ 또는 a-- : postfix 의 경우 먼저 대입(명령어 실행)을 하고 증가/감소를 시킴

3. 삼항 연산자( condition ? true case : false case )

삼항 연산자는 if문을 간단하게 1줄로 줄여놓은 것으로 볼 수 있다. 구조는 아래와 같다.

 (조건? 조건이 true인 경우 리턴값 : 조건이 false인 경우 리턴값) 

예를 들면 최소값을 저장할 때 다음과 같이 할 수 있다.

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();//15 입력
int b = sc.nextInt();//20 입력
int min = (a<b? a : b);//a<b 가 true 이므로 min = a
System.out.println(min);//15 출력

 

위와 똑같은 동작을 삼항 연산자가 아닌 if 문으로 작성하면 코드가 길어진다.

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int min = 0;
if( a<b ) {
	min = a;
}else{
	min = b;
}
System.out.println(min);

if문을 사용하면 좀 더 번거로운 것을 볼 수 있다. 삼항 연사자를 많이 연습해서 체득시키자!


[총평]

연산자의 경우 대부분 자주 사용해왔던 연산자이기 때문에 큰 어려움없이 받아들이고 사용할 수 있다. 하지만 비트 연산자나 삼항 연산자는 2를 곱하거나 나누는 것으로 대체가능하고, if문으로 대체가 가능하기 때문에 자주 사용하지 않게 된다.

코드의 성능을 향상시키거나 깔끔하게 짤 수 있게 도와주므로, 귀찮더라도 관심을 가지고 체득될 수 있게 자주 사용하자!