본문 바로가기
Java/Java

연산자(Operator)란?, 이항연산자, 삼항연산자, 대입연산자

by 박채니 2022. 3. 2.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


(비트연산자는 제외한 포스팅 입니다.)

 

연산자의 종류와 우선순위

외울 필요는 없음!


단항연산자

 

☞ +, -, !, (자료형) 연산자

public void test1() {
	// + -
	int a = +10;	// (+) 생략가능
	int b = -5;
	System.out.println(a + b);
		
	// !
	boolean bool = !false;
	boolean bool1 = !(a + b > 0);
	System.out.println(bool + ", " + bool1);
		
	// (자료형)
	int c = (int)3.3333;
	System.out.println(c);
}

@콘솔출력값
5
true, false

! 연산자는 boolean에만 해당 되며, true/false 값의 반대를 출력해줍니다.

!false → true 리턴

!true → false리턴

 

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

public void test1() {
	//증감연산자 ++, --
	int e = 10;
	e++;	// e = e + 1;
	System.out.println(e);
	e--;	// e = e - 1
	System.out.println(e);
}

@콘솔출력값
11
10

증감연산자 (++, --)는 변수의 값은 1씩 증가 혹은 감소 시키는 것입니다.

 

증감 연산자는 변수 앞에 붙는 '전위형' 과 뒤에 붙는 '후위형'으로 나뉘며, 위 예제는 뒤에 붙었으므로 후위형 입니다.

차이점을 살펴보겠습니다.

 

전위형 증감연산자

- 증감 연산 처리 후 인접 연산 처리

public void test1() {
	//전위 증감연산자
	int e = 10;
	System.out.println(++e + 5);
}

@콘솔출력값
16

증감(+1) 처리를 가장 1등으로 수행하는 것입니다.

무조건 반드시!! 증감 (+1)을 하고 나머지 연산 및 대입 등등을 처리합니다.

따라서 먼저 ++e 증감 연산 처리 → 값 대입 → +5 처리 → println 출력

 

후위형 증감연산자

- 인접 연산 처리 후 증감 연산 처리

public void test1() {
	//후위 증감연산자
	int e = 10;
	System.out.println(e++ + 5);
}

@콘솔출력값
15

인접 연산을 먼저 처리하고 증감 연산이 수행됩니다.

따라서 먼저 값 대입 → ++e 증감 연산 처리 → +5 처리 → println 출력 

 

public void test1() {
	int num = 7;
	int inum = num++;
	System.out.printf("num = %d, inum = %d\n", num, inum);
}

@콘솔출력값
num = 8, inum = 7

num에 7을 대입하고 inum에는 num++을 대입하였습니다.

다만 inum은 num이 ++ 되기 전의 값(7)을 먼저 대입 되었고, 대입 된 후 num은 ++처리 되었습니다.

따라서 num은 8, inum은 7의 값이 출력되었습니다.

 

public void test2() {
	int a = 10;		// a = 10
	int b = 20;		// b = 20
	int c = ++a;	// c = 11 / a = 11
		
	System.out.printf("a = %d, b = %d, c = %d\n", a, b, c);	// a = 11, b = 20, c = 11
		
	b = c--;	// b = 11 / c = 10
	System.out.printf("a = %d, b = %d, c = %d\n", a, b, c);	// a = 11, b = 11, c = 10
		
	a = 25;		// a = 25
	c = b++ - --a;	// c = -13 / a = 24 / b = 12 
	System.out.printf("a = %d, b = %d, c = %d\n", a, b, c);	// a = 24, b = 12, c = -13
    
	int x = 20;
	int y = x++ + x;
	System.out.printf("x = %d, y = %d\n", x, y);
}

@콘솔출력값
a = 11, b = 20, c = 11
a = 11, b = 11, c = 10
a = 24, b = 12, c = -13
x = 21, y = 41

x, y의 값 결과를 x = 21, y = 40으로 예상 했었지만 21, 41의 결과가 리턴되었습니다.

실수! ☞ x의 값을 먼저 대입하고 x는 ++ 증감 처리 되었고, 그 값을 x에 다시 대입하여 20 + 21 = 41이 y에 대입 된 것입니다.


이항연산자

 

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

public void test3() {
	int a = 10;
	int b = 3;
	
    System.out.println(a + b);	// 13
	System.out.println(a - b);	// 7
	System.out.println(a * b);	// 30
	System.out.println(a / b);	// 3
	System.out.println(a % b);	// 1
	System.out.println(a / b + a % b);	// / % 먼저 처리 후 + -> 4
}

