연산자란? |
연산자는 '연산을 수행하는 기호'를 말한다.
연산자
- y = x + 3
연산자(operator): + [연산을 수행하는 기호(+,-,*,/ 등)]
피연산자(operand): x, 3 [연산자의 작업 대상(변수, 상수, 리터럴, 수식)]
식(expression): x + 3 [연산자와 피연산자를 조합하여 계산하고자하는 바를 표현한 것]
대입 연산자: = [변수와 같이 값을 저장할 수 있는 공간에 결과를 저장하기 위해 사용]
연산자의 종류
종류 | 연산자 | 설명 |
산술 | +, -, *, /, % | 사칙연산과 나머지 연산 |
비교 | ==, !=, >, <, >=, <= | 크고 작음과 같고 다름을 비교 |
논리 | !, &, |, &&, ||, ^, ~ | 논리적 연산 |
대입 | = | 우변의 값을 좌변에 저장 |
기타 | (type) ? : instanceof | 형변환 연산자, 삼항 연산자, instanceof 연산자 |
연산자의 결합규칙
- 산술 > 비교 > 논리 > 대입은 제일 마지막에 수행된다.
- 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
산술변환
연산 수행 직전에 발생하는 피연산자의 자동 형변환
- 두 피연산자의 타입을 같게 일치시킨다(보다 큰 타입으로 일치).
- 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
단항 연산자 |
증감 연산자 ++ --
증가 연산자(++): 피연산자의 값을 1 증가시킨다.
감소 연산자(--): 피연산자의 값을 1 감소시킨다.
타입 | 설명 | 사용예 |
전위형 | 값이 참조되기 전에 증가시킨다. | j = ++i; |
후위형 | 값이 참조된 후에 증가시킨다. | j = i++; |
산술 연산자 |
산술 연산자는 사칙 연산자와 나머지 연산자가 있다.
사칙 연산자(+ - * /)
byte a = 10;
byte b = 20;
byte c = a + b; <- 컴파일 에러
연산 시 byte형이 int형으로 변환 되었고 변환 된 int형을 byte에 넣으려고 하니까 컴파일 에러가 남
byte a = 10;
byte b = 20;
byte c = (a * b);
System.out.println(c); //44
결과값이 byte형의 범위인 '-128 ~ 127'의 범위를 넘는 값이므로 값 손실이 일어남
int a = 1_000_000;
int b = 2_000_000;
long c = a * b;
System.out.println(c); //-1454759936
long형의 범위는 2조를 담기에 충분하지만 int형끼리의 연산 결과는 int형이므로 다른 결과값이 나오게 됨
long a = 1_000_000 * 1_000_000;
long b = 1_000_000 * 1_000_000L;
System.out.println(a); //-727379968
System.out.println(b); //1000000000000
이 또한 연산의 결과가 int형이므로 다른 결과값이 출력
long a = 1000000 * 1000000 / 1000000;
long b = 1000000 / 1000000 * 1000000;
System.out.println(a); //-727
System.out.println(b); //1000000
연산 결과에 따라서도 값이 바뀔 수가 있음
char c1 = 'a';
char c2 = c1 + 1; <- 컴파일 에러
char c3 = (char)(c1 + 1); //'b'
char c4 = 'a' + 1; //'b'
char c2 = c1 + 1; 은 결과값이 int형이기 때문에 컴파일 에러가 난다. 따라서 c3으 과정처럼 형변화을 해주어야 한다.
하지만 char c4 = 'a' + 1;은 왜 에러가 나지 않는 것일까. 바로 'a' + 1이 리터럴 간의 연산이기 때문이다. 리터럴 간의 연산은 실행 과정동안 변화는 값이 아니기 때문에, 컴파일러가 미리 연산을 하고 대체하여 적용한다.
나머지 연산자(%)
나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다. 나누는 수로 0을 사용할 수 없다.
비교 연산자 |
비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며, 여산결과는 오직 true와 false 둘 중의 하나이다. 비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형 변환하여 피연산자의 타입을 일치시킨 후에 비교한다.
대소비교 연산자(<, >, <=, >=)
두 피연산자의 값의 크기를 비교하는 연산자이다. 참이면 true를 거짓이면 false를 결과로 반환한다. 기본형 중에서는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.
등가비교 연산자(==, !=)
두 피연산자의 값의 크기를 비교하는 연산자이다. 모든 자료형에 사용 가능.
※문자열의 비교
두 문자열을 비교할 때는, 비교 연산자 '=='대신 equals()라는 메서드를 사용해야 한다.
String str = new String("abc");
boolean result = srt.equals("abc");
논리 연산자 |
논리 연산자는 둘 이상의 조건을 '그리고(AND)'나 또는(OR)으로 연결하여 하나의 식으로 표현할 수 있게 해준다.
논리 연산자(&&, ||, !)
|| (OR결합): 피연산자 중 어느 한 쪽만 true이면true를 결과로 얻는다.
'참'일 확률이 높은 피연산자를 왼쪽에 두는게 연산 속도가 빠름
&&(AND결합): 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
! 논리 부정 연산자: 피연산자가 true이면 false를, false면 true를 결과로 반환한다.
비트 연산자(&, |, ^, ~, <<, >>)
| (OR연산자): 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&(AND연산자): 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^(XOR연산자): 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.
~(비트 전환 연산자): 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다.
<< >> (쉬프트 연산자): 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동한다
x >> n은 x * 2의n승의 결과와 같다
x >> n은 x / 2의n승의 결과와 같다
그 외의 연산자 |
조건 연산자( ? : )
result = (x > y) ? x(참) : y(거짓);
대입 연산자( =. operator= )
=, += 등..
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA 이론] 객체지향 프로그래밍_1 (2) | 2022.01.19 |
---|---|
[JAVA 이론] 배열 (0) | 2022.01.15 |
[JAVA 이론] 조건문과 반복문 (0) | 2022.01.12 |
[JAVA 이론] 변수 (0) | 2021.12.16 |
[JAVA 이론] 자바 (0) | 2021.12.15 |