본문 바로가기
JAVA

연산자(part 2)

by RoyalBlue 2023. 9. 11.

연산자의 유형이 다양한 관계로,

여러 파트로 진행하게 됐다.

 

연산자에 대한 정의를 다시 상기하고 시작하자.

연산자(Operator)란?

주어진 식을 계산하여 결과를 얻어내는 과정을 연산이라고 하며, 연산을 수행하는 기호를 연산자라고 한다.

 


 

파트2에서 다룰 연산자 종류는 세 가지다.

 

🟦  비트 연산자

🟦  대입 연산자

🟦  instanceof

 

연산자의 속성을 이해한다면 효율적인 코드 작성에 큰 도움이 된다.

비트 연산자부터 시작한다. 비트 연산자는 말 그대로 비트에 저장된 값을 다루는 연산자이다.

 

프로그래밍 언어에서는, 데이터 값을 주로 2진수로 저장하는데

0과1이 차지하는 한 칸이 1bit이다 1byte는 8bit를 의미한다.

(이 기초 개념을 이해하고 읽는 것이 좋다.)

 

 

비트 연산자 (논리 & 이동)

  • 비트 AND (&)
  • 비트 OR ( | )
  • 비트 XOR ( ^ )
  • 비트 NOT (~)
  • 왼쪽 시프트 연산자 (<<)
  • 오른쪽 시프트 연산자 (>>)
  • 부호 없는 오른쪽 시프트 연산자 (>>>)

 

🔘 비트 논리 연산자

 

비트 논리 연산자는 bit 단위로 논리 연산을 수행한다. 0과 1이 피연산자가 되므로,

2진수 0과 1로 저장되는 정수타입만 피연산자가 될 수 있다.

비트 논리 연산자는 피연산자의 타입이 int 이하이면 모두 int타입으로 자동 변환한 후 연산을 수행한다.

따라서 연산 결과는 int 타입 변수에 대입해야 한다.

 

다음은 비트 논리 연산자의 산출식이다.

비트 논리 연산자는, 피연산자와 산출결과가 0 과 1뿐이라는 특징이 있다.

1은 true, 0은 false라고 생각한다면 논리 연산자와 차이가 없다.

(NOT만 사용하는 기호가 다르다, 논리연산은 " ! "기호를 사용하고 비트 논리연산은 " ~ "기호를 사용한다.)

 

▶️ bit AND

두 피연산자의 비트칸이 각각 1일 경우 1

▶️ bit OR

두 피연산자의 비트칸이 하나라도 1일 경우 1

▶️ bit XOR

두 피연산자의 비트칸이 각각 1과 0일 경우 1

▶️ bit NOT

부호 비트를 포함해 모두 반전시킨다

 

아래는 연산 과정을 보여주는 예시이다

45, 25로 비트 논리 연산을 수행한다고 가정해보자.

AND / OR
XOR / NOT

 

🔘 비트 이동 연산자

 

비트 이동 연산자는 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 수행한다.

b의 값만큼 a의 정수값(bit)을 지정된 방향으로 이동시킨다

 

"<<" 기호를 사용한 연산식은 2의 거듭제곱을 곱한 결과와 동일하다.

예 : 1 << 3 = 1 x 2³ = 8 

 

">>" 기호를 사용한 연산식은 2의 거듭제곱을 나눈 결과와 동일하다.

예 : -8 >> 3 = -8 / 2³ = -1 

 

우측 이동 연산자(>>>)를 사용하여 비트값 전체를 지정된 값만큼 이동시키면,

밀린 비트는 버려지고 새로 생긴 비트는 무조건 0의 값을 지닌다.

 

반대로 "<<<" 연산자는 자바에 존재하지 않는다.

 

 

대입 연산자

대입 연산자는 "=" 기호가 수행하려는 기호 뒤에 모두 붙는 것이 특징이다

거의 모든 연산식을 대입 가능하기에 종류가 꽤 많다 아래의 표를 참고하자.

 

대부분의 연산 기호를 대입연산자로 사용 가능하다

 

대입 연산자는 우측 피연산자의 값을 좌측 피연산자인 변수에 대입한다.

우측 피연산자에는 리터럴 및 변수, 그리고 다른 연산식이 올 수 있다.

 

대입 연산자의 종류에는 단순히 값을 대입하는 " = " 기호의 단순 대입 연산자와,

정해진 연산을 수행한 후 값을 대입하는 복합 대입 연산자가 있다.

 

아래는 대입 연산자를 활용한 예시 코드이다.

 

대입 연산자를 활용함으로써, 코드의 행을 줄이고 코드를 더 직관적으로 구성할 수 있다. 

 

 

instanceof

이 연산자는 객체가 특정 클래스 또는 인터페이스의 인스턴스인지 확인하는데 사용된다.

추후 객체와 클래스 개념을 공부할텐데, 그 전에 "이런 연산자가 있다" 정도로만 파악하고 넘어가자.

 

instanceof 연산자는 boolean 타입의 값을 반환하며,

연산 결과 객체가 지정한 클래스의 인스턴스이면 true, 아니면 false를 산출한다.

 

예 : boolean result = 객체 instanceof 클래스 & 인터페이스;

 

하지만 결론부터 말하자면 "instanceof" 연산자는 특별한 경우가 아니라면 사용을 지양한다.

이 연산자를 잘 사용하지 않는 이유 몇 가지를 적는다면 이렇다.

 

1. 객체 지향 원칙에 위배된다

객체 지향 프로그래밍의 다형성 원칙을 위배할 수 있다,

다형성을 바로 활용하여 객체 간의 관계를 더욱 명확하게 표현할 수 있다.

 

2. 코드의 유지보수가 어렵다.

instanceof 연산자로 주 구조를 짜면 클래스 계층 구조가 변경될때 많은 문제와 수정이 발생한다.

 

3. 설계 시의 문제.

부적절한 설계를 나타낼 수 있다 클래스간의 결합도 때문에 유연성이 떨어진다.

 

등등의 이유가 더 있기에 이 연산자는 되도록 지양하고, 다른 로직을 활용해 코드를 구성하는 것이 좋다.

 

 


 

자바에서의 연산자 종류가 꽤 많아 공부에 애를 먹고 있다.

 

자주 사용되는 연산자만 알고 있는것도 코드 구성에 문제가 크게 없겠지만

 

비주류의 연산자들도 어떠한 기능을 하고 어떤 원리와 속성이 있는지 지금 배우고 넘어가야

공부를 진행하면서 나중에 다시 되돌아 오는 일이 없다.

 

- part 2 끝! -

'JAVA' 카테고리의 다른 글

조건문(if 문)  (0) 2023.09.20
삼항 연산자  (0) 2023.09.19
산술 연산식에서의 형변환  (0) 2023.09.06
연산자(part 1)  (0) 2023.09.05
변수 선언과 초기화  (0) 2023.09.01