@콘솔출력값
13
7
30
3
1
4

수학시간에 했었던 사칙연산과 동일합니다.

다만 나머지를 구하는 %가 추가!!

 

☞ <, >, <=, >=, ==, != (비교 연산자)

public void test3() {
	int a = 10;
	int b = 3;
		
	// 비교 연산자 : 논리형으로 처리 -> false / true로 리턴
	boolean bool1 = a / b == b;	// a / b가 b와 같니? -> 3 == 3
	System.out.println(bool1);	//true
		
	bool1 = a % b != a;		// a % b가 a와 같지 않니? -> 1 != 3
	System.out.println(bool1);	// 같지 않으므로 true
		
	bool1 = a > b;	
	System.out.println(bool1);
	bool1 = a < b;	
	System.out.println(bool1);
	bool1 = a >= b;	//크거나 같다
	System.out.println(bool1);
	bool1 = a <= b;	//작거나 같다
	System.out.println(bool1);
}

@콘솔출력값
true
true
true
false
true
false

프로그래밍에서의 크거나 같다, 작거나 같다는 >=, <=로 표현합니다.

> : gt (greater than)
> = : ge (greater than or equal to)

< : lt (less than)
<= : le (less than or equal to)

 

☞ &&, || (논리연산자)

public void test4() {
	System.out.println(true && true);	//true
	System.out.println(true && false);	//false
	System.out.println(false && true);	//false
	System.out.println(false && false);	//false
	
	System.out.println(true || true);	//true
	System.out.println(true || false);	//true
	System.out.println(false || true);	//true
	System.out.println(false || false);	//false
}

@콘솔출력값
true
false
false
false

true
true
true
false

&& (and 연산자) 

- 좌항, 우항 모두 true이면 true를 리턴 / 나머지는 다 false

 

|| (or 연산자)

- 좌항, 우항 둘 중 하나가 true이면 true 리턴 / 나머지는 다 false

 

코드로 구현해보기

public void test4() {
	int a = 10;
	int b = 5;
		
	System.out.println(a > b && b < a);		// 10>5 && 5<10 true
	System.out.println(a == b+5 && a == b+3);	//10==10 && 10==8 false 
	System.out.println(a-3 < b && b > a-6);		//7<5 && 5>4 false
	System.out.println(a == b && (a*2) < b);	//10==5 && 20<5 false
	
   	System.out.println();
	
	System.out.println(a > b || b < a);		// 10>5 || 5<10 true
	System.out.println(a == b+5 || a == b+3);	//10==10 || 10==8 true 
	System.out.println(a-3 < b || b > a-6);		//7<5 || 5>4 true
	System.out.println(a == b | (a*2) < b);		//10==5 && 20<5 false
}

@콘솔출력값
true
false
false
false

true
true
true
false

 

&&, || 연산의 쇼트 서킷

쇼트 서킷이란?

- 연산을 수행하는 과정에서 결과가 이미 확정됐을 때 나머지 연산 과정을 생략하는 것

public void test4() {
	int a = 10;
	int b = 5;
		
	//and 연산 -> 좌항이 false이면 우항 검사 X
	System.out.println(a > 5 && a++ > 5);
	System.out.println(a);
	System.out.println(a == 11 && a++ > 5);
	System.out.println(a);
	System.out.println(a < 5 && a++ > 5 );	//좌항 false -> 우항 검사 X
	System.out.println(a); 
		
	System.out.println();
		
	//or 연산 -> 좌항이 true이면 우항 검사 X
	System.out.println(b > 5 || b++ > 5);
	System.out.println(b);
	System.out.println(b == 11 || b++ > 5);
	System.out.println(b);
	System.out.println(b < 10 || b++ > 5);	//좌항 true -> 우항 검사 X
	System.out.println(b);	//7
}

@콘솔출력값
true
11
true
12
false
12

false
6
true
7
true
7

 

비트연산자를 아직 배우진 않았지만, & / | 도 동일하게 비교연산자의 역할을 합니다.

하지만 쇼트 서킷에 대해서 두 연산자의 차이가 있습니다.

 

&, |는 쇼트 서킷이 적용되지 않습니다.

그렇기 때문에 좌항이 true 혹은 false여도 우항을 계산하게 됩니다.

 

