연산자

연산자란 어떤 기능을 수행하는 기호로 단항, 다항, 논리, 대입 연산자 등이 있다.

산술 연산자

산술 연산자에는 사칙 연산과 나머지 연산자가 있다. 사칙 연산 중 나누기를 할 때 주의할 점은 int 형끼리 연산시 int만 출력하기 때문에 소숫점까지 보기 위해서는 앞의 형을 double이나 float으로 변환해야한다. 두 변수를 피연산자로 사용시 둘다 바꾸지 않고도 하나만 바꿔도 자동으로 형 변환이 이루어진다.

public class Ex01 {

	public static void main(String[] args) {
		// 사칙 연산 
		System.out.println(3+5);
		System.out.println(3-5);
		System.out.println(3*5);
		System.out.println(3/5);
		
		int i = 5; int j = 3;
		int result = i + j;
		System.out.println(result);
		result = i - j;
		System.out.println(result);
		result = i * j;
		System.out.println(result);
		result = i / j;
		System.out.println(result);
		result = i % j; //% 나머지
		System.out.println(result);
		
		System.out.println(5/3);
		// 4byte 4byte연산 => 4byte 실수 연산

    System.out.println((double)5/3); //8byte 형 변환
		// 10101010 10101010 8 n 4
		// 00000000	01010101 8 n 8 강제 형변환이 됨
	}

}

문자 타입도 더하기 연산이 가능한데 변수 저장시에 아스키 코드 표에 의해 숫자형태로 저장되기 때문에 정수연산을 하므로 4byte 연산을 하게 된다.

public class Ex01 {

	public static void main(String[] args) {
    char ch = 'A'; // ASC 상 65 
		System.out.println(ch);
    //A
		
    char ch1 = 'A' + 1; // 65 + 1 = 66
		System.out.println(ch1);
		//B

    char ch2;
		ch2 = 'A' + 1;
		System.out.println(ch2);
		//B

    char ch3 = 'A';// char은 2byte
		int ch4 = ch3 + 1; // 'A' + 1
		System.out.println(ch4);
    //66
		System.out.println((char)ch4);
    //ch3 = ch3 + (char)1; 는 불가능한 코드
	}

}


전위/후위 증감 연산자

증감 연산자는 피연산자를 1씩 증가하거나 감소시키는 연산자로 전위 연산자는 실행 직후 연산이 되고 후위 연산자는 실행 직후가 아닌 나중에 연산이 이루어집니다. 실행 시점의 차이인데 아래 코드를 통해 확인해봅시다.

public class Ex04 {
	public static void main(String[] args) {
		int i = 10;
		i--; // 후위
		System.out.println(i);//9
		System.out.println("-----");
		System.out.println(i--);
		

    //후위
		int j = 10;
		System.out.println(j--);
		//System.out.println(j);
		// j = j - 1;
		System.out.println(j);
		
    //전위
		int z = 10;
		System.out.println(--j); //
		// j = j - 1;
		// System.out.println(j);
	}
 
}

전위 연산자는 연산 직후 바로 반영이 되기 때문에 이해하기가 쉽습니다. 그러나 후위 연산자의 경우 위 코드에서 확인할 수 있듯이 int i의 경우 i–; 이후 i를 출력했을 때 9가 나옵니다. 그런데 i–를 출력하면 1이 감소하여 8이 나오는 것이 아니라 9가 그대로 출력이 됩니다. 즉 전위 연산자 사용 후 출력을 하면 연산이 된 결과가 출력이 되고, 후위 연산자를 사용후 출력을 하면 기존 값을 출력하고 출력 이후에 연산이 이루어집니다.

https://blog.kakaocdn.net/dn/c7lR9m/btq4EdHmhJS/U0UMuZskvUBAQZAmf5jcC1/img.png

i = i + 1; result = i + j; j = j - 1;// j = 10 - 1 = 9 순으로 연산이 이루어집니다.
System.out.println(i);//11
System.out.println(j);//9
System.out.println(result);//21

result의 경우는 변수 선언시 j가 변하지 않은 상태이기 때문에 11 + 10이 되어 21을 저장하게 됩니다.


부호 연산자

부호 연산자(+,-)는 부호를 결정하는 연산자로 +의 경우 피연산자에 1을 곱하고 -의 경우 -1을 곱합니다.

public class Ex01 {

    public static void main(String[] args) {
        int i = 10;
        System.out.println(i); //10
	    	i = +i;
	    	System.out.println(i); //10
        i = -i;
        System.out.println(i); //-10
    }

}


논리 연산자

논리 연산자는 주어진 논리식을 통해 boolean 값을 반환하는 연산자입니다.

AND연산자 (&&) : 모두 true인 경우 true

