관리자 글쓰기
Chapter 3. 연산자
2016. 6. 7. 22:59 - Daybreak0_0



- 우선순위 : 단항 연산자 > 산술 연산자 > 비교 연산자 > 논리 연산자 > 삼항 연산자 > 대입 연산자 

- 단항 > 이항 > 삼항

- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽 -> 오른쪽


2. 단항 연산자

2.1 증감 연산자  ++ --


- boolean을 제외한 Primitive Type 변수에 사용 가능


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public class OperatorEx2 {
 
    public static void main(String[] args) {
        int i = 5;
        int j = 0;
        j = i ++;
        System.out.println("j=i++; 실행 후 , i="+ i +", j=" + j);
        
        i = 5;
        j = 0;
        j = ++i;
        System.out.println("j=++i; 실행 후, i=" + i +", j="+ j);
    }
 
}
 
cs


결과



1
2
3
4
5
6
7
8
9
10
11
public class OperatorEx3 {
 
    public static void main(String[] args) {
        int i = 5, j=5;
        System.out.println("i++ = " + i++);
        System.out.println("++j = " + ++j);
        System.out.println("i = "+ i + ", j = "+ j );
    }
 
}
 
cs


2.2 부호연산자 + -

- 피연산자의 부호를 변경하는 데 사용, boolean 형, char 형을 제외한 나머지 기본형에 사용 

- '+' 연산자는 양수 1을 곱한 결과

- '-' 연산자는 음수 1을 곱한 결과


2.3 비트전환 연산자 ~ 

- 정수형과 char형에만 사용 

- 피연산자를 2진수로 표현 했을 때, 0은 1로, 1은 0으로 비트전환됨 (결과는 부호가 반대로 변경됨) 

- ~피연산자의 연산결과는 int 타입이라, int 보다 작은 데이터형에 담으면 x 


2.4 논리부정 연산자 !

- boolean 형에만 사용 가능


3. 산술 연산자


3.1 사칙 연산자


- 사칙 연산자 (+, -, *, /) 나머지 연산자 (%), 쉬프트 연산자 (<<,>>,>>>) 로 구성. 이항 연산자 
- 이항 연산자는 피연산자의 크기가 4 byte보다 작으면 4 byte ( int형 ) 으로 변환 후 연산을 수행함
  byte + short -> int + int -> int
- 두 개의 피연산자 중 자료형의 표현범위가 큰 쪽에 맞춰서 형변환 된 후 연산을 수행
  int + float -> float + float -> float
- 피연산자들의 타입을 일치시킨다.
- 정수형 간의 나눗셈에서 0으로 나눌 수 없다. (컴파일은 되지만 실행 시, ArithmeticException 발생 )
- 부동소수점값인 0.0f, 0.0d로 나누는 것은 가능하지만 그 결과는 Not A Number 이다. 

1
2
3
4
5
6
7
8
9
10
11
public class OperatorEx8 {
 
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
//      byte c = a + b; 에러 발생 ! + 연산자는 피연산자들의 자료형을 int 로 변환했음
        int c = (byte) a + b; // 크기가 큰 자료형을 작은 자료형의 변수에 저장할 때 명시적 형변환 해야함
        System.out.println(c);
    }
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
public class OperatorEx10 {
 
    public static void main(String[] args) {
        int a = 1000000;
        int b = 2000000;
        long c = a * b;
        System.out.println(c);
       // c 는 20000000000000가 나오지않음
// * 연산자가 피연산자를 int 형으로 변환 후 연산한 값이 c에 들어감
    }
 
}

cs


1
2
3
4
5
6
7
8
9
10
public class OperatorEx16 {
 
