[JAVA] 연산자(Operator)

yejubi1531·2022년 8월 12일
0

JAVA를 잡아보자!

목록 보기
4/5


연산자(operator)

연산자(operator) : 연산을 수행하는 기호
피연산자(operand) : 연산자의 작업 대상 (변수,상수,리터럴,수식)

  • 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.
  • 작성한 식을 프로그램에 포함시키려면, 식의 끝에 ';'을 붙여서 문장으로 만들어야 한다.
  • 대입 연산자 '='를 사용해 변수와 같이 값을 저장할 수 있는 공간에 결과를 저장해야 다른 곳에 사용하거나 화면에 출력함과 같은 의미 있는 결과를 얻을 수 있다.
  • 값을 다른 곳에 사용하지 않을 것이라면 변수에 저장하기 않고 println메서드의 괄호( ) 안에 직접 식을 써 바로 출력해도 된다.

연산자의 종류

종류연산자설명
산술 연산자+ - * / % 사칙 연산과 나머지 연산
비교 연산자> < >= <= == !=크로 작음과 같고 다름을 비교
논리 연산자&& |∥ ! & ^ ~'AND'와 'OR' 조건 연결
대입 연산자=우변의 값을 좌변에 저장
기타(type) ?: instanceof형변환 연산자, 삼항 연산자, instanceof 연산자**

피연산자의 개수에 의한 분류

<피연산자 개수>

  • 한 개 : 단항 연산자
  • 두 개 : 이항 연산자 (대부분의 연산자는 이항 연산자)
  • 세 개 : 삼항 연산자 (?:)

연산자의 결합규칙

하나의 식에 같은 우선순위의 연산자들이 여러 개 있는 경우, 대부분 왼쪽에서 오른쪽( ->)의 순서로 연산을 수행하고, 단항 연산자와 대입 연산자만 반대로 오른쪽에서 왼쪽(<- ) 의 순서로 연산을 수행한다.

  1. 산술 > 비교 > 논리 > 대입.
    • 대입은 제일 마지막에 수행된다.
  2. 단항 > 이항 > 삼항
    • 단항 연산자의 우선순위가 이항 연산자보다 높다.
  3. 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽 ( -->)

산술 변환

두 피연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르면 연산 전에 형변환 연산자로 타입을 일치시켜야한다.

'산술 변환'의 규칙

  1. 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
  2. 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
  • 첫 번째 규칙은 피연산자의 값손실을 최소화하기 위함

  • 두 번째 규칙은 정수형의 기본 타입인 int가 가장 효율적으로 처리할 수 있는 타입이기 때문

    	- int보다 작은 char나 short의 표현범위가 좁아서 연산 중에 overflow가 발생할 가능성이 높다.
  • 연산결과의 타입은 피연산자의 타입과 일치한다.


단항 연산자

증감 연산자(++) : 피연산자의 값을 1 증가시킨다
감소 연산자(--) : 피연산자의 값을 1 감소시킨다

증감 연산자의 피연산자로 정수와 실수가 모두 가능하지만, 상수(재할당이 금지된 변수)는 값을 변경할 수 없으므로 불가능하다.

타입설명
전위형값 증가 후 참조j=++i;
후위형값 참조 후 증가j=i++;

※ 증감연산자가 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이가 없다. 반대로 다른 수식에 포함되거나 메서드의 매개변수로 사용된 경우, 즉 단독으로 사용되지 않은 경우 전위형(++i)과 후위형(i++)의 결과는 같다.

증감연산자를 사용하면 코드가 간결해지지만, 지나치면 코드가 복잡해서 이해하기 어려워지기도 한다.

x = x++ - ++x;

이렇게 작성하는 것은 바람직하지 않다. 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 한다.


부호 연산자

: 피연산자의 부호를 반대로 변경한 결과를 반환

  • boolean형과 char형을 제외한 기본형에만 사용할 수 있다.
  • 부호연산자 '+'는 하는 일이 없음
  • 부호연산자 '-'가 있어 형식적으로 추가해 놓은 것

산술 연산자

사칙 연산자 ( + - * / )

덧셈, 뺄셈, 곱셈, 나눗셈

나머지 연산자 ( % )

: 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환

  • 짝수, 홀수 또는 배수 검사 등에 주로 사용
  • 나누는 수로 음수도 허용 (부호는 무시)

비교 연산자

: 두 피연산자를 비교하는데 사용

