dohun.log

[Java]03.연산자 본문

Study/Java

[Java]03.연산자

dohun31 2022. 1. 10. 23:23

3. 연산자

3.1 연산자와 연산식

연산(operations): 프로그램에서 데이터를 처리하여 결과를 산출하는 것

연잔자(operator): 연산에 사용되는 표시나 기호

피연산자(operand): 연산되는 데이터

연산식(expressions): 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것

// operand operator operand => 연산식
x + y

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

int result = x + y;

3.2 연산의 방향과 우선순위

  1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
  2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
  3. 단항과 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.(→)
  4. 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정해준다.

3.3 단항 연산자

피연산자가 단 하나뿐인 연산자

3.3.1 부호 연산자

연산식 설명
+ 피연산자 피연산자의 부호 유지
- 피연산자 피연산자의 부호 변경
int x = -100;
int result1 = +x; // -100 부호 유지
int result2 = -x; // 100 부호 변경

⚠️ 부호 연산자의 산출 타입은 int 타입이다.

short x = 100;
short result1 = +100; // 컴파일 에러
int result2 = +100;

 

3.3.2 증감 연산자

연산자 설명
++ 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴
-- 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴
피연산자 ++ 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴
피연산자 -- 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴
int x = 1;
int result1 = ++x; // result1 = 2, x = 2
int result2 = x++; // result2 = 2, x = 2 -> 3
int result3 = --x; // result3 = 2, x = 2
int result4 = x--; // result4 = 2, x = 2 -> 1

단항 연산자인 ++i가 이항연산자인 i = i + 1보다 빠를까?

❌++ii = i + 1은 컴파일하면 바이트코드가 동일하다. 

3.3.3 논리 부정 연산자

연산자 설명
! 피연산자 피연산자가 true이면 false 값을 산출
피연산자가 false이면 true 값을 산출

3.3.4 비트 반전 연산자

연산식 설명
~ 10(00...01010) -11(11...10101)

⚠️ 비트 반전 연산자의 산출 타입은 int 타입이다.

byte v = 10;
byte v1 = ~v; // 컴파일 에러
int v2 = ~v;

3.4 이항 연산자

피연산자가 두 개인 연산자

3.4.1 산술 연산자

일반적으로 말하는 사칙연산, 나머지 연산자 → 산술 연산자는 총 5개

연산식 설명
피연산자 + 피연산자 덧셈 연산
피연산자 - 피연산자 뺄셈 연산
피연산자 * 피연산자 곱셈 연산
피연산자 / 피연산자 좌측 피연산자를 우측 피연산자로 나눗셈 연산
피연산자 % 피연산자 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산
  1. 피연산자 모두 정수, int 타입보다 크기가 작은 타입 → 모두 int 타입으로 변환 후 연산 수행 →  연산의 산출 타입은 int 타입이다.
  2. 피연산자 모두 정수, long 타입 존재 → 모두 long 타입으로 변환 후 연산 수행 → 연산의 산출 타입은 long 타입이다.
  3. 피연산자 중 실수 타입 존재 → 크기가 큰 실수 타입으로 변환 후 연산 수행 → 연산의 산출 타입은 실수 타입이다.
// 1
byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 컴파일 에러
int int1 = byte1 + byte2;

// 2
long long1 = 10L;
int int2 = long1 + int1; // 컴파일 에러
long long2 = long1 + int1;

// 3
int int2 = 4;
int int3 = int1 / int2; // 2 / 4 = 0.5 -> 0
double double1 = int1 / int2; // 2 / 4 = 0.5 -> 0 -> 0.0

// 0.5를 얻고 싶으면 다음과 같이 해야 함.
double double2 = (int1 * 1.0) / int2;
double double2 = (double)int1 / int2;
double double2 = int1 / (double)int2;

오버 플로우 탐지

int x = 1000000;
int y = 1000000;
int z = x * y; // 오버플로우 발생
long z = x * y; // 1000000000000

