1. 연산자(operator)
연산을 수행하는 기호
1.1 연산자와 피연산자
연산자가 연산을 수행하려면 반드시 연산의 대상이 있어야 한다(피연산자) 피연산자로 상수, 변수 또는 식(式) 등을 사용할 수 있다.
연산자(operator) : 연산을 수행하는 기호(+,-,*,/등) 피연산자(poerand) : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
“모든 연산자는 연산 결과를 반환한다”
1.2 식(式)과 대입연산자
연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한것을 ‘식(式, expression)’이라고 한다. 식을 계산하여 결과를 얻는 것을 ‘식을 평가(evaluation)한다’고 한다.
1.3 연산자의 종류
[연산자의 기능별 분류]
종류 | 연산자 | 설명 |
산술 연산자 | + - * / % << >>(x) | 사칙 연산(+,_,*,/)과 나머지 연산(%) |
비교 연산자 | > < >= <= == != | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && || ! & | ^(x) ~ | ‘그리고(AND)’와 ‘또는(OR)’으로 조건을 연결 |
대입 연산자 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼항연산자, instanceof연산자 |
피연산자의 개수에 의한 분류
피연산자의 개수가 하나면 ‘단항 연산자’, 두 개면 ‘이항 연산자’, 세 개면 ‘삼항 연산자’ 라고 부른다.
1.4 연산자의 우선순위와 결합규칙
주의해야 할 연산자 우선순위의 예와 설명
- 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
- 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
연산자의 우선순위와 결합규칙
종류 | 결합규칙 | 연산자 | 우선순위 |
단항 연산자 | ◀——————— | ++ - - + - ~ ! (type) | 높음 |
산술 연산자 | ———————▶ | * / % | |
———————▶ | + - | ||
———————▶ | << >> | ||
비교연산자 | ———————▶ | < > <= >= instanceof | |
———————▶ | == != | ||
논리 연산자 | ———————▶ | & | |
———————▶ | ^ | ||
———————▶ | | | ||
———————▶ | && | ||
———————▶ | || | ||
삼항 연산자 | ———————▶ | ? : | |
대입 연산자 | ◀——————— | = += -= *= /= %= <<== >>== &= ^= |= | 낮음 |
1.5 산술 변환(usual arithmetic conversion)
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 연산 전에 형변환 연산자로 타입을 일치시켜야한다.
연산 전에 피연산자 타입의 일치를 위해 자동 현변환되는 것을 ‘산술 변환’ 또는 ‘일반 산술 변환’이라 한다.
❗모든 연산에서 ‘산술 변환’이 일어나지만, 쉬프트 연산자<< >>, 증감연산자 ++ - - 는 예외이다.
첫 번째 규칙은 피연산자의 값손실을 최소화하기 위한 것
두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문
연산중에 오버플로우가 발생할 가능성이 높기 때문에
산술 변환이란? 연산 수행 직전에 발생하는 피연산자의 자동 형변환
- 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치).
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
int보다 작은 타입은 로 자동변환한다는 것은 반드시 기억하고 있어야하는 중요한 내용이다
2. 단항 연산자
2.1 증감 연산자 ++ - -
증감연산자는 피연산자에 저장된 값을 1증가 또는 감소시킨다.
정수와 실수 모두 가능, 상수는 불가능
++i; //증가 후에
j = i; //참조하여 대입
j = i; //참조하여 대입 후에
i++ //증가
식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 한다.
2.2 부호 연산자 + - (단항 : 피연산자1개)
부호 연산자’-’는 피연산자의 부호를 반대로 변경한 결과를 반환한다.
피연산자가 음수면 양수, 양수면 음수가 연산의 결과가 된다.
3. 산술 연산자
3.1 사칙 연산자 + - * /
* / % 가 + - 보다 우선순위가 높다.
나눗셈 연산자는 반올림을 하지 않고 버림을 한다.
3.2 나머지 연산자 %
나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다.
나누는 수(오른쪽 피연산자)로 0을 사용할 수 없다.
그냥 피연산자의 부호를 모두 무시하고, 나머지 연산을 한 결과에 왼쪽 피연산자(나눠지는 수)의 부호를 붙이면 된다.
4. 비교 연산자
주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true와 false 둘 중의 하나이다.
자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교한다.
4.1 대소비교 연산자 < > <= >=
두 피연산자의 값의 크기를 비교하는 연산자
참이면 true를, 거짓이면 false를 결과로 반환한다.
4.2 등가비교 연산자 == !=
두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다.
문자열의 비교
두 문자열을 비교할 때는, 비교 연산자 ‘==’대신 equals()라는 메서드를 사용해야 한다.
equals()는 객체가 달라도 내용이 같으면 true를 반환한다.
대소문자를 구별하지 않고 비교하고싶으면 equalsIgnoreCase()를 사용
5. 논리 연산자
둘 이상의 조건을 ‘그리고(AND)’나 또는(OR)’으로 연결하여 하나의 식으로 표현할 수 있게 해준다.
5.1 논리 연산자 - &&, ||, !
&&(AND결합)
- 두 피연산자(양쪽 피연산자)가 모두 true일 때만 true를 결과로 얻는다.
||(OR결합)
- 두 피연산자 중 어느 한 쪽만 true이어도 true를 결과로 얻는
자주 사용될만한 몇 가지 예를 통해서 실제 논리연산자 어떻게 사용되는지, 주의할점 등
① x는 10보다 크고, 20보다 작다.
x > 10 && x < 20 //10 < x && x < 20도 가능(가독성면)
② i는 2의 배수 또는 3의 배수이다.
i%2 == 0 || i%3 == 0
③ i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
( i%2 == 0 || i%3 == 0 ) && i%6 != 0
&&가 ||보다 우선순위가 높아서 괄호 사용 &&가 먼저 사용되더라도 괄호를 사용해서 우선순위를 명확히 해주는 것이 좋다.
④ 문자 ch는 숫자(’0’~’9’)이다.
‘0’ <= ch && ch <= ‘9’
효율적인 연산(short circuit evaluation)
||는 좌측 피연산자가 true이면 우측 피연산자의 값은 평가하지 않는다.
&&도 좌측 피연산자가 false이면 우측 피연산자는 평가하지 않는다.
그래서 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있는 것
논리 부정 연산자 !
이 연산자는 피연산자가 true이면 false를, false이면 true를 결과로 반환한다.
간단히 말해서 true를 false로 바꾸는 것이다.
x | !x |
true | false |
false | true |
어떤 값에 논리 부정 연산자’!’를 반복적으로 적용하면, 참과 거짓이 차례대로 반복된다.
전원 버튼과 같은 ‘토글 버튼(toggle button)’을 논리적으로 구현할 수 있다.
6. 그 외의 연산자
6.1 조건 연산자 ? :
조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.
result = ( x > y ) ? x : y ;
위의 문장식에서 식’x>y’의 결과가 true이면, 변수 result에는 x의 값이 저장되고, false이면 y의 값이 저장된다.
6.2 대입 연산자 = op=
대입 연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.
이 연산자는 오른쪽의 피연산자의 값(식이라면 평가값)을 왼쪽 피연산자에 저장한다. 그리고 저장된 값을 연산결과로 반환한다.
대입 연산자는 연산자들 중에서 가장 낮은 우선순위를 가지고 있기 때문에 식에서 제일 나중에 수행된다.
출처 : 남궁성. 「자바의 정석」. 도우출판. 2016
'프로그래밍언어 > Java' 카테고리의 다른 글
[자바의 정석] 06. 객체지향 프로그래밍Ⅰ(2) (0) | 2023.07.31 |
---|---|
[자바의 정석] 06. 객체지향 프로그래밍Ⅰ(1) (0) | 2023.07.29 |
[자바의 정석] 05. 배열(Array) (0) | 2023.07.28 |
[자바의 정석] 04. 조건문과 반복문 (0) | 2023.07.27 |
[자바의 정석] 02. 변수(Variable) (0) | 2023.07.26 |