1. 연산자(Operator)
- 연산자는 연산을 수행하는 기호를 말한다.
- 자바에서는 사칙연산을 비롯해서 다양한 연산자들을 제공하낟.
1.1 연산자와 피연산자
연산자: 연산을 수행하는 기호
피연산자: 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
- 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.
2.3 식과 대입 연산자
연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것을 식(expression)이라 한다.
식을 계산하여 결과를 얻는 것을 ‘식을 평가(evaluation)한다고 한다.
- 작성한 식을 프로그램에 포함시키려면 식의 끝에
;
을 붙여 문장으로 만들어야 한다.
2.4 연산자의 종류
종류 | 연산자 | 설명 |
---|
산술 연산자 | + - * / % << >> | 사칙 연산과 나머지 연산 |
비교 연산자 | > < ≥ ≤ == ≠ | 크고 작음과 같고 다름을 비교 |
논리 연산자 | && | |
대입 연산자 | = | 우변의값을 좌변에 저장 |
기타 | (type) ?: instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
피연산자 개수에 의한 분류
- 피연산자의 개수에 따라 n항 연산자라고 부른다.
- 삼항 연산자는 오직
? :
뿐이다.
- 피연산자의 개수로 부호 연산자를 구분할 수도 있다.
- 연산자를 기능별, 피연산자의 개수별로 나누어 분류하는 것은 ‘연산자의 우선순위’때문이기도 하다.
- 연산자마다 우선순위가 다르지만, 같은 종류의 연산자들은 우선순위가 비슷하기 때문에 각 종류별로 우선순위를 외우면 기억하기 더 쉽다.
1.4 연산자의 우선순위와 결합규칙
연산자의 결합규칙
- 연산자마다 다르지만, 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행하고, 단항 연산자의 대입 연산자만 그 반대로, 오른쪽에서 왼쪽의 순서로 연산을 수행한다.
연산자의 우선순위
- 산술 > 비교 > 논리 > 대입
- 단항 > 이항 > 삼항
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행 방향은 왼쪽에서 오른쪽이다.
1.5 산술변환(usual arithmetic conversion)
- 이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르다면 연산 전 형변환 연산자로 타입을 일치시켜야 한다.
- 대부분의 경우 피연산자의 타입 중 더 큰 타입으로 일치시킨다.
- 연산 전에 피연산자의 타입을 일치시키기 위해 자동 형변환 되는 것을 ‘산술변환’ 혹은 ‘일반 산술 변환’이라 하며, 이 변환은 이항 연산에서만 아니라 단항 연산에서도 일어난다.
- 연산 결과의 타입은 피연산자의 타입과 일치한다.
산술변환 정리
- 연산 수행 직전에 발생하는 피연산자의 자동 형변환
- 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로)
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
2. 단항 연산자
2.1 증감 연산자 ++ —
- 피연산자에 저장된 값을 1 증가 혹은 감소시킨다.
- 피연산자의 왼쪽에 위치하면 전위형(prefixe), 오른쪽에 위치하면 후위형(postfix)라고 한다.
- 전위형은 변수의 값을 먼저 증가시킨 후 변수의 값을 읽어옴
- 후위형은 변수의 값을 먼저 읽어온 후에 값을 증가시킨다.
- 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야한다.
2.2 부호연산자 + -
-
: 피연산자의 부호를 반대로 변경
- boolean형과 char형을 제외한 기본형에만 사용할 수 있다.
3. 산술 연산자
3.1 사칙 연산자 + - * /
- 피연산자가 정수형인 경우 나누는 수로 0을 사용할 수 없다.
- 실행시 에러(Runtime Error)가 발생한다.
- 정확히는 ArithmeticException이 발생할 수 있다.
- 나눗셈을 진행하는 경우 값 손실을 피하기 위해 피연산자 중 한쪽이라도 실수형으로 형변환 해야한다.
- 리터럴 간의 연산은 컴파일러가 컴파일 시 계산해서 변수에 저장한다.
- 수식에 변수가 들어가 있는 경우 컴파일러가 미리 계산을 할 수 없다. 따라서 명시적 형변환 해야한다.
int/int
의 결과는 float, double이 아닌 int이다. 이 과정에서 나머지를 버림하게 된다.
- 반올림이 필요하면
Math.round()
써라.
3.2 나머지 연산자 %
- 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지값을 결과로 반환하는 연산자이다.
- 나누는 수로 0을 사용할 수 없다.
- 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.
4. 비교 연산자
- 비교 연산자는 두 피연산자를 비교하는데 사용되는 연산자이다.
- 주로 조건문과 반복문의 조건식에서 사용됨.
- true, false 두가지 연산 결과를 가진다.
- 이항 연산자이므로 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후 비교한다.
4.1 대소비교 연산자 < > ≤ ≥
4.2 등가비교 연산자 == ≠
- 두 피연산자의 값이 같은지 다른지 비교하는 연산자.
- 기본형의 경우 변수에 저장되어 있는 값이 같은지 비교한다.
- 참조형의 경우 객체의 주소값이 같은지(같은 객체를 가리키고 있는지)를 비교한다.
- 기본형과 참조형은 서로 형변환이 불가능하므로 등가비교 연산자로 비교할 수 없다.
- 실수형은 근사값으로 저장되어 오차가 발생할 수 있다. 특히 실수형과 정수형을 비교하는 경우 발생할 수 있다. (10.0 ≠ 10.0f)
- 실수형 간의 비교에서 float을 기준으로 형변환시켜 비교해야 한다.
- float타입의 값을 double타입으로 형변환해도 오차가 적어지지 않는다.
- 빈 부분을 0 혹은 1로 채우기 때문.
문자열의 비교
- 두 문자열을 비교할 때는 비교 연산자
==
대신 equals()
라는 메서드를 사용해야한다.
- 두 문자열의 내용이 같은지 비교하기 위해
equals()
를 사용한다.
- 대소문자 구분하지 않고 비교하고 싶다면
equalsIgnoreCase()
를 사용할 수 있다.
5. 논리 연산자
- 둘 이상의 조건을 AND나 OR로 연결하여 하나의 식으로 표현할 수 있게 해준다.
5.1 논리 연산자 && || !
- 피연산자로 boolean형 혹은 boolean형 값을 결과로 하는 조건식만 허용한다.
- || (OR) : 피연산자 중 어느 한쪽만 true여도 true
- && (AND): 피연산자 양쪽 모두 true여야 true
효율적인 연산(short circuit evaluation)
- 논리 연산자는 효율적인 연산을 한다.
- OR의 경우 좌측 피연산자가 참이면 우측 피연산자의 값은 평가하지 않는다.
- AND의 경우 좌측 피연산자가 거짓이면 우측 피연산자의 값은 평가하지 않는다.
논리 부정 연산자 !
5.2 비트 연산자 & | ^ ~ << >>
- 피연산자를 비트단위로 논리연산한다.
- | (OR) : 피연산자 중 한 쪽의 값이 1이면 1을 결과로 얻는다. 아니면 0
- & (AND): 피연산자 양쪽이 모두 1이여야만 1을 결과로 얻는다. 아니면 0
- ^ (XOR): 두 연잔자의 값이 서로 다르면 1, 아니면 0
비트 전환 연산자 ~
- 피연산자를 2진수로 표현했을 때 0은 1로, 1은 0으로 바꾼다. 논리 부정 연산자와 유사.
- 1의 보수를 얻을 수 있다.
- 이 때문에 비드 전환 연산자를 1의 보수 연산자라고도 한다.
쉬프트 연산자 << >>
- 오른쪽 혹은 왼쪽으로 이동하는 연산자.
- x >> n : x / 2^n
- x << n : x * 2^n
6. 그 외의 연산자
6.1 조건 연산자 ? :
- 삼항 연산자는 조건 연산자 뿐.
- 조건식 ? 식1 : 식2
- 조건식이 참이면 식1을 수행한다.
- 조건식이 거짓이면 식2를 수행한다.
- if문으로 간단하게 이해할 수 있다.
6.2 대입 연산자 = op=
- 변수와 같은 저장 공간에 값 또는 수식의 연산 결과를 저장하는데 사용.
- 오른쪽 피연산자의 값(식이라면 평가값)을 왼쪽 피연산자에 저장한다.
- 저장된 값을 연산 결과로 반환한다.
- 연산자들 중 가장 낮은 우선순위를 가진다.
l-value와 r-value
- l-value: 왼쪽 피연산자
- 반드시 변수처럼 변경할 수 있는 것이어야 한다.
- 리터럴이나 상수같이 값을 저장할 수 없는 것들은 l-value가 될 수 없다.
- r-value: 오른쪽 피연산자
- 변수 뿐만 아니라 식이나 상수 등 모두 가능하다.
복합 대입 연산자
- 대입 연산자는다른 연산자(op)와 결합하여
op=
와 같은 방식으로 사용할 수 있다.
- +=, -=, 등등