수업/└Java

[CH03]연산자

onlyun 2022. 1. 30. 15:35

※ 연산자 종류 ※

-단항 연산자 : 증감 연산자, 대입 연산자

-이항 연산자

-삼항 연산자 : 조건 연산자

 


1. 기본 연산자

(1) 부호 연산자 +, -

단항 연산자이자 이항 연산자

package ch03;
public class Operator01 {
    public static void main(String[] args) {
        int num = 10;
		
        System.out.println(+num); //10
        System.out.println(-num); //-10 //대입하지 않았기에 실제 값은 바뀌지 않음.
        System.out.println(num);  //10
		
        num = -num;
        System.out.println(num); //-10
    }
}

 

(2) 산술 연산자

-산술 연산

int a=10;
int b=4;
		
System.out.println("a + b : " + a+b); //문자열끼리 연산이 먼저 되어 결과 104 
System.out.println("a + b : " + (a+b));      //결과 14
System.out.println("a + b : " + (int)(a+b)); //결과 14
		
System.out.println("a - b : " + (a-b));  //6
System.out.println("a * b : " + (a*b));  //40
System.out.println("a / b : " + (a/b));  //2
System.out.println("a % b : " + (a%b));  //2

 

(3) 증감 연산자

a++;
a += 1;
a = a + 1;

증감 연산자의 위치에 따라 증감과 대입 순서 변동.

-전위 연산자 : 증감 후 연산

-후위 연산자 : 연산 후 증감

int a = 10;

System.out.println("++a : " + (++a)); // 11
System.out.println("--a : " + (--a)); // 10
System.out.println("++a : " + (a++)); // 10 // 출력 후 더한 것.
System.out.println("a : " + a);       // 11
System.out.println("--a : " + (a--)); // 11 // 출력 후 뺀 것
System.out.println("a : " + a);       // 10

 

(4) 관계 연산자(비교 연산자)

연산 결과를 참(true) 또는 거짓(false)로 반환

비교 연산은 기본형만 가능. String은 기본형이 아니라 비교연산 불가. .equals(); 사용.

package ch03;
public class Operator02 {
	public static void main(String[] args) {
		int a=10;
		int b=5;

		String str="java";
		System.out.println(a<b);   // false
		System.out.println(a>b);   // true
		System.out.println(a<=b);  // false
		System.out.println(a>=b);  // true
		System.out.println(a==b);  // false
		System.out.println(a!=b);  // true

		System.out.println(str=="java");  // true
		                                 //비교 연산은 기본형만.
		System.out.println(str.equals("java"));  //ture
		
//		System.out.println(a === b); // 데이터형까지 똑같은지 연산
	}
}

└비교 연산은 기본형만 됨. String은 객체라 안 된다는데 왜 true가 나왔지? 오류 떠야 하는 거 아님?

 

(5) 논리 연산자

두 항을 모두 실행하지 않더라도 결과 값을 알 수 있는 경우, 나머지 항은 실행되지 않음. 단락 회로 평가.

&& || ! ^
논리 곱.
둘 다 참일 경우 참.
논리 곱.
둘 중 하나 참일 경우 참
참일 경우, 거짓.
거짓일 경우, 참.
둘이 달라야 true
같으면 false
int a=10;
int b=5;
		
System.out.println(a>5 && b>3);
System.out.println(a>5 && b>5);
System.out.println(a<5 && b>5); // 나머지 항은 실행되지 않음.
		
System.out.println(a>b || b>3);
System.out.println(!(a<5));

 

(6) 대입 연산자

연산이 모두 끝난 후 마지막으로 결과 값을 변수에 대입.

-대입 연산자

오른쪽의 값을 왼쪽(저장 장소, 변수)에 대입.

 

-복합 대입 연산자

대입연산과 다른 연산의 축약 표현

a=a+b a=a-b a=a*b a=a/b a=a&b a=a|b a=a<<b a=a>>b a=a>>>b
a += b a -= b a *= b a /= b a &= b a |= b a <<= b a >>= b a >>>= b

 

(7) 조건 연산자(삼항 연산자)

(조건식) ? 결과1 : 결과2;

간단한 조건식에서만 사용. 참일 경우 결과1, 거짓일 경우 결과2 반환.


2. 비트 연산자

(1) 비트 논리 연산자

10진수를 2진수 변환하여 연산

& 비트값(열)이 둘 다 1일 때 1
| 비트값(열)이 하나라도 1이면 1, 둘 다 0일 때 0
^ 비트값(열)이 같으면 0, 다르면 1
~ 비트값(열) 반전. (exclusive or)
int a = 3;   // 00000011
int b = 10;  // 00001010
		
System.out.println(a&b); //00000010
System.out.println(a|b); //00001011
System.out.println(a^b); //000001001
System.out.println(~a); //11111100 -(부호반전)-> 00000011 -(1더하기)-> 00000100

 

(2) 비트 이동 연산자(쉬프트 연산)

<< 왼쪽으로 n비트 이동.   기존 값 * 2ⁿ
>> 오른쪽으로 n비트 이동. 기존 값 / 2ⁿ . 부호비트에 맞춰 숫자를 넣어줌.
>>> 오른쪽으로 n비트 이동. 기존 값 / 2ⁿ . 부호비트와 상관없이 맨 왼쪽에 0 넣음.
int a = 3;   // 00000011
int b = 10;  // 00001010
int c = -5;  // 1111 1111 1111 1111 1111 1111 1111 1011
		
//비트 이동 연산자
System.out.println(b<<1); // b*2
System.out.println(b<<2); // b*4
System.out.println(b>>1); // b/2
System.out.println(b>>2); // b/4

System.out.println(5<<2);
System.out.println(0b00000101<<2);

System.out.println(5>>2);         //1
System.out.println(0b00000101>>2);

//음수일 때, (byte)를 붙여줘야 부호비트 인식.
System.out.println((byte)c>>1);  // 결과값 -3
                                // 연산 : (-5)/2 = -2.5
                                // 음수 비트 이동 연산(오른쪽)은 예상값보다 -1.
                               //+1해줘야 원하는 값 출력(예상값) 나옴.
System.out.println((byte)c>>1+1);
System.out.println((byte)c>>2);   //-2
System.out.println((byte)c>>>1); //2147483645

(+음수 비트 이동 연산자)

int c = -6;
		
System.out.println(Integer.toBinaryString(c));
System.out.println(c<<1); //(-6)*2
System.out.println(c>>1); //(-6)/2 //예상값과 동일
		                          //예상 -3, 결과 -3
System.out.println(c>>>1); //(-6)/2
		
System.out.println(c<<2); //(-6)*4
System.out.println(c>>2); //(-6)/4 //예상값과 결과값 차이.
                                  //예상 -1  결과 -2
System.out.println(c>>3); //(-6)/8
                                 //예상 0 결과 -1
System.out.println(c>>>2); //(-6)/4

└나머지가 있을 경우 예상값과 결과값이 다르게 나옴

 

 

(3) 진수 변환

-10진수 → 2진수/8진수/16진수 변환

자바가 제공하는 라이브러리.

Integer.toBinaryString() Integer.toOctalString() Integer.toHexString()
2진수로 변환 8진수로 변환 16진수로 변환
int b = 10;
System.out.println(Integer.toBinaryString(b));  //1010
System.out.println(Integer.toOctalString(b));   //12
System.out.println(Integer.toHexString(b));    //a

-2진수/8진수/16진수 → 10진수(정수) 변환

Integer.parseInt("바꿀 수", 기존 진수)
System.out.println(); 		//문자열을 정수로 바꾼다.
System.out.println(Integer.parseInt("11010", 2)); //2진수를 정수로
System.out.println(Integer.parseInt("123", 8));   //8진수를 정수로
System.out.println(Integer.parseInt("4A", 16));   //16진수를 정수로		
System.out.println(Integer.parseInt("10"));  //10진수를 정수로

 


 

3. 연산자 순위

괄호 > 단항 연산자 > 산술 연산자 > 관계 연산자 > 논리 연산자 > 대입 연산자