Chapter 03. 연산자


3.1 연산자와 연산식



3.2 연산의 방향과 우선 순위





3.3 단항 연산자

3.3.1 부호 연산자(+,-)

// 부호 연산자를 사용할 때 주의할 점은 부호 연산자의 산출 타입은 int 타입이 된다는 것이다.

// 예를 들어 short 타입 값을 부호 연산하면 int 타입 값으로 바뀐다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package sec03.exam01_sign;
 
public class SignOperatorExample {
    public static void main(String[] args) {
        int x = -100;
        int result1 = +x;
        int result2 = -x;
        System.out.println("result1=" + result1);
        System.out.println("result2=" + result2);
        
        short s = 100;
        //short result3 = -s;  //컴파일 에러 
        int result3 = -s; 
        System.out.println("result3=" + result3);
    }
}
cs



3.3.2 증감 연산자(++,--)

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
27
28
29
30
31
32
33
34
35
package sec03.exam02_increase_decrease;
 
public class IncreaseDecreaseOperatorExample {
    public static void main(String[] args) {
        int x = 10;
        int y = 10;
        int z;
        
        System.out.println("-----------------------");
        x++;
        ++x;
        System.out.println("x=" + x); // 12        
 
        System.out.println("-----------------------");        
        y--;
        --y;
        System.out.println("y=" + y); // 8        
 
        System.out.println("-----------------------");        
        z = x++;
        System.out.println("z=" + z); // 12
        System.out.println("x=" + x); // 13
        
        System.out.println("-----------------------");        
        z = ++x;
        System.out.println("z=" + z); // 14
        System.out.println("x=" + x); // 14
        
        System.out.println("-----------------------");                
        z = +++ y++;
        System.out.println("z=" + z); // 23
        System.out.println("x=" + x); // 15
        System.out.println("y=" + y); // 9
    }
}
cs



3.3.3 논리 부정 연산자(!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec03.exam03_deny_logic;
 
public class DenyLogicOperatorExample {
    public static void main(String[] args) {
        boolean play = true;
    System.out.println(play);
 
    play = !play;
    System.out.println(play);
 
    play = !play;
    System.out.println(play);
    }
}
cs



3.3.4 비트 반전 연산자(~)

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
27
package sec03.exam04_bit_reverse;
public class BitReverseOperatorExample {
    public static void main(String[] args) {
        int v1 = 10;
        int v2 = ~v1;
        int v3 = ~v1 + 1;
        System.out.println(toBinaryString(v1) + " (십진수: " + v1 + ")");
        System.out.println(toBinaryString(v2) + " (십진수: " + v2 + ")");
        System.out.println(toBinaryString(v3) + " (십진수: " + v3 + ")");
        System.out.println();
        
        int v4 = -10;
        int v5 = ~v4;
        int v6 = ~v4 + 1;
        System.out.println(toBinaryString(v4) + " (십진수: " + v4 + ")");
        System.out.println(toBinaryString(v5) + " (십진수: " + v5 + ")");
        System.out.println(toBinaryString(v6) + " (십진수: " + v6 + ")");
    }
    
    public static String toBinaryString(int value) {
        String str = Integer.toBinaryString(value);
        while(str.length() < 32) {
            str = "0" + str;
        }
        return str;
    }
}
cs


--------------------------------------------


3.2 연산의 방향과 우선순위 


3.3 단항 연산자

3.3.1 부호 연산자(+,-)

3.3.2 증감 연산자(++,--)

3.3.3 논리 부정 연산자(!)

3.3.4 비트 반전 연산자(~)


3.4 이항 연산자

3.4.1 산술 연산자(+,-,*,/,%)

3.4.2 문자열 연결 연산자(+)

* 피연산자 중 한쪽이 문자열이면 + 연산자는 문자열 연산자로 사용되어 다른 피연산자를 문자열로 변환하고 서로 결합한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec04.exam02_string_concat;
 
public class StringConcatExample {
    public static void main(String[] args) {
        String str1 = "JDK" + 6.0;
        String str2 = str1 + " 특징";
        System.out.println(str2); // JDK6.0 특징
        
        String str3 = "JDK" + 3 + 3.0;
        String str4 = 3 + 3.0 + "JDK"; // 맨 왼쪽부터 차례대로 계산
        System.out.println(str3); // JDK33.0
        System.out.println(str4); // 6.0JDK       
    }
}
cs

3.4.3 비교 연산자(<,<=,>,>=,==,!=)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec04.exam03_compare;
 
public class CompareOperatorExample1 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 10;
        boolean result1 = (num1 == num2); 
        boolean result2 = (num1 != num2); 
        boolean result3 = (num1 <= num2);
        System.out.println("result1=" + result1); // result1=true
        System.out.println("result2=" + result2); // result2=false
        System.out.println("result3=" + result3); // result3=true
        
        char char1 = 'A';
        char char2 = 'B';
        boolean result4 = (char1 < char2);
        System.out.println("result4=" + result4); // result4=true     
    }
}
 
cs

* 비교 연산자에서도 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다.

비교 연산자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec04.exam03_compare;
 
public class CompareOperatorExample2 {
    public static void main(String[] args) {
        int v2 = 1;
        double v3 = 1.0;
        System.out.println(v2 == v3); //true
        
        double v4 = 0.1;
        float v5 = 0.1f;
        System.out.println(v4 == v5);
        // false 부동소수점 타입은 0.1을 정확히 표현할 수 없어서 0.1f는 0.1의 근사값으로 표현되어
        // 0.10000000149011612와 같은 값이 되기 때문에 0.1보다 큰 값이 되어 버린다.
        // 해결책은 피연산자를 모두 1. float 타입으로 강제 타입 변환한 후 비교연산하든지, 2. 정수로 변환해서 비교하면 된다.
        
        System.out.println((float)v4 == v5); //true
        System.out.println((int)(v4*10== (int)(v5*10)); //true
    }
}
 
cs

문자열 비교
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package sec04.exam03_compare;
public class StringEqualsExample {
    public static void main(String[] args) {
        String strVar1 = "신민철";
        String strVar2 = "신민철";
        String strVar3 = new String("신민철");
  // == 연산자는 변수에 저장된 값만 비교하기 때문에 이러한 결과가 나온다
        System.out.println( strVar1 == strVar2); // true
        System.out.println( strVar1 == strVar3); // false
        System.out.println();
        System.out.println( strVar1.equals(strVar2)); // true
        System.out.println( strVar1.equals(strVar3)); // true
    }
}
cs


* 자바는 문자열 리터럴이 동일하다면 동일 String 객체를 참조하도록 되어있다.

그래서 strVar1과 strVar2는 동일한 String 객체의 번지값을 가지고 있다.

그러나 변수 strVar3은 객체 생성 연산자인 new로 생성한 새로운 String 객체의 번지값을 가지고 있다.


* 동일한 String 객체이건 다른 String 객체이건 상관없이 String 객체의 문자열만을 비교하고 싶다면

== 연산자 대신에 equals() 메소드를 사용해야 한다.

equals() 메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교한 후 true 또는 false를 리턴한다.


boolean result = 원본문자열.equals(비교문자열);





3.4.4 논리 연산자 ( &&, ||, &, |, ^, ! )


3.4.5 비트 연산자 ( &, |, ^, ~, <<, >>, >>> )


3.4.6 대입 연산자 ( =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= )


3.5 삼항 연산자


조건식 ? 값 또는 연산식(true) : 값 또는 연산식(false)




Posted by 너래쟁이
: