# JAVA] Ch 03. 연산자

uuuu.jini·2022년 1월 25일
0

JAVA -자바의 정석

목록 보기
2/18
post-thumbnail

깃허브 링크

목차

  1. 연산자
  2. 단항 연산자
  3. 산술 연산자
  4. 비교 연산자
  5. 논리 연산자
  6. 그 외의 연산자

1. 연산자[Operator]

연산자는 연산ㅇ르 수행하는 기호를 말한다.

1.1] 연산자와 피연산자

연산의 대상을 피연산자(operand)라고 한다. 상수,변수,리터럴,수식 등이 올 수 있다. 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환한다.

1.2] 식과 대입연산자

연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것을 이라고 한다. 식의 결과값을 변수와 같이 저장할수 있는 공간에 저장하기 위해 대입연산자(=) 을 사용한다. 이 변수를 다른곳에 사용하거나 출력하는 등의 결과를 얻을 수 있다.

1.3] 연산자의 종류

  • 산술 연산자 : +-*/%<<>>
  • 비교 연산자 : > < >= <= == !=
  • 논리 연산자 : && || ! & | ^ ~
  • 대입 연산자: =
  • 기타 : (type), ?: , instanceof

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

피연산자의 개수로 연산자를 분류하기도 한다. 하나면 단항 연산자 두개면 이항 연산자 세개면 삼항 연산자라고 부른다. 대부분의 연산자는 이항연산자이며 ?: 만 삼항연산자 이다.

1.4] 연산자의 우선순위와 결합규칙

연산자는 우리의 상식선에서 동작한다.

연산자의 결합규칙

같은 우선순위의 연산자가 식에 여러개 존재하는 경우에는 연산자의 결합규칙 을 사용한다. 대부분 왼쪽에서 오른쪽의 순서로 수행하고, 단항 연산자와 대입 연산자만 그 반대(오른쪽에서 왼쪽)로 동작한다.

[연산자의 우선순위]
1. 산술 > 비교 > 논리 > 대입
2. 단항 > 이항 > 삼항
3. 단항/대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

1.5] 산술 변환 ( usual arithmetic conversion )

이항 연산자는 두 피연산자의 타입이 같아야 하므로 다른 타입의 연산이 수행되려면 형변환을 통해 타입을 맞추어 주어야 한다.

int i = 10;
flaot f = 20.0f;
float result = f + (float)i; // 형변환

대부분, 두 피연산자의 타입 중에 더 큰 타입으로 일치시킨다. 작은 타입으로의 형변환은 값이 손실될 가능성이 있다. 더 큰 타입으로 형변환하는 경우에는 형변환을 생략할 수 있다. 이렇게 자동으로 형변화이 되는 것을 산술 변환 또는 일반 산술 변환 이라 한다. 이 변환은 단항 연산에서도 일어난다.
[산술 변환의 규칙]
1. 두 피연산의 타입을 같게 일치 시킨다. ( 보다 큰 타입으로 일치 )
2. 피연산자의 타입이 int보다 작을 경우 int로 변환된다. 예) byte + short -> int + int -> int

연산결과의 타입은 피연산자의 타입과 일치한다. 즉 int/int = int 이므로 5/2 의 결과는 2.5가 아닌 int 형인 2가 된다. 2.5라는 실수 결과를 얻으려면 두 피연산자 중 하나를 float으로 형변환을 해주어야 한다.


2. 단항 연산자

2.1] 증감 연산자 ++ --

피연산자의 값을 1 증가 또는 감소시킨다. 정수 실수 모두 가능하지만 상수는 값을 변경할수 없으므로 가능하지 않다. 대입연산자와 증감연산자만 피연산자의 값을 변경시킨다. 종류에는 전위형(Prefis)와 후위형(Postfix) 가 있으며, 전위형은 값이 참조되기 전에 증가(감소)하고 후위형은 값이 참조되고 난 이후에 증가(감소)한다. 즉, 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 차이가 없다.

이클립스 실행 단축키 : Ctrl + f11

식에 두번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 한다.

2.2] 부호 연산자 + -

피연산자의 부호를 반대로 변경한 결괄르 반환하는 - 연산자 와 아무 역할을 하지 않는 +연산자가 있다. boolean형과 char형을 제외한 모든 기본형에 사용할 수 있다.


3. 산술 연산자

3.1] 사칙 연산자 + - / *

정수간의 나머지 연산에서 0으로 나눌 경우 에러가 발생할 수 있다. ( 3/0 -> 에러)

3.2] 나머지 연산자 %

왼쪽의 피연산자를 오른쪽의 피연산자로 나누고 남은 나머지 값을 결과로 반환한다. 나누는 수를 0으로 사용할 수 없다. 나머지 연산자는 나누는 수로 음수를 받을 수 있지만 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지의 결과와 같다.


