Java

[자바의 정석] #CH.3 연산자 operator - 3.1 연산자와 피연산자 / 3.2 단항 연산자

소댓 2023. 2. 1. 20:42

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