연산자는 '연산을 수행하는 기호'를 말한다.
이 챕터에서는 흔히 우리가 알고 있는 산술 연산자 (사칙연산) 외에 비교 연산자, 논리 연산자, 대입 연산자 등을 배워 볼 것이다.
산술 연산자 + - * / 와 %
산술 연산자에는 사칙 연산자와 나머지 연산자가 있다.
사칙 연산자는 덧셈 뺄셈 곱셈 나눗셈 으로 우리가 익히 알고 있는 것들이다. 프로그래밍 관점에서 봐야할 부분만 짚고 넘어가자.
위와 같은 이유들로 올바른 연산결과를 얻기 위해서는 두 피연산자의 타입이 일치하여야 한다는 것을 알 수 있다.
class OperatorEx6 {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
}
}
이 코드를 실행하면
다음과 같은 에러가 발생한다
이 에러가 뜬 이유는 'int형 보다 작은 연산자들의 연산결과는 int 형으로 반환된다' 라는 성질 때문이다. 즉, byte a 와 byte b의 연산결과는 자동으로 int형으로 변환되어 int형 a+b가 되어 버리기 때문에 byte형 c의 변수에 대입 할 수 없는 것이다.
이를 해결하기 위하여 byte c = (byte) (a+b)와 같이 명시적으로 자료형의 타입을 알려주는 작업이 필요하다.
또한 작은 자료형의 타입들의 연산을 할 때 값 손실을 예방하기 위하여 충분히 큰 자료형을 사용해서 연산하는 것을 잊지 않아야 한다.
나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다.
그리고 나눗셈에서와 같이 나누는 수로 0을 사용할 수 없다는 점에 주의하자. 나머지 연산자는 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.
ex) 10 % 8 = 2
비교 연산자 < > <= >= == !=
두 피연산자의 값의 크기를 비교하는 연산자이다.
연산의 결과가 참이면 true를 거짓이면 false를 반환한다.
주의할 점은 참조형에서는 사용할 수 없다는 것이다.
또한 <= >=와 같은 연산자는 =가 꼭 오른쪽에 있어야 함을 주의하자.
두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다.
대소비교 연산자와는 달리, 기본형은 물론 참조형 즉 모든 자료형에 사용이 가능하다. 기본형의 경우에는 변수에 저장되어 있는 값이 같은지 판별 가능하고 참조형의 경우에는 두 개의 참조변수가 같은 객체를 가리키고 있는지 알 수 있다.
==는 같으면 참, 다르면 거짓
!=는 다르면 참, 같으면 거짓
두 문자열을 비교할 때는 비교연산자 '==' 대신 equals() 라는 메서드를 사용해야 한다.
비교연산자는 두 문자열이 완전히 같은 것인지(주솟값)를 비교하는 것이고, equals() 메서드는 단순히 문자열의 내용이 같은 것인지 비교하는 것이다.
String str = new String("abc");
//equals()는 두 문자열의 내용이 같으면 true, 다르면 false 반환
boolean result = str.equals("abc");
//문자열 str와 ()안에 들은 문자열의 내용을 비교
//내용이 같으므로 result에 true가 저장됨
String 은 원래 클래스이므로 new로 객체를 생성해서 사용해주어야 한다.
논리 연산자
'x가 4보다 작다' 라는 조건은 비교연산자를 써서 'x<4'와 같이 표현할 수 있다. 더 나아가서 x는 4보다 작거나 또는 10보다 크다 와 같이 두개의 조건이 결합된 경우를 표현하기 위해 사용하는 것이 논리 연산자이다. 논리 연산자는 둘 이상의 조건을 '그리고(AND)' 나 '또는(OR)'으로 연결하여 하나의 식으로 표현하게 한다.
|| (OR결합) 피연산자 중 어느 한쪽만 참이면 참을 반환
&& (AND결합) 피연산자 양쪽 모두 참이여야 참을 반환
예를 몇가지 들어보자
논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것이다.
OR연산 '||'의 경우, 두 피 연산자 중 어느 한쪽만 '참'이어도 전체 연산결과가 '참'이므로 좌측 피연산자가 참이면 우측 연산자의 결과는 보지 않는다.
->x가 참이면, x || y 는 항상 참이다.
AND 연산 '&&'의 경우도 어느 한쪽만 '거짓'이어도 전체 연산결과가 '거짓이므로' 좌측 피연산자가 거짓이면 우측 연산자의 결과는 보지 않는다.
->x가 거짓이면, x && y는 항상 거짓이다.
그래서 같은 조건식이라도 피연산자의 위치에 따라 연산속도가 달라질 수 있으므로, 식을 세울 때 효율적인 연산을 고안하여 짜도록 주의하자.
이 연산자는 피연산자가 참이면 거짓을, 거짓이면 참을 결과로 반환한다. 간단히 말해 참과 거짓의 결과를 바꾸는 것이다.
논리 부정 연산자 ! 가 주로 사용되는 곳은 조건문과 반복문의 조건식이며, 이 연산자를 잘 이용하면 조건식이 보다 이해가 쉬워진다. 이 논리 부정 연산자를 적절히 이용하도록 하자.
그 외의 연산자
조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.
조건식 ? 식1 : 식2
-> 조건식이 참이면 식1이 연산결과, 거짓이면 식2가 연산결과
이를 식으로 나타내면
result = (x > y) ? x : y ;
-> x가 y보다 크면 result에 x대입, 작으면 result에 y대입한다.
조건 연산자는 조건문인 if문으로 바꿔쓸 수 있으며, if문 대신 조건 연산자를 사용하면 코드를 보다 간단히 할 수 있으므로 많이 사용된다.
대입 연산자 =
대입 연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.
이 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장한다.
대입 연산자는 연산자들 중에서 가장 낮은 우선순위를 가지고 있기 때문에 식에서 가장 나중에 수행된다. 또한 진행 방향이 지금까지와 다른 오른쪽에서 왼쪽이므로 이를 주의하자.
x = y = 3;
식에서 y=3이 제일 먼저 그 다음이 x=y이 수행된다.
연산자 우선순위
위에서 연산자의 종류를 살펴보았고 이번에 볼 내용은
식에 사용된 연산자가 둘 이상인 경우, 연산자의 순서를 알아보는 것이다.
연산자의 우선순위는 사칙연산의 법칙에 따라 대부분 상식 선에서 해결이 되지만 그 외의 것들을 알아보자.
다음 표를 보고 간단히 정리하면 이렇다.