새소식

프로그래밍 언어/JAVA

자바 기초 - 5. 연산자

  • -
💡 기초 복습 겸 다시 정리하고 있습니다. 설명이 부족한 부분이 있을 수 있으니 고려하여 읽어주시기 바랍니다.

 

연산자와 연산식


프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(Operation) ,연산에서 사용되는 표시나 기호를 연산자(Operator)라고 합니다.

 

연산되는 데이터는 피연산자(Operand)라고 하며 연산의 과정을 기술한 것을 연산식(Expressions)라 합니다.

 

연산식은 반드시 하나의 값을 산출하므로, 하나의 값이 올 수 있는 곳이라면 어디든지 값 대신 연산식을 사용할 수 있습니다.

 

📌 연산자의 종류


연산자는 필요로 하는 피연산자의 수에 따라 크게 단항, 이항, 삼항 연산자로 구분됩니다.

 

자바에서 제공하는 연산자는 다음과 같습니다.

 

 

 

🔎 단항 연산자


단항 연산자란 피연산자가 하나인 연산자를 의미합니다.

 

 

🧨 부호 연산자

부호 연산자는 양수 및 음수를 표시하는 +, - 를 뜻합니다.

 

boolean과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있습니다.

 

부호 연산자의 산출 타입은 int로 변경됩니다.

 

short s = 10;

short result1 = -s;  // 부호 연산자의 산출 타입은 int이므로 컴파일 에러 발생

int result2 = -s;  // 다음과 같이 int 타입에 대입

 

 

🧨 증감 연산자

증감 연산자는 변수의 값을 1증가(++)시키거나 감소(--)시키는 연산자를 뜻합니다.

 

boolean 타입을 제외한 모든 기본 타입에 사용할 수 있습니다.

 

증감 연산자는 위치(전위, 후위)에 따라 연산식의 결과가 다르게 나올 수 있습니다.

 

전위 증감 연산자의 경우, 우선 변수의 값을 1증가 (감소) 시킨 후 다른 연산자와 계산하고,

후위 증감 연산자의 경우, 다른 연산자를 먼저 처리한 후 변수의 값을 1증가(감수) 시킵니다.

 

int x = 1;
int y = 1;

int result1 = ++x + 10;  // 12 , 전위
int result2 = y++ + 10;  // 11 , 후위

// ++i 와 i = i + 1; 은 동일한 바이트 코드를 생성합니다.

 

 

🧨 논리 부정 연산자

논리 부정 연산자는 boolean 타입의 값을 부정(!)할 때 사용합니다.

 

부정한다는 것은 true -> false 로 false -> true로 값을 반대로 변경한다는 것을 의미합니다.

 

int check = true;

System.out.println(!check)  // false;
System.out.println(!check)  // true;

 

 

🧨 비트 반전 연산자

비트 반전 연산자는 정수 타입에만 사용되며, 피연산자를 2진수로 표현했을 때 비트값인 0을 1로, 1은 0으로 반전합니다.

 

최상위 비트 또한 반전되므로 부호가 반대인 새로운 값으로 산출되며, 이때 산출 타입은 int로 변환됩니다.

 

byte b1 = 10;

byte result1 = ~b1;  // 컴파일 에러

int result2 = ~b1;  // -11 , 00001010 -> 11110101

 

 

🔎 이항 연산자


이항 연산자는 피연산자가 두 개인 연산자를 의미합니다.

 

🧨 산술 연산자

일반적인 사칙연산(+ , - , * , / ) 와 나머지(%) 를 구하기 위한 연산자를 의미합니다.

 

boolean 타입을 제외한 모든 기본 타입에 사용할 수 있습니다.

 

산술 연산자의 경우, 피연산자들의 타입이 동일하지 않으면 다음과 같은 규칙을 따릅니다.

 

  • 피연산자들이 모두 정수 타입이고 int 타입 보다 작은 타입일 경우, 모두 int 타입으로 변환 후 연산 수행
  • 피연산자들이 모두 정수 타입이고 long 타입이 있을 경우, 모두 long타입으로 변환 후 연산 수행
  • 피연산자 중 실수 타입이 있을 경우, 크기가 가장 큰 타입으로 변환 후 연산 수행

 

