안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
(비트연산자는 제외한 포스팅 입니다.)
연산자의 종류와 우선순위
단항연산자
☞ +, -, !, (자료형) 연산자
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...) 변경 된 값에 연산 적용이 되었습니다.
등호 (=)는 다른 연산자와 있을 땐 반드시 오른쪽에 위치하므로 =+ 이 아닌 += 인 점에 유의합시다!!
'Java > Java' 카테고리의 다른 글
메소드란?, 매개변수가 있는/없는 메소드, 리턴 값이 있는/없는 메소드 (0) | 2022.03.03 |
---|---|
난수란?, Random 클래스, Math.random (0) | 2022.03.03 |
Scanner 클래스란?, next()메소드, nextLine()메소드 (0) | 2022.03.01 |
문자열을 저장하는 String 참조형이란?, String 특징, String + 연산 (0) | 2022.02.28 |
형변환(Type Casting)이란?, 암묵적 형변환, 명시적 형변환, ASCII CODE (0) | 2022.02.28 |