대소비교 연산자 ( < > <= >= )

  • 주로 조건문과 반복문의 조건식에 사용
  • 결과는 True or False
비교연산자연산 결과
>좌변 값이 크면 true, 아니면 fasle
<우변 값이 크면 true, 아니면 fasle
>=좌변 값이 크거나 같으면 true, 아니면 fasle
<=좌변 값이 작거나 같으면 true, 아니면 fasle

등가비교 연산자 ( == != )

: 두 피연산자의 값이 같은지 또는 다른지를 비교

  • 모든 자료형에 사용 가능
  • 변수에 저장되어 있는지, 같은 객체를 가리키고 있는지 알 수 있음
  • 기본형과 참조형은 서로 형변환 불가능하기에 등가비교 연산자로 비교 불가능
비교연산자연산 결과
==두 값이 같으면 true, 아니면 fasle
!=두 값이 다르면 true, 아니면 fasle

문자열의 비교

두 문자열을 비교할 때

  • 비교연산자 '==' 대신 equals( )라는 메서드 사용
  • 두 문자열이 완전히 같은지 비교 (같으면 true, 다르면 false)
  • 대소문자를 구별하지 않고 비교하고 싶으면 equalsIgnoreCase( ) 사용

논리 연산자

: 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만 허용

|| (OR결합) : 한 쪽만 true ->결과 true
&& (AND결합) : 양쪽 모두 true -> 결과 true

  • 피연산자의 위치에 따라 연산속도가 달라질 수 있다.

논리 부정 연산자 !

토글 버튼을 논리적으로 구현할 수 있다.

true -> false , false -> true


비트 연산자 ( & | ^ ~ << >> )

※ 논리연산자와 헷갈리지 않기 (논리연산자 &&, 비트연산자 &)

  • 피연산자를 비트단위로 논리연산
  • 피연산자로 실수는 허용하지 않으며 정수(문자 포함)만 허용

| (OR 연산자) : 하나만 1이어도 결과로 1을 얻는다.
--> 주로 특정 비트의 값을 변경할 때 사용
& (AND 연산자) : 모두 1이어야 결과로 1을 얻는다.
--> 특정 비트의 값을 뽑아낼 때 사용
^ (XOR 연산자) : 값이 서로 다를때만 1을 결과로 얻는다. 같을 때는 0
--> 간단한 암호화에 사용

~ (비트 전환 연산자) : 피연산자를 2진수로 표현했을 때 0 -> 1 , 1 -> 0 으로 변경
--> 논리부정 연산자 '!' 와 비슷
--> '1의 보수'연산자 라고도 함

쉬프트 연산자 ( << >> ) : 피연산자의 각 자리(2진수로 표현했을 때)를 이동
--> 자리이동으로 저장범위를 벗어난 값들은 버려지고 빈자리른 0으로 채워짐
--> 음수인 경우 빈자리를 1로 채움

x << n // x * 2ⁿ의 결과와 같음
x >> n // x / 2ⁿ의 결과와 같음 

Q. 곱셈이나 나눗셈 연산자를 사용하면 같은 결과를 얻을 수 있음에도 왜 쉬프트 연산자를 사용하는가?
A. 연산시간이 더 적게 걸림 (더 빠름) + 코드의 가독성


조건 연산자 ( ?: )

조건식 ? 식1: 식2 ;

  • 첫 번째 피연산자인 조건식의 평가결과에 따라 다른 결과 반환
    조건식의 평가결과가 true: 식1, false: 식2가 연산 결과됨
  • 조건문인 if문으로 바꿔 쓸 수 있으며, 더 간단한 코드
  • 조건 연산자의 식1과 식2 (두 피연산자의 타입이 다른 경우), 산술 변환 발생

대입 연산자 (= op=)

  • 대입 연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용
  • 연산자 중 가장 낮은 우선순위
  • 연산 진행 방향: 오른쪽에서 왼쪽 (<-- )

lvalue와 rvalue

대입 연산자의 왼쪽 피연산자 'lvalue (left value)', 오른쪽 피연산자 'rvalue (right value)'

  • lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 함
  • 리터럴이나 상수는 lvalue가 될 수 없음 (값을 저장할 수 없기때문)

복합 대입 연산자

  • 다른 연산자(op)와 결합하여 사용 가능
  • 결합된 두 연산자는 반드시 공백 없이 붙여 써야함

i = i + 3
i += 3 ( O )
i + = 3 ( X )

profile
노력하는 중

0개의 댓글