1. 연산자(operator)
1-1. 연산자와 피연산자
- 연산자(operator) : 연산을 수행하는 기호
- 피연산자(operatnd) : 연산자의 작업 대상(변수, 상수, 리터럴, 수식)
> x+3이라는 식에서 '+'는 덧셈 연산자, 변수 x와 상수 3은 피연산자
>> 연산자는 피연산자로 연산을 수행하고 나면 항상 결과값을 반환함
1-2. 식(式)과 대입연산자
- 식(式, expression) : 연산자와 피연산자를 조합하여 계싼하고자하는 바를 표현하는 것
- 식을 평가(evaluation) : 식을 계산하여 결과를 얻는 것
> 하나의 식을 평가하면, 단 하나의 결과를 얻음
|
1
2
3
4
5
6
7
8
9
10
11
12
|
// x의 값이 5일 때,
4 * x + 3; // 작성한 식을 프로그램에 포함시키려면 식의 끝에 ';'를 붙임
4 * 5 + 3;
23; // 결과를 얻었지만 쓰이지 않고 사라짐.
y = 4 * x + 3;
y = 4 * 5 + 3;
y = 23; // 대입 연산자 '='를 사용하면 식의 평가결과가 변수 y에 저장
System.out.println(y); // 변수 y의 값을 화면에 출력
System.out.println(23); // 23이 화면에 출력된다.
|
cs |
1-3. 연산자의 종류
* 연산자의 기능별 분류
- 산술연산자 : + = * / % << >> : 사칙연산(+, -, *, /)과 나머지 연산(%)
- 비교연산자 : > < >= <= == !== : 크고 작음과 같고 다름을 비교
- 논리연산자 : && || ! & | ^ ~ : '그리고(AND)'와 '또는(OR)'으로 조건을 연결
- 대입연산자 : = : 우변의 값을 좌변에 저장
- 기타 : (type) ?: instance of : 형변환 연산자, 삼항 연산자, instanceof연산자
* 피연산자의 개수에 의한 분류
- 단항 연산자 : 피연산자의 개수가 하나
- 이항 연산자 : 피연산자의 개수가 두 개 > 대부분의 연산자
- 삼항 연산자 : 피연산자의 개수가 세 개 > 오직 '?:' 하나 뿐
1-4. 연산자의 우선순위와 결합규칙
* 연산자의 우선순위
- 단항 연산자가 이항 연산자보다 우선순위가 높음
- 곱셈과 나눗셈이 덧셈과 뺄셈보다 우선순위가 높음
- 비교 연산자(>)보다 산술 연산자 '+'와 '-'가 먼저 수행됨
- 논리 연산자 '&&'보다 비교 연산자가 먼저 수행됨
- 대입 연산자는 연산자 중에서 제일 우선순위가 낮음
* 주의해야 할 연산자 우선순위의 예
- 쉬프트 연산자(<<)는 덧셈 연산자보다 우선순위가 낮음
- 비트 연산자(&)는 비교 연산자(==)보다 우선순위가 낮음
- 논리 연산자 중에서 AND를 의미하는 '&'와 '&&'가 OR를 의미하는 '|'와 '||'보다 우선순위가 높음
* 연산자의 결합 규칙
: 대부분 왼쪽에서 오른쪽의 순서로 연산을 수행
: 단항 연산자와 대입 연산자는 오른쪽에서 왼쪽으로 연산을 수행
* 연산자의 우선순위 정리
① 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
② 단항(1) > 이항(2) > 삼항(3). 단항 여난자의 우선순위가 이항 연산자보다 높다.
③ 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
1-5. 산술 변환(usual arithmetic conversion)
- 이항 연산자는 두 피연산자의 타입이 일치해야 엲산이 가능하므로,
피연산자의 타입이 서로 다르다면 연산 전에 형변환 연산자로 타입을 일치시켜야 함
int i = 10;
float f = 20.0f;
float result = f + (float)i; // 형변환으로 두 피연산자의 타입을 일치
float result = f + i; // 큰 타입으로 형변환시, 형변환연산자 생략 가능
>> 이처럼 연산 전에 타입의 일치를 위해 자동 형변환 되는 것을 '산술 변환' 또는 '일반 산술 변환'
* 산술 변환의 규칙
① 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
> 연산결과의 타입은 피연산자의 타입과 일치(ex. int과 int의 나눗셈 연산 결과는 int)
> 실수를 결과로 얻으려면, 피연산자 중 어느 한 쪽을 float와 같은 실수형으로 형변환시켜야 함
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
2. 단항 연산자
2-1. 증감 연산자 ++ --
- 증가 연산자(++) : 피연산자의 값을 1 증가시킴
- 감소 연산자(--) : 피연산자의 값을 1 감소시킴
- 대부분의 연산자는 피연산자의 값을 읽어서 연산에 사용할 뿐, 피연산자의 타입이나 값을 변경시키지 않음
- 오직 대입연산자와 증감연산자만 피연산자의 값을 변경함
- 일반적으로 단항 연산자는 피연산자의 왼쪽에 위치하지만, 증가 연산자 '++'와 감소 연산자 '--'는 양쪽 모두 가능
* 전위형과 후위형의 비교
- 전위형 : 값이 참조되기 전에 증가시킴 > j = ++i;
- 후위형 : 값이 참조된 후 증가시킴 > j = i++;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class OperatorEx1 {
public static void main(String[] args) {
int i = 5;
i++; // i=i+1;과 같은 의미이다. ++i;로 바꿔 써도 결과는 같다.
System.out.println(i);
i=5; // 결과를 비교하기 위해 i값을 다시 5로 변경.
++i;
System.out.println(i);
}
}
|
cs |
> 이와 같이 수식이나 메서드 호출에 포함되지 않고 독립적인 하나의 문장으로 쓰인 경우에는 전위형과 후위형의 차이 x
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class OperatorEx2 {
public static void main(String[] args) {
int i=5, j=0;
j = i++;
System.out.println("j=i++; 실행 후, i=" + i + ", j="+ j);
i=5; // 결과 비교를 위해, i와 j의 값을 다시 변경
j=0;
j=++i;
System.out.println("j=++i; 실행 후, i=" + i +", j="+ j);
}
}
|
cs |
j=i++; 실행 후, i=6, j=5
j=++i; 실행 후, i=6, j=6
> i의 값은 모두 1을 증가 시켜서 6이 됨
> 후위형 'j=i++;'에서는 i값인 5를 먼저 읽어온 다음에 i를 증가시켜서 j에 5가 저장됨
> 전위형 'j=++i;'에서는 i의 값이 5에서 6으로 증가된 후에 그 값이 j에 저장됨
# 이클립스 콘솔 창의 한글 깨짐 문제 해결
Run - Run Configurations - Common - Encoding에서 Other 선택하고 'MS949' 입력해서 해결함
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public class OperatorEx3 {
public static void main(String[] args) {
int i=5, j=5;
System.out.println(i++);
System.out.println(++j);
System.out.println("i = " + i + ", j =" +j);
}
}
|
cs |
5
6
i = 6, j =6
> i는 값이 증가되기 전에 println()에게 i에 저장된 값인 5를 넘겨준 후에 값이 증가되기 때문에, 5 출력
> j는 증가된 값이 println()에 출력되기 때문에, 6 출력
> 결과적으로는 i,j 모두 1씩 증가되어 6이 됨
* 하나의 식에서 증감연산자의 사용을 최소화하고, 식에 두 번 이상 포함된 변수에 증감연산자를 사용하는 것은 피해야 함
2-2. 부호 연산자 + -
- 부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환함
> 피연산자가 음수면 양수, 양수면 음수의 결과가 변환됨
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class OperatorEx4 {
public static void main(String[] args) {
int i = -10;
i = +i;
System.out.println(i);
i = -10;
i = -i;
System.out.println(i);
}
}
|
cs |
-10
10
'Java' 카테고리의 다른 글
| [Java] 연산자(증감 / 산술 / Shift / 논리 / 비교 / 비트 / 논리 / 삼항 / 대입), 반복문(for문 / while문 / do~while문) (0) | 2023.03.03 |
|---|---|
| [Java] 환경변수 설정 / Hello World / 변수(데이터)의 종류와 크기(byte, short, int, long, float, double, char, boolean) (0) | 2023.03.02 |
| [자바의 정석] #CH.2 변수 Variable - 2.5 형변환 (0) | 2023.01.18 |
| [자바의 정석] #CH.2 변수 Variable - 2.4 기본형(primitive type) (0) | 2023.01.18 |
| [자바의 정석] #CH.2 변수 Variable - 2.3 진법 (0) | 2023.01.17 |