4. 비교 연산자

연산자의 결과는 false또는 true 이다. 비교연산자도 다른 타입간의 연산이 이루어질 경우 큰 타입으로 형변환된 후 연산이 수행된다.

4.1] 대소 비교 연산자 > < >= <=

boolean 형은 제외한 모든 자료형에 다 사용할 수 있지만 참조자료형에는 사용할 수 없다.

4.2] 등가비교 연산자 == !=

기본형,참조형 등 모든 자료형에 사용이 가능하다. 기본형과 참조형의 형변환은 가능하지 않기 때문에 등가비교 연산자로 비교할 수 없다. 정수형과 달리 실수형은 근사값이기 때문에 오차가 발생할 수 있다. 0.1 과 0.1f는 같지 않다.

float f= 0.1f; // f에 0.10000001490.. 로 저장
double d = 0.1; // d에 0.100000000..1로 저장

float에서 double로 형변환을 할 경우 가수의 빈자리를 0으로 채울 뿐 그 값이 변경되지는 않는다. 즉 float형과 double형을 비교하기 위해서는 double을 float으로 형변환한 후에 비교를 수행해야 한다. 또는 어느정도 오차를 무시하고 두 타입의 값을 앞의 몇 자리만 잘라서 비교할 수 도 있다.

문자열의 비교

비교 연산자 == 대신에 equals()메서드를 사용하여야 한다. 비교연산자는 두 문자열이 완전히 같은 것인지 비교하므로 문자열의 내용이 같은지 비교하기 위해서는 equals()를 사용하는 것이다. 즉 비교연산자는 객체가 같은지를 비교한다. equals()는 객체가 달라도 문자열 내용이 같을 경우 true를 반환한다. 대소문자를 구별하지 않고 비교하고 싶으면 equalsIgonoreCase()를 사용한다.


5. 논리 연산자

5.1] 논리연산자 && || !

&&는 AND에 해당하며 모두 true일때 true를 반환한다. || 는 OR에 해당하며 둘 중 하나만 True이면 true를 반환한다. 피연산자로 boolean형 또는 boolean형을 결과로 하는 조건식만을 허용한다. && 가 || 보다 우선순위가 높다.

효율적인 연산

Or 연산의 경우 왼쪽의 결과가 참일 경우 오른쪽 연산은 하지 않는다. And의 경우 오른쪽이 거짓일 경우 왼쪽의 검사를 하지 않는다. 그래서 or연산의 경우 참일 확률이 높은 피연산자를 왼쪽에 두고 and연산의 경우 거짓일 확률이 높은 피연산자를 왼쪽에 두면 더 빠른 결과를 얻을 수 있다.

논리 부정 연산자 !

true이면 false를 false이면 true를 반환한다.

5.2] 비트 연산자 & | ^ ~ << >>

피연산자를 비트 단위로 논리 연산한다.

  • OR ( | ) : 한쪽의 값이 1일 경우 1, 특정 비트의 값을 변경하는 경우 사용한다.
  • AND ( & ) : 둘 값이 모두 1일 경우 1, 특정 비트의 값을 뽑아 낼때 사용한다.
  • XOR ( ^ ) : 서로 다른 경우 1, 간단한 암호화에 사용한다.
  • 비트 전환 연산자 ( ~ ) : 0은 1로 1은 0으로 바꾼다. 1의 보수 연산자 라고도 한다.
  • 쉬프트 연산자 ( >> << ) : 오른쪽 또는 왼ㅉ고으로 이동한다고 하여 쉬프트 연산자라고 이름 붙여졌다. 8 << 2 인경우 2칸 왼쪽으로 이동한 8의 2진수값이 결과로 나온다. 오른쪽으로 쉬프트 하는 경우에는 음수 유지를 위하여 해당 값이 음수일경우 왼쪽의 빈값을 1로 채운다. 양수인 경우 0으로 채운다.

6. 그 외의 연산자

6.1] 조건 연산자 ?:

조건식?식1:식2 : 조건이 만족할 경우 식 1이 아닐경우 식 2가 실행된다. 두 피연산자의 타입이 다른 경우 형변환이 일어난다.

6.2] 대입 연산자 = op=

오른쪽 피연산자의 값을 왼쪽 피연산자에 저장한다. 저장된 값을 결과로 반환한다. 우선순위가 제일 낮으며 오른쪽에서 왼쪽으로 수행된다. rvalue는 변수뿐만 아니라 식이나 상수 등 모두 가능하지만 lvalue는 변수처럼 값을 변경할 수 있는 것이어야한다. final 을 붙일 경우 상수가 된다.
복합 대입 연산자 는 다른 연산자와 결합하여 op=와 같은 방식으로 사용 될 수 있다. 예로 a+=b 는 a = a+b 라는 의미이다.

profile
멋쟁이 토마토

0개의 댓글