    public static void main(String[] args) {
        char lowerCase = 'a';
        char upperCase = (char)(lowerCase - 32);
        System.out.println(upperCase);
    }
 
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class OperatorEx16 {
 
    public static void main(String[] args) {
        float pi = 3.141592f;
        float shortPi = (int)(pi * 1000/ 1000f;
        // 1) pi는 float, 1000은 정수형이므로 연산 결과는 float인 3141.592f
        // 2) 캐스트연산자의 형변환 수행. 결과는 3141 소수점 이하는 반올림없이 버려짐
        // 3) 3141 / 1000f int와 float의 연산이므로 
        //    int가 float이 되고 float와 float의 연산 수행
        // 4) 3141.0f / 1000f => 3.141f
        System.out.println(shortPi);
    }
 
}
cs


3.2 나머지 연산자 %


- 왼쪽의 피연산자를 오른쪽의 피연산자와 나누고 난 나머지값을 돌려주는 연산자


1
2
3
4
5
6
7
8
9
10
public class OperatorEx16 {
 
    public static void main(String[] args) {
        System.out.println(-10%8); // -2
        System.out.println(10%-8); // 2
        System.out.println(-10%-8); // -2
    }
 
}
 
cs


-> 왼쪽 피연산자 (나눠지는 수)의 부호에 따라간다.


3.3 쉬프트 연산자 <<, >>, >>>

- 정수형 변수에만 사용 


x << n 은 x * 2의 n승과 같다.

 x >> n 은 x / 2의 n승과 같다.


- '<<' 연산자는 피연산자의 부호에 상관없이 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채움

- '>>' 연산자는 오른쪽으로 이동시키기 때문에 음수인 경우 부호 유지를 위해 1로 빈칸을 채움

- '>>>' 연산자는 부호에 상관없이 항상 0으로 빈자리를 채움

- 숫자 n의 값이 자료형의 bit 수보다 크면 자료형의 bit수로 나눈 나머지만큼만 이동함 

  ex. int형의 경우 1000 >> 32 는 아무 것도 수행 x

      1000 >> 35는 32를 나눈 나머지 3만큼만 이동하여 1000 >> 3을 수행함

- 나눗셈, 곱셈 연산자보다 속도가 빠르다 ! 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class OperatorEx16 {
 
    public static void main(String[] args) {
        int temp;
        
        System.out.println(-8);
        System.out.println(Integer.toBinaryString(-8));
        System.out.println();
        //-8을 2진수로 표현한 문자열 반환
        // -8
        // 11111111111111111111111111111000
 
        temp = -8 << 1;
        System.out.println("-8 << 1 : "+ temp);
        System.out.println(Integer.toBinaryString(temp));
        // -8 << 1 : -16
        // 11111111111111111111111111110000 왼쪽으로 한칸밀리고 0으로 채움 
        
        temp = -8 >> 1;
        System.out.println("-8 >> 1 : "+ temp);
        System.out.println(Integer.toBinaryString(temp));
        // -8 >> 1 : -4 
        // 11111111111111111111111111111100 오른쪽으로 한칸밀리고 1로 채움
    }
 
}
cs


4. 비교 연산자

- 두 개의 변수 또는 리터럴을 비교하는 데 사용
- 연산결과는 true 아니면 false
- 이항연산자 이므로 비교하는 피연산자의 자료형이 다를 경우 자료형의 범위가 큰 쪽으로 형변환 하여 연산됨

4.1 대소비교 연산자 - <, >, <=, >=

- boolean 형 제외한 나머지 기본형에서 사용
- 참조형은 사용 x


4.2 등가비교 연산자 - ==, !=

- 기본형, 참조형 다 사용 가능
- 기본형의 경우 변수에 저장되어 있는 값이 같은지를 비교
- 참조형의 경우 같은 객체를 가리키고 있는지 알 수 있음
- 기본형과 참조형 간에 서로 형변환이 가능하지 않으므로 등가비교 연산자의 피연산자로 기본형과 참조형을 함께 사용 x

** 참조형 변수에 사용가능한 연산자는 ==, !=, 캐스트연산자 뿐 ( String만 + 사용 가능 )

    문자열 비교에는 == 대신 equals() 를 사용함


정수형 10와 실수형 10.0f 는 같다.

double형 0.1 과 0.1f 는 다르다.   

==> 정수형과 달리 실수형 float과 double은 근사값으로 저장되기 때문에 다르다.

       10.0f를 double로 형변환하면 10.0을 얻지만, 0.1f를 double로 형변환하면 0.1이 아닌 0.10000000149011612를 얻는다.

So, 형변환을 통해 두 피연산자의 타입을 float으로 맞춰서 자동형변환이 안일어나게 하거나, 소수점 몇 째자리까지 동일하게 잘라서 비교해야함


5. 논리 연산자


5.1 논리 연산자 - &&, ||

- 피연산자로 boolean 형 또는 boolean 형 값을 결과로 하는 조건식만 허용됨
- X || Y 일때, X가 true이면 Y는 검사하지 않는다.
- 비트 연산자 |, & 는 피연산자를 boolean 형을 허용하므로 조건식 간의 연결에 사용되지만, 양쪽의 피연산자를 모두 검사함

5.2 비트 연산자 - &, |, ^

- 이진 비트연산 수행
- & ( AND 연산자 )
- | ( OR 연산자 )
- ^ ( XOR 연산자 ) : 피연사자 값이 서로 다를 때 1을 결과로 얻는다. 

6. 그 외 연산자

6.1 삼항 연산자 - ? :

result = ( x > 0 ) ? x : -x; 는 

if ( x > 0 ) {
result = x;
} else {
result = -x;
}

와 같다. 

6.2 대입연산자 - =, op=


- 변수의 값 또는 수식의 연산결과를 저장하는데 사용

final MAX = 3; // 변수 앞에 final 붙이면 상수가 된다.
MAX = 10;  // 상수의 값을 바꿀 수 없다.

- i *= 10 + j;  는 i = i * ( 10 + j ); 와 같다. // 대입 연산자가 우선순위가 제일 낮음