자바의 정석 Chapter 03 연산자

Taww·2022년 1월 1일
0

연산자

연산자는 '연산을 수행하는 기호'를 말한다.
이 챕터에서는 흔히 우리가 알고 있는 산술 연산자 (사칙연산) 외에 비교 연산자, 논리 연산자, 대입 연산자 등을 배워 볼 것이다.

산술 연산자 + - * / 와 %

산술 연산자에는 사칙 연산자와 나머지 연산자가 있다.

사칙 연산자

사칙 연산자는 덧셈 뺄셈 곱셈 나눗셈 으로 우리가 익히 알고 있는 것들이다. 프로그래밍 관점에서 봐야할 부분만 짚고 넘어가자.

  • 피연산자가 정수형인 경우, 나누는 수로 0을 사용 할 수 없다.
  • 나누기 연산자의 두 피연산자가 모두 int 타입일 경우, 연산결과 역시 int 타입이므로, 예를 들어 5/2 의 값은 2.5가 아닌 int형 2로 정수만 남고 소수점 이하는 버려진다

위와 같은 이유들로 올바른 연산결과를 얻기 위해서는 두 피연산자의 타입이 일치하여야 한다는 것을 알 수 있다.

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결합) 피연산자 양쪽 모두 참이여야 참을 반환

예를 몇가지 들어보자

  1. x는 10보다 크고, 20보다 작다.
    -> x>10 과 x<20 이 그리고 로 연결된 조건이므로
    x > 10 && x< 20으로 쓸 수 있다.
  2. x는 2의 배수 또는 3의 배수이다.
    -> x%2 == 0 과 x%3 == 0 이 또는 으로 연결된 조건이므로
    x % 2 == 0 || x % 3 == 0으로 쓸 수 있다.

효율적인 연산

논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것이다.

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이 수행된다.

연산자 우선순위

위에서 연산자의 종류를 살펴보았고 이번에 볼 내용은
식에 사용된 연산자가 둘 이상인 경우, 연산자의 순서를 알아보는 것이다.

연산자의 우선순위는 사칙연산의 법칙에 따라 대부분 상식 선에서 해결이 되지만 그 외의 것들을 알아보자.

다음 표를 보고 간단히 정리하면 이렇다.

  • 괄호의 우선순위가 제일 높다.
  • 산술 > 비교 > 논리 > 대입
  • 연산자의 연산 진행방향은 모두 왼쪽에서 오른쪽 (->) 이지만, 대입 연산자만 오른쪽에서 왼쪽 (<-) 이다.
  • ||는 &&보다 우선순위가 낮다. ( 한 식에 ||와 &&가 같이 쓰인다면 가급적 괄호를 이용하여 구분 지어주자 )
profile
미지근러,,

0개의 댓글