산술 연산 시 주의할 점은 연산 후의 결과값이 저장하려는 타입의 크기보다 작은지 확인해야 합니다. 만약, 결과 값이 더 크다면 오버플로우가 발생하여 쓰레기 값을 얻게 되므로 주의해야합니다. 

 

🧨 문자열 연결 연산자

두 문자열을 서로 결합(+)하고 싶을 때 사용하는 연산자입니다.

 

문자열과 숫자가 혼합된 연산은 주의를 기울여 사용해야 합니다.

 

String result1 = "Hello" + 2023 + 2024;  // Hello20232024
String result2 = 2023 + 2024 + "Hello";   // 2047Hello

 

 

🧨 비교 연산자

대소( < , <= , > , >= ) 또는 동등( == , != )을 비교하여 true/false를 산출하는 연산자를 의미합니다.

 

boolean 을 제외한 모든 기본 타입에서 사용 가능합니다.

 

피연산자가 char 타입일 경우, 유니코드 값으로 비교 연산을 수행합니다.

 

연산을 수행하기 전, 타입 변환을 통해 피연산자의 타입을 일치시키지만, 부동소수점 타입들은 정확한 결과가 나오지 않을 수 있으므로 비교 시 타입을 모두 동일하게 변환하여 비교하는 것이 좋습니다.

 

문자열 비교는 비교 연산자가 아닌 equals()를 통해 비교해야합니다.

 

 

🧨 논리 연산자

논리 연산자는 논리곱(&&, &), 논리합(||, |), 배타적 논리합(^), 논리 부정(!) 연산을 수행하는 연산자 입니다.

 

boolean 타입에만 사용 가능합니다.

 

  • 논리곱 : 피연산자가 모두 true 인 경우 true / 하나라도 false이면 false
  • 논리합 : 피연산자 중 하나만 true여도 true / 모두 false이면 false
  • 배타적 논리합 : 피연산자가 하나만 true이고 다른 하나가 false일 경우에만 true
  • 논리 부정 : 피연산자의 논리값을 반대로 바꿈

기호의 갯수에 따른 작동 방식은 다음과 같습니다.

 

  • && , || : 앞의 피연산자에서 이미 결과를 도출할 수 있으면, 더이상 연산하지 않고 결과를 산출 후 종료
  • & , | : 두 피연산자 모두를 평가한 후 결과를 산출

위와 같은 작동원리로 성능상 && , || 를 많이 사용합니다.

 

 

🧨 비트 연산자

비트 연산자는 데이터를 비트 단위로 연산할 때 사용되는 연산자를 의미합니다.

 

비트 연산자는 비트만을 연산하기 때문에 0과 1로 표현가능한 정수 타입에만 사용 가능합니다.

 

비트 연산자는 피연사자를 int 타입으로 자동 타입 변환 후 연산을 수행합니다.

 

비트 연산자는 기능에 따라 비트 논리 연산자(& , | , ^ , ~)비트 이동 연산자(<< , >> , >>>) 로 구분합니다.

 

비트 논리 연산자
비트 이동 연산자

 

 

🧨 대입 연산자

대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장하는 연산자를 의미합니다.

 

 

 

🔎 삼항 연산자


삼항 연산자는 세 개의 피연사자를 필요로 하는 연산자를 의미합니다.

 

사용 방법은 다음과 같습니다.

 

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

 

String result1 = 5 > 3 ? "good" : "bad";   // good

 String result2 = 5 > 3 ? 10 > 5 ? "good1" : "bad1" : "bad2"; // good1

 

 

📌 연산의 방향과 우선순위


연산식에는 다양한 연산자가 복합적으로 구성되므로 방향과 우선순위를 알아두는 것이 좋습니다.

 

하지만 ()로 연산되는 것끼리 묶어 사용하는 것이 가독성에 좋기 때문에 되도록이면 묶어서 사용하도록 합시다.

 

 

 

참고자료

이것이 자바다 - 신용권의 Java 프로그래밍 정복

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.