NaN과 Infinity 연산

5 / 0 // ArithmeticException 발생
5 % 0 // ArithmeticException 발생
5 / 0.0 // Infinity
5 % 0.0 // NaN
Double.isInfinite() // Infinity면 true 반환, 아니면 false 반환
Double.isNaN() // NaN이면 true 반환, 아니면 false 반환

3.4.2 문자열 연결 연산자

String str1 = "JDK" + 6.0; // "JDK6.0"
String str2 = "JDK" + 3 + 3.0; // "JDK33.0"
String str3 = 3 + 3.0 + "JDK"; // "33.0JDK"

3.4.3 비교 연산자

구분 연산식 설명
동등
비교
피연산자1 == 피연산자2 두 피연산자의 값이 같은지를 검사
피연산자1 != 피연산자2 두 피연산자의 값이 다른지를 검사
크기
비교
피연산자1 > 피연산자2 피연산자1이 큰지를 검사
피연산자1 >= 피연산자2 피연산자1이 크거나 같은지를 검사
피연산자1 < 피연산자2 피연산자1이 작은지를 검사
피연산자1 <= 피연산자2 피연산자1이 작거나 같은지를 검사

⚠️ String 타입의 문자열을 비교할 때에는 대소 연산자 사용 불가, 동등 비교 연산자 사용할 때는 주의

String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");

str1 == str2 // true
str1 == str3 // false

문자열 리터럴이 같으면 동일한 String 객체 참조

그러나 str3new로 새롭게 생성한 String 객체 번지값을 가지고 있음

 

따라서 다음과 같이 사용해야 한다.

boolean result1 = str1.equals(str2); // true
boolean result2 = str1.equals(str3); // true

3.4.4 논리 연산자

구분 연산자 설명
AND(논리곱) && or & 피연산자 모두가 true일 경우에만 연산 결과는 true
OR(논리합) || or | 피연산자 중 하나만 true이면 연산 결과는 true
XOR(배타적 논리합) ^ 피연산자가 하나는 true이고 다른 하나가 false일 경우에마 연산 결과는 true
NOT(논리부정) ! 피연산자의 논리값을 바꿈

3.4.5 비트 연산자

구분 연산자 설명
AND(논리곱) & 두 비트 모두 1일 경우에만 연산 결과는1
OR(논리합) | 두 비트 중 하나만 1이면 연산 결과는 1
XOR(배타적 논리합) ^ 두 비트 중 하나는 1이고 다른 하나가 0일 경우에마 연산 결과는 1
NOT(논리부정) ! 보수
이동(쉬프트)


<< 정수 a의 각 비트를 b만큼 왼쪽으로 이동(빈 자리는 0으로 채워짐)
>> 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈 자리는 정수 a의 MSB와 같은 값으로 채워짐)
>>> 정수 a의 각 비트를 b만큼 오른쪽으로 이동(빈 자리는 0으로 채워짐)

3.4.6 대입 연산자

구분 연산식 설명
단순 대입 연산자 변수 = 피연산자 우측의 피연산자의 값을 변수에 저장
복합 대입 연산자 변수 연산자= 피연산자 우측의 피연산자의 값을 변수의 값과 연산한 후 다시 변수에 저장

3.5 삼항 연산자

피연산자가 세 인 연산자

// 조건식 ? 값 또는 연산식 : 값 또는 연산식
10 > 90 ? "TRUE" : "FALSE"; // "FALSE"

 

출처: 이것이 자바다 Chater03 연산자

'Study > Java' 카테고리의 다른 글

[Java]05.참조 타입  (2) 2022.01.18
[Java]01.자바 시작하기  (1) 2022.01.11
[Java]04.조건문과 반복문  (0) 2022.01.11
[Java]06.클래스-확인문제  (0) 2021.12.29
[Java] 02.변수와 타입  (0) 2021.12.20
Comments