1. 연산자(operator)
1-1) 연산자란?
- 연산자는 연산을 수행하는 기호를 의미한다.
1-2) 연산자와 피연산자
- 연산자와 연산을 수행하려면 반드시 연산의 대상이 있어야 하는데 이를 피연산자라 한다.
▶ 연산자 : 연사을 수행하는 기호 (+, -, *, / ...)
▶ 피연산자 : 연산자의 작업 대상
- 연산자는 피연산자로 연산을 수행하면 항상 결과값을 반환한다.
1-3) 식 (표현식, expression)
- 연산자와 피연산자를 조합하여 계산하고자 하는 바를 표현한 것을 식 또는 표현식이라고 한다.
1-4) 연산자의 종류
종류 | 연산자 | 설명 |
산술연산자 | +,-,*,/,%,<<,>> | 사칙 연산과 나머지 연산 |
비교연산자 | >,<,>=,<=,==,!= | 크고 작음과 같고 다름을 비교 |
논리연산자 | &&, ||, ~, &,^ | 그리고(AND)와 또는(OR)로 조건을 연결 |
대입연산자 | = | 우변의 값을 좌변에 저장 |
기타연산자 | (type), ? :, instanceof | 형변환연산자, 삼항연산자, instanceof 연산자 |
1-5) 연산자의 우선순위과 결합규칙
- 식에 사용된 연산자가 둘 이상일 경우, 연산자의 우선순위에 의해서 연산순서가 결정된다.
- 우선순위가 확실하지 않다면, 먼저 계산되어야 하는 부분을 괄호로 묶어주면 된다. (괄호안의 계산식이 제일 우선순위가 높다.)
- 연산자의 결합규칙은 왼쪽에서 오른쪽 순서지만, 대입연산자는 오른쪽에서 왼쪽으로 수행된다.
▶ 산술 > 비교 > 논리 > 대입순서로 진행, 대입은 제일 마지막에 실행
▶ 단항(1) > 이항(2) > 삼항(3) 순서로 진행
▶ 대입연산자는 연산의 진행방향이 오른쪽에서 왼쪽이다.
1-6) 산술변환
- 이항연산자는 두 연산자의 타입이 일치해야 연산이 가능하므로, 피연산자의 타입이 서로 다르면 연산 전에 형변환 연산자로 타입을 일치시켜야 한다.
- 대부분의 경우 두 피연산자의 타입 중 더 큰 타입으로 일치시키는데, 그 이유는 작은 타입으로 형변환하려면 원래의 값이 손실될 가능성이 있기 때문이다.
- 작은 타입에서 큰 타입으로 형변환하는 경우 자동으로 형변환 연산자를 생략할 수 있다.
① 두 피 연산자의 타입을 일치시킨다. (보다 큰 타입으로 일치)
long + int | 8byte + 4byte | long + long |
float + int | 4byte + 4byte | float + float (숫자 표현 범위가 float이 더 크다) |
double + float | 8byte + 4byte | double + double |
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
byte + short | 1byte + 2byte | int + int |
char + short | 2byte + 2byte | int + int |
1-7) 단항연산자(증감연산자)
++, --
- 증감연산자는 피연산자에 저장된 값을 1 증가 또는 1 감소시킨다.
- 일반적으로 단항연산자는 피연산자의 왼쪽에 위치하지만 증감연산자는 양쪽 모두 가능하다.
int num = 10;
num++; ++num; num--; --num;;
- 피연산자의 왼쪽에 위치하면 전위형(prefix), 피연산자의 오른쪽에 위치하면 후위형(postfix)라고 한다.
- 전위형과 후위형 모두 피연산자의 값을 1 증가 또는 1 감소 시키지만, 증감연산자가 수식이나 메소드 호출에 포함된 경우 전위형일때와 후위형일때의 결과가 다르다.
* 메소드 : 이름 뒤에 소괄호()
ex) System.out,println()
public static void main(String[] args) {}
1-8) 산술연산자
- 산술연산자에는 +,-,*,/ 와 나머지 연산자 % 가 있다.
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
1-9) 비교연산자
- 비교연산자는 두 연산자를 비교하는데 사용되는 연산자이다.
- 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true or false 이다.
- 비교연산자 역시 이항연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우 자료형의 범위가 큰 쪽으로 자동형변환되어 피연산자의 타입을 일치시킨 후에 비교한다.
① 대소비교연산자 >, <, >=, <=
비교연산자 | 연산결과 |
> | 좌변값이 크면 true, 아니면 false |
< | 좌변값이 작으면 true, 아니면 false |
>= | 좌변값이 크거나 같으면 true, 아니면 false |
<= | 좌변값이 작거나 같으면 true, 아니면 false |
② 등가비교연산자
- 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다.
- 기본형은 물론 참조형에서도 사용할 수 있다.
- 기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 저장하기 때문에 두 개의 피연산자가 같은 객체를 가리키고 있는지를 확인할 수 있다.
비교연산자 | 연산결과 |
== | 두 값이 같으면 true, 다르면 false |
!= | 두 값이 다르면 true, 다르면 false |
1-10) 논리연산자
- 논리연산자는 둘 이상의 조건을 '그리고(AND)나 또는 (OR)'으로 연결하여 하나의 식으로 표현할 수 있게 해준다.
① 논리연산자 &&, ||, !
|| | (OR결합) | 피연산자 중 어느 한쪽만 true 이면 true |
&& | (AND결합) | 피연산자 모두 true 이어야 true |
! | (NOT) | true -> false, false -> true |
- 효율적인 연산을 하기 위해서는 OR연산의 경우 연산결과가 참일 확률이 높은 피연산자를 왼쪽에 놓는게 좋다.
- AND 연산의 연산결과가 거짓일 확률이 높은 피연산자를 왼쪽에 놓는게 좋다.
② 비트연산자 &, |, ^, << , >>
1byte = 8bit
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
(ex)
10 ==> 00001010 (2 진수)
11 ==> 00001011 (2 진수)
25 ==> 00011001 (2 진수)
- 비트연산자는 어떤 변수의 값을 0과 1의 조합, 즉 비트로 변환한 뒤에 연산을 수행한다.
- 주요 비트연산자 &(AND), |(OR), ^(XOR), <<, >> (SHIFT)연산이 있다.
※ 종류
& | a & b | a와 b를 AND처리 (둘다 1이어야 1) |
| | a | b | a와 b를 OR처리 (둘 중 하나만 1이면 1) |
^ | a ^ b | a와 b를 XOR처리 (두 비트가 달라지면 1) |
<< | a << 2 | a를 비트로 변환하여 왼쪽으로 2비트 이동 |
>> | a >> 2 | a를 비트로 변환하여 오른쪽으로 2비트 이동 |
1-11) 그 외의 연산자
ⓛ 조건연산자 (삼항연산자)
- 조건연산자(삼항연산자)는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항연산자이며 조건연산자는 하나뿐이다.
조건식 ? 식1 : 식2;
→ 조건식이 true라면 식1, 조건식이 false라면 식2
int score = 90;
char grade = score >= 90 ? 'A' : 'B';
결과 : A
② 대입연산자
- 대입연산자는 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용한다.
- 대입연산자의 왼쪽피연산자 lvalue(left value)라고 하고, 오른쪽 피연산자를 rvalue(right value)라고 한다.
- 대입연산자 rvalue는 변수뿐만 아니라 식이나 상수 모두 가능한 반면, lvalue는 반드시 변수처럼 변경할 수 있는 것이어야 한다.
※ 복합대입연산자
+= | 더한값을 저장 |
-= | 뺀 값을 저장 |
*= | 곱한 값을 저장 |
/= | 나눈 값을 저장 |
%= | 나눈 나머지 값을 저장 |
int sum = 13;
sum += 2; // sum = sum + 2;
sum -= 2; // sum = sum - 2;
sum *= 2; // sum = sum * 2;
sum /= 2; // sum = sum / 2;
sum %= 2; // sum = sum % 2;
'개발도전하기 > Java 기초' 카테고리의 다른 글
Java 기초 강의 4일차 (0) | 2022.07.01 |
---|---|
Java 기초 강의 3일차 (0) | 2022.06.16 |
Java 기초 강의 1일차 (0) | 2022.06.10 |