-
[Java]STEP1 - 3) 연산자, 우선순위, 종류(단항/이항/삼항), NaN과 Infinity개발 공부/Java 2020. 9. 2. 15:41
본 게시글은 도서 "이것이 자바다" 동영상 강의를 듣고 기록하는 TIL(Today I Learned) 입니다.
모든 저작권은 출판사 한빛미디어와 신용권님께 있음을 알립니다.👍1. 연산자(Operator)
1-1. 연산자와 연산식
연산: 데이터를 처리하여 결과를 산출하는 것.
연산자: 연산에 사용되는 표시나 기호
피연산자: 연산되는 데이터
연산자에는 산술, 부호, 문자열, 대입, 증감, 비교, 논리, 조건, 비트, 쉬프트 연산자가 있다.
연산자는 필요로 하는 피연산자의 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
연산자는 반드시 하나의 값만을 산출한다.1-2. 연산의 방향과 우선순위
대부분의 연산자는 왼쪽에서부터 오른쪽으로(→) 연산을 시작한다.
단! 단항 연산자, 부호 연산자, 대입 연산자는 오른쪽에서 왼쪽으로(←) 연산을 시작한다.[우선 순위]
▶ 단항 > 이항 > 삼항
▶ 산술 > 비교 > 논리 > 대입
여러 가지 연산식들이 섞여있어서 우선순위가 혼란스럽다면,
괄호() 를 사용해서 먼저 처리해야하는 연산식을 묶는 것이 좋다.
2. 단항 연산자
피연산자가 단 하나뿐인 연산자
2-1. 부호 연산자(+, -)
연산식 설명 + 피연산자 피연산자의 부호 유지 - 피연산자 피연산자의 부호 변경 - 변수 앞에 붙어서 해당 변수에 들어갈 값의 부호를 유지하거나 변경한다.
- 부호 연산자의 산출 타입은 int 타입이 되므로 이 점을 주의한다.
2-2. 증감 연산자(++, --)
연산식 설명 ++ 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 증가시킴 -- 피연산자 다른 연산을 수행하기 전에 피연산자의 값을 1 감소시킴 피연산자 ++ 다른 연산을 수행한 후에 피연산자의 값을 1 증가시킴 피연산자 -- 다른 연산을 수행한 후에 피연산자의 값을 1 감소시킴 - 변수의 값을 1 증가(++) 시키거나, 1 감소(--) 시키는 연산자를 말한다.
- 변수의 앞에 있는지 뒤에 있는지에 따라 동작 순서가 다르므로 이 점을 주의한다.
- ++i와 i=i+1 은 실제 컴파일 시 동일한 바이트 코드가 생성되므로 연산 속도에는 거의 차이가 없다.
2-3. 논리 부정 연산자(!)
연산식 설명 ! 피연산자 피연산자가 true이면 false 값을 산출
피연산자가 false이면 true 값을 산출- true를 false로 false를 true로 변경하는 연산자를 말한다.
- 주로 조건문과 제어문에서 실행 흐름을 제어하는 용도로 많이 사용된다.
2-4. 비트 반전 연산자(~)
연산식 설명 ~ 0001010 1110101 - 피연산자를 2진수로 표현했을 때 비트값인 0을 1로, 1은 0으로 반전하는 연산자를 말한다.
- 정수 타입의 피연산자에서만 사용된다.
3. 이항 연산자
피연산자가 두 개인 연산자
3-1. 산술 연산자(+, -, *, /, %)
연산식 설명 피연산자 + 피연산자 덧셈 연산 피연산자 - 피연산자 뺄셈 연산 피연산자 * 피연산자 곱셈 연산 피연산자 / 피연산자 나눗셈 연산(몫) 피연산자 % 피연산자 나눗셈 연산(나머지) - long타입을 제외한 정수 타입 연산은 int 타입으로 산출된다.
- 피연산자 중 하나라도 실수 타입이면 실수 타입으로 산출된다.
- char 타입이 산술 연산 될 경우, int 타입으로 변환되므로 int 타입으로 산출된다.
- 연산 후의 산출값이 산출 타입으로 충분히 표현 가능한지 살펴보는 오버플로우 탐지 과정을 거쳐야한다.
- 부동소수점 타입(float, double)은 0.1을 근삿값으로 계산하므로, 정확한 소수점 계산은 정수형으로 계산 후 실수형으로 변환하는 것이 좋다.
수학에서 0으로 나눌 수 없듯이, 좌측 피연산자가 정수 타입이고 우측 피연산자가 0이라면 ArithmeticException 예외가 발생한다.
그러나 실수 타입인 0.0이나 0.0f 로 나누게 되면 "/" 연산의 경우 Infinity, "% "연산의 경우 NaN(Not a Number) 값을 가진다.
10 / 0.0 -> Infinity
10 % 0.0 -> NaN한번 Infinity나 NaN이 발생하면 이후 연산을 수행하면 안된다. 어떠한 값과 연산해도 무조건 Infinity나 NaN이 나오기 때문이다.
이를 해결하기 위해서는 부동소수점을 입력받을 때, Double.isInfinite() 혹은 Double.isNaN() 을 통해 Infinity나 NaN이 발생하지 않는지 검사해주어야 한다.
3-2. 문자열 연결 연산자(+)
문자열 연결 연산자 + 는 문자열을 서로 결합하는 연산자이다.
String one = "I am";
String two = "iron man";
one + two; → "I am iron man"3-3. 비교 연산자(<, <=, >, >=, ==, !=)
연산식 설명 피연산자1 == 피연산자2 두 피연산자의 값이 같은지 검사 피연산자1 != 피연산자2 두 피연산자의 값이 다른지 검사 피연산자1 > 피연산자2 피연산자1이 큰지를 검사 피연산자1 >= 피연산자2 피연산자1이 크거나 같은지 검사 피연산자1 < 피연산자2 피연산자1이 작은지 검사 피연산자1 <= 피연산자2 피연산자1이 작거나 같은지 검사 3-4. 논리 연산자(&&, ||, &, |, ^, !)
연산식 설명 논리곱 AND (&& 또는 &) 피연산자 모두가 true일 경우에만 true를 반환 논리합 OR (|| 또는 |) 피연산자 중 하나만 true이면 true를 반환 배타적논리합 XOR (^) 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 true를 반환 논리부정 NOT (!) 피연산자의 논리값을 바꿈 - &&는 앞의 피연산자만 확인하고 값을 산출하지만, &는 앞 뒤 피연산자 모두를 확인한 후 값을 산출한다.
따라서 &보다 &&가 더 효율적으로 동작한다. 이는 ||와 |의 경우에도 마찬가지이다.
3-5. 비트 연산자(&, |, ^, ~, <<, >>, >>>)
연산식 설명 논리곱 AND ( & ) 두 비트 모두 1일 경우에만 1을 반환 논리합 OR ( | ) 두 비트 중 하나만 1이면 1을 반환 배타적논리합 XOR ( ^ ) 두 비트 중 하나는 1이고 다른 하나가 0일 경우 1을 반환 논리부정 NOT ( ~ ) 보수 << 정수의 각 비트를 왼쪽으로 이동 (빈자리는 0으로 채워짐) >> 정수의 각 비트를 오른쪽으로 이동 (빈자리는 최상위 부호 비트와 같은 값으로 채워짐) >>> 정수의 각 비트를 오른쪽으로 이동 (빈자리는 0으로 채워짐) - byte, char, short 타입을 비트 논리 연산하면 그 결과는 int가 된다.
- 비트 이동 연산자는 정수 데이터의 비트를 좌측 또는 우측으로 밀어서 이동시키는 연산을 말한다.
3-6. 대입 연산자(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=)
연산식 설명 = 우측의 피연산자의 값을 변수에 저장 += 변수 = 변수 + 피연산자 -= 변수 = 변수 - 피연산자 *= 변수 = 변수 * 피연산자 /= 변수 = 변수 / 피연산자 %= 변수 = 변수 % 피연산자 &= 변수 = 변수 & 피연산자 |= 변수 = 변수 | 피연산자 ^= 변수 = 변수 ^ 피연산자 <<= 변수 = 변수 << 피연산자 >>= 변수 = 변수 >> 피연산자 >>>= 변수 = 변수 >>> 피연산자 - 대입 연산자는 모든 연산자 중에서 가장 낮은 연산 순위를 가진다. 따라서 제일 마지막에 수행된다.
- 연산의 진행 방향이 오른쪽에서 왼쪽이기 때문에 주의해야한다.
4. 삼항 연산자
피연산자가 세 개인 연산자
조건식 ? A : B
▶ 조건식이 true이면 A, false이면 B의 값을 가지게 된다.
char math_grade = (math_score > 90) ? 'A' : 'B';
// 즉 math_score가 90 초과이면 A가 math_grade에 저장되고, 90 이하이면 B가 저장된다.본 게시글은 여기서 마치겠습니다.
읽어주셔서 감사하고, 혹시나 틀린 부분이나 보완해야할 부분이 있다면 댓글에 남겨주세요~!
'개발 공부 > Java' 카테고리의 다른 글
[Java]STEP1 - 5) 참조 데이터 타입, 메모리 영역, null, NullPointerException, String 타입 (0) 2020.09.05 [Java]STEP1 - 4) 조건문(if, switch)과 반복문(for, while, do-while), break와 continue에 대하여 (0) 2020.09.05 [Java]STEP1 - 2) 변수, 리터럴, 데이터 타입, 타입 변환 (0) 2020.08.28 [Java]STEP1 - 1) 자바의 개념, 특징, 구조, 주석과 실행문, 이클립스에 대하여 (0) 2020.08.27 [Java]STEP0 - 달력을 바탕으로 일정의 등록, 검색, 변경 기능이 있는 일정 관리 프로그램 만들기 (0) 2020.08.23