OR연산자 (¦¦) : 하나라도 true인 경우 true

x y x¦¦y x&&y
true true true true
true false true false
false true true false
false false false false


논리부정 연산자

논리부정 연산자는 boolean타입의 피연산자를 true는 false로, false는 true로 바꾸는 연산자입니다.

public class Ex01 {

    public static void main(String[] args) {
        boolean power = true;
        System.out.println(!power); // false
        power = !power;
        System.out.println(!power); // true
    }

}


쉬프트 연산자

쉬프트 연산자는 2의 제곱으로 곱하거나 나눈 결과를 반환하는 연산자로 곱셈, 나눗셈 연산자보다 빠릅니다.

public class Ex01 {

    public static void main(String[] args) {
        i = 10;
        System.out.println(i << 3); // 10에 2^3 = 8을 곱함
        // 80
        System.out.println(i >> 2); // 10을 4로 나눔.
        //2
	}

}


비교 연산자

비교 연산자는 피연산자를 같은 타입으로 변환한 후 비교하는 연산자로 boolean 값을 반환합니다. 모든 자료형에 사용할 수 있지만 참조형에는 ==와 !=만 사용이 가능합니다.

수식 연산 결과
x > y x가 y보다 클 때 true, 그 외에는 false
x < y x가 y보다 작을 때 true, 그 외에는 false
x >= y x가 y보다 크거나 같을 때 true, 그 외에는 false
x <= y x가 y보다 작거나 같을 때 true, 그 외에는 false
x == y x가 y와 같을 때 true, 그 외에는 false
x != y x가 y와 다를 때 true, 그 외에는 false
public class Ex01 {

    public static void main(String[] args) {
        int i = 10;
		    int j = 20;
		    boolean b = i > j;
		    System.out.println(b);
        //false
		    System.out.println(i > j);
        //false

        b = i == j;
        System.out.println("i == j : " + b);
        //false

        float f = 20.1f; // 4byte
     	  double d = 20.1; // 8byte
	    	System.out.println("f == d :" + (f == d));
		    System.out.println(.1 + .1 + .1 == .3);


	}

}

실수 비교 연산시 주의할 점이 있는데 소숫점 아래가 10진 소수가 아닌 이진 소수로 근사값으로 기록되기 때문에 의도치 않은 오류가 발생할 수 있습니다. 위 코드에서도 볼 수 있다시피 float형태의 20.1과 double의 20.1과 저장하는 방식이 다르기 때문에 둘에게 동등비교 연산을 했을 때 false를 반환합니다. 또, 0.1 + 0.1 + 0.1이 0.3인것은 산술적으로 상식적인 결과지만 자바에서 위 결과를 실행할 경우 false를 반환합니다.


대입 연산자

대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며 오른쪽에서 왼쪽으로 진행합니다.

대입 연산자 설명
= 오른쪽 값을 왼쪽에 대입
+= 오른쪽 값을 왼쪽에 더한 값을 대입
-= 오른쪽 값을 왼쪽에 뺀 값을 대입
*= 오른쪽 값을 왼쪽에 곱한 값을 대입
/= 오른쪽 값을 왼쪽에 나눈 값을 대입
%= 오른쪽 값을 왼쪽에 나누고 나머지 값을 대입
public class Ex11 {
	public static void main(String[] args) {
		int i = 10;
		System.out.println(i);
		i += 3;
		System.out.println(i);
		i -= 2;
		System.out.println(i);
	}
}


삼항 연산자

삼항 연산자는 자바에서 유일하게 피연산자를 세 개나 가지는 조건 연산자로 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환합니다.

문법
조건식 ? 반환값1 : 반환값2



public class Ex11 {
	public static void main(String[] args) {
		int[] scores = {65,75,70,85,80,90};
		for(int score : scores) {
			String grade = score >= 90 ? "A" : score >= 80 ? "B" : score >=70 ? "C" : "";
			System.out.println(grade);
		}
    /*
     *C
     *C
     *B
     *B
     *A
	}

}

* 비트 연산자

비교 연산자는 피연산자를 비트 단위로 연산합니다. &, |, ^이 있으며 각각의 설명은 아래와 같습니다. 알고리즘 공부하는 경우 알아두면 좋습니다.

OR 연산자(¦) : 둘 중 하나가 1이면 1입니다.

AND 연산자(&) : 둘 다 1이여야 1입니다.

XOR 연산자(^) : 둘이 서로 다를 때 1입니다.

x y x¦y x&y x^y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0
예제
2진수 10진수
3 | 5 = 7
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 1
3
5
---
7
3 & 5 = 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 0 0 0 1
3
5
---
1
3 ^ 5 = 6
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 0 1 1 0
3
5
---
6