반응형
백기선님이 과거에 진행했던 Java 스터디 3주차 스터디 입니다.
산술 연산자
- 산술 연산자에는 사칙 연산자(+ ,- ,* ,/ )와 나머지 연산자(%)가 있다.
- 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선 순위가 높으므로 먼저 처리된다.
- 피연산자(연산자가 아닌 것, ex 1, 10)가 정수형인 경우, 나누는 수로 0을 사용할 수 없다.
- boolean 타입을 제외한 모든 기본형 타입에서 사용이 가능하다.
- 계산하는 값의 결과가 변수의 타입의 범위를 넘어서면 오버 플로우가 발생할 수 있다.
코드 예제
byte a = 10;
byte b = 10;
byte c = (byte) a + b;
//JVM은 기본적으로 32바이트로 계산하므로 a와 b 두 개의 피연산자들을 int형으로 바꾸어 계산한다.
//따라서 명시적 캐스팅이 필요하다.
int a = 10;
double b = 6.8;
System.out.println(a + b); //16.8 실수형으로 바뀐다.
int a = 10;
char b = 'a';
char c = (char)(a + b);
int d = a + b;
System.out.println(c); //k
System.out.println(d); //107
비트 연산자
- 비트 연산자는 피연산자를 비트단위로 논리 연산한다.
- 피연산자로 실수는 허용하지 않으며, 정수(문자 포함)만 허용한다.
- |, &, ^, ~, <<, >>, >>> 가 있다.
비트 논리 연산자 : | (OR 연산자), & (AND 연산자), ^ (XOR 연산자), ~ (NOT 연산자)
X | Y | X | Y | X & Y | X ^ Y | ~x |
1 | 1 | 1 | 1 | 0 | 0 |
1 | 0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 1 |
쉬프트 연산자 : <<, >>, >>>
연산자 | 사용 | 설명 |
<< | x << y | 정수 x의 각 자리 비트를 왼쪽으로 y만큼 이동한다. 빈자리는 0으로 채워진다. |
>> | x >> y | 정수 x의 각 자리 비트를 오른쪽으로 y만큼 이동한다. 빈자리는 최상위 부호 비트와 같은 값으로 채워진다. |
>>> | x >>> y | 정수 x의 각 자리 비트를 오른쪽으로 y만큼 이동한다. 빈자리는 0으로 채워진다. |
8 << 2
//8은 2진수로 00001000이다.
//8 << 2는 10진수 8의 2진수를 왼쪽으로 2자리 이동시킨다.
//00100000 32가 된다.
//빈자리는 0으로 채워진다.
-8 >> 2
//-8은 11111000이다.
//부호를 유지하기 위해 빈 자리에 1을 넣는다.
// 11111110 -2다.
관계 연산자 (비교 연산자)
결과는 모두 boolean 값으로 리턴된다.
연산자 | 설명 | true인 경우 | false인 경우 |
> | 좌변 값이 크면 true, 아니면 false | 3 > 1 | 1 > 5 |
< | 좌변 값이 작으면 true, 아니면 false | 2 < 4 | 3 < 2 |
>= | 좌변 값이 크거나 같으면, true 아니면 false | 3 >= 3 | 3 >= 2 |
<= | 과변 값이 같거나 작으면, true 아니면 false | 7 <= 9 | 5 <= 1 |
== | 두 값이 같으면 true, 아니면 false | 1 == 1 | 1 == 2 |
!= | 두 값이 다르면 true, 아니면 false | 1 != 2 | 1 != 1 |
논리 연산자
- &와 &&는 차이가 있다.
- &&는 앞 피연산자의 결과가 true면 뒤 피연산자를 연산한다. 즉 앞 피연산자의 결과가 false면 뒤 피연산자를 연산하지 않고 false를 리턴한다.
- &는 상관 없이 앞 피연산자, 뒤 피연산자 모두 연산해 결과를 리턴한다.
- |와 ||도 차이가 있다.
- &&도 똑같이 앞 피연산자의 결과가 true면 바로 true를 리턴한다.
- |는 상관 없이 앞 피연산자, 뒤 피연산자 모두 연산해 결과를 리턴한다.
연산자 | 연산 | true인 경우 | false인 경우 |
& | AND | true & true | true & false, false & false |
&& | AND | true && true | false & true, false & false |
| | OR | true | true, true | false | false | false |
|| | OR | true | true, true | false | false | false |
! | NOT | !false | !true |
instanceof
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
- 주로 조건문에 사용되며 instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
- 그리고 연산의 결과로 boolean값인 true와 false 중의 하나를 반환한다.
- instanceof를 이용한 연산 결과를 true로 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 의미한다.
- 아래 코드에서 보면 자바 모든 클래스의 조상인 Object를 instanceof 연산자에 사용했다.
- if문에서 값이 true라고 나와서 true1이 출력되었다.
- 요약하면, 실제 인스턴스와 같은 타입의 instanceof 연산 이외에 조상 타입의 instanceof 연산에도 true를 결과로 얻는다.
- instanceof 연산의 결과가 true이므로 위 경우도 형변환을 해도 아무런 문제가 없다는 것을 의미한다.
assignment(=) operator
- =는 대입 연산자다.
- 대입 연산자는 변수와 같은 저장 공간에 값 또는 수식의 연산 결과를 저장한다.
- 아래 코드를 확인해보면 lvalue와 rvalue가 존재한다.
- rvalue는 변수뿐만 아니라 식이나 상수 등이 모두 가능하지만, lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다.
- 그래서 리터럴이나 상수 같이 값을 지정할 수 없는 것들은 lvalue가 될 수 없다.
- op= 복합 대입 연산자도 존재한다. 예를 들면 +=, -=, *= , <<=, ^= 등이 있다.
int x = 3; // 변수에 x에 3이 저장되고,
System.out.println(x); // 연산 결과인 3인 출력한다.
x = y = 4; // y = 4 가 진행되고, x = y 가 진행된다
x = y // x는 lvalue, y는 rvalude 라고 한다.
화살표 연산자
- Java 8에서는 새로운 기능인 람다 표현식이 추가됨과 동시에 람다 표현식을 구성하는 데 사용되는 화살표 연산자가 Java에 등장했다.
- 표현식 본문에서 인수를 분리한다. 람다의 매개변수 리스트와 바디를 구분한다.
- ->는 매개변수를 받아 {} 중괄호를 실행시키는 것이다.
- 코드를 더욱 간결하게 만들어준다.
(int a, int b) -> { System.out.println(a+b); }
더 자세한 람다 표현식 포스팅은 아래에서 확인할 수 있다.
https://devdebin.tistory.com/119?category=1004578
3항 연산자
- 3항 연산자는 (조건문) : ? 참 : 거짓 구조를 가지고 있다. 예시로 바로 살펴보자.
- 조건문 ? 식1 : 식2
- 조건문이 참이라면 식1을 리턴한다. 조건문이 거짓이라면 식2를 리턴한다.
System.out.println( 1 < 3 ? "one" : "three"); //one 출력된다
연산자 우선 순위
- 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
- 단항 (1) > 이항 (2) > 삼항 (3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
- 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
JAVA 13. switch 연산자
- 화살표 연산자를 사용할 수 있다. 보고 처음에는 코틀린의 when이 생각났다.
- yield 기능을 사용해 값을 리턴할 수 있다.
public class MyClass {
public static void main(String[] args) {
int a = 10;
int result = switch (a) {
case 0, 1 -> {
yield 1;
}
case 2 -> {
yield 2;
}
case 3, 4, 5 -> {
yield 3;
}
default -> {
yield -1;
}
};
System.out.println(result);
}
}
틀린 부분이나 부족한 부분 피드백은 언제든 환영입니다!! 이상으로 포스팅을 마칩니다. 감사합니다.
참고 자료
자바의 정석(저자 : 남궁성)
반응형
댓글