&, | 쇼트 서킷 적용 여부 (X)

public void test4() {
	int a = 10;
	int b = 5;
		
	// & -> 좌항, 우항 모두 검사
	System.out.println(a > 5 & a++ > 5);
	System.out.println(a);
	System.out.println(a == 11 & a++ > 5);
	System.out.println(a);
	System.out.println(a < 5 & a++ > 5 );	//우항 검사 X
	System.out.println(a); 
		
	System.out.println();
		
	// | -> 좌항, 우항 모두 검사
	System.out.println(b > 5 | b++ > 5);
	System.out.println(b);
	System.out.println(b == 11 | b++ > 5);
	System.out.println(b);
	System.out.println(b < 10 | b++ > 5);
	System.out.println(b);
}

@콘솔출력값
true
11
true
12
false
13

false
6
true
7
true
8

삼항 연산자

 

☞ (조건식) ? (참일 때 값) : (거짓일 때 값)

public void test5() {
	int a = 10;
	int b = 5;
	int c = (a > b) ? a : b;	// a가 b보다 크니 ? true면 a 값 대입 : false면 b 값 대입
		
	System.out.println(c);
}

@콘솔출력값
10

(조건식)을 비교하고 true면 콜론(:) 앞 쪽의 값, false면 콜론(:) 뒤 쪽의 값이 연산 결과가 됩니다.

여기서! (조건식)에는 반드시 불리언 자료형 (true / false)만 올 수 있습니다.

 

public void test5() {
	Scanner sc = new Scanner(System.in);
		
	System.out.print("> 첫번째 값을 입력하세요 : ");
	int a = sc.nextInt();
	System.out.print("> 두번째 값을 입력하세요 : ");
	int b = sc.nextInt();
		
	int big = a > b ? a : b;
	int small = a < b ? a : b;
		
	System.out.printf("큰 값은 %d, 작은 값은 %d입니다.\n", big, small);
}

@콘솔출력값
> 첫번째 값을 입력하세요 : 3
> 두번째 값을 입력하세요 : 25
큰 값은 25, 작은 값은 3입니다.

 

☞ 중첩 삼항 연산자

public void test5() {
	int a = 10;
	int b = 5;
	int c = (a > b) ? a : b;	//10
		
	int d = (a < b) ? a : (b > c) ? b : c;	// (a<b)가 true면 a : false면 (b>c)면 b : c
	System.out.println(d);	//10
}

@콘솔출력값
10

(a < b) 일 때 true면 a를 대입 : false면 다시 (b > c) 를 비교하여 그 값이 true면 b를 대입 : false면 c를 대입

따라서 d 값은 10이 나옵니다.

 

public void test5() {
	Scanner sc = new Scanner(System.in);
		
	System.out.print("> 숫자를 입력하세요 : ");
	int num = sc.nextInt();
		
	String str = num > 0 ? "정수" : num < 0 ? "음수" : "0";
		
	System.out.printf("입력하신 값은 %d, %s입니다.\n", num, str);
}

@콘솔출력값
> 숫자를 입력하세요 : -3
입력하신 값은 -3, 음수입니다.

대입 연산자

 

☞ = (순수 대입 연산자)

public void test6() {
	int a = 10;
	int b = a;
	System.out.printf("a = %d, b = %d\n", a, b);		
}

@콘솔출력값
a = 10, b = 10

(좌항) = (우항) 

좌항의 공간에 우항의 값을 대입하는 것입니다.

 

☞ +=, -=, *=, /=, %= (복합 대입 연산자)

public void test6() {
	int a = 10;
		
	// a =  a + 3
	System.out.println(a += 3);	// 13
		
	// a = a - 3
	System.out.println(a -= 3);	// 10
		
	// a = a * 3
	System.out.println(a *= 3);	// 30
		
	// a = a / 3
	System.out.println(a /= 3);	// 10
		
	// a = a % 3
	System.out.println(a %= 3);	// 1
}

@콘솔출력값
13
10
30
10
1

복합 대입연산자는 (ex) a = a + 1을 a += 1로 축약한 것입니다.

따라서 위에서도 a의 값이 위에 연산 결과에 따라 (a = a + 3...) 변경 된 값에 연산 적용이 되었습니다.

 

등호 (=)는 다른 연산자와 있을 땐 반드시 오른쪽에 위치하므로 =+ 이 아닌 += 인 점에 유의합시다!!

 

 

LIST