백기선님의 자바 라이브 스터디 3주 차 토픽을 가져왔습니다.
목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
산술 연산자
산술 연산자가 무엇일까요??
산술(算術, 영어: arithmetic)은 수학의 가장 역사 깊은 분야로, 수의 개념이나 수에 대하여 간단한 계산을 하는 방법, 그 성질이나 계산의 법칙 등의 이론적인 방법을 다루는 학문이다. (출처 : 위키백과)
위키에 따르면 산술이라는 용어를 '수에 대해 계산을 하는 것'이라고 표현하고 있습니다. 즉 우리가 생각하는 사칙 연산과 관한 내용이라고 생각하면 편합니다. 덧셈, 뺄셈, 곱셈,나눗셈 그리고 나머지 연산에 대해서 다뤄보겠습니다.
int a = 10;
int b = 20;
System.out.println(a+b);//a+b = 30
System.out.println(a-b);//a-b = -10
System.out.println(a*b);//axb = 200
System.out.println(a/b);//a/b = 0
System.out.println(a%b);//a를 b로 나눈 나머지
일단 덧셈,뺄셈,곱셈 까지는 여러분들도 이해하기 쉬우실 거라고 예상합니다. 그런데! 사실 10/20은 0.5인데 출력 결과는 0으로 나옵니다. 이게 어찌 된 일일까요?? 형변환이 일어나서 그렇습니다. int형 두 변수를 나누라고 했으니 값을 알아서 int형으로 바꿔준 상황입니다. 소수점 출력을 하고 싶다면 아래 사진처럼 해주시면 편합니다.
이 원리도 형변환과 관련이 있답니다. 실수형 값을 얻고 싶다면 원래는 실수형끼리 계산을 해야 합니다. 그러나 이미 int형으로 선언해버린 상황이고 수정이 불가능하다면, 나눗셈 계산 시에만 double나 float형으로 캐스팅해줍니다. b에만 해준 이유도 어차피 한쪽이 표현 범위가 넓기 때문에 a도 자동으로 float형으로 변환되니까 저렇게 표현해봤습니다.
자 그다음 나머지 연산은 무엇일까요? a를 b로 나눴을 때의 나머지 값을 구하는 연산입니다. 만약 5%3이라면 값은 2가 나와야 하겠죠. 그러면 a가 10이고 b가 20일 때의 나머지 값은?? 10입니다. 나눌 수 없으니 a 그대로 나오겠네요. 참고로 나머지 연산이 언어별로 다른 값이 나온다는 거 알고 계신가요?? 항상 그런 것은 아니고 b가 음수라면 값이 달라지는 상황이 연출됩니다. 이에 관한 자세한 내용은 기계인간님께서 너무 잘 정리해주셨습니다. 링크 달아둘 테니 직접 확인해주세요. (이보다 더 완벽하게 설명드릴 수 없었습니다.)
johngrib.github.io/wiki/java-remainder-operator/
비트 연산자
비트 연산자는 0과 1로 이루어진 비트들을 컨트롤하는 연산자입니다. 일반적으로 0은 False, 그 외 나머지 수는 True로 봅니다. 그래서 True,False 이용할때, 0과 1로 표현하기도 합니다. 비트 연산자에는 비트의 0과 1을 반전시키는 NOT(~) 연산자, 두 비트가 모두 1일때만 결과값이 1이 되는 AND(&) 연산자, 두 비트 중 하나만 1이어도 결과값이 1이 되는 OR(|)연산자와 양쪽 값이 다를때만 참(1)이 되는 XOR(^) 연산자가 있습니다. 괄호친 부분이 자바에서 연산자를 표현하는 방법입니다. 쉬프트 연산(>> 혹은 <<)의 경우 해당 방향으로 비트를 밀어줍니다. 2진법 특성상 비트가 한칸씩 밀리면 나누기 2 혹은 곱하기 2와 같은 효과가 나온다는 점도 알아두시면 좋습니다.
a의 NOT의 값이 -4인 이유는 고민해보시면 좋을듯합니다. 힌트를 드리자면 부호비트와 연관이 있습니다.
이진수
사실 저희가 다룬 10진수들도 컴퓨터 입장에서는 모두 이진수로 보입니다. 이진수를 수학적으로 구하는 방법은 학창시절에 이미 배우셨을거라고 생각합니다. 저는 자바 언어에서 아주 간단하게 5의 이진법이 무엇인지 체크하는 방법을 알려드리려고 합니다.
아주 심플하죠? Integer 클래스에 이미 좋은 함수가 있고 우리는 이걸 불러다가 사용하면 됩니다. 참고로 제 이미지에는 i:5라고 적혀있는데 저 'i:'는 프로그래머가 직접 작성하는 코드가 아닙니다. 주석 처리랑 같은 색인 이유가 있어요. 절대 따라적지 말아주세요.
관계 연산자
비교 연산자라고 하는 편이 좋으려나요?? 숫자 a와 b를 가지고 크다,작다, 같거나 크다, 같거나 작다등을 다룹니다. 또한 a와 b가 동일한지 아닌지 판단하는 내용도 관계 연산자에 해당됩니다.
출력을 해보시면 참인지 거짓인지에 따라서 true,false 값들이 나오게 됩니다. 주로 제어문에서 이러한 관계 연산자를 사용하는 편입니다.
논리 연산자
비트 연산자와 매우 유사합니다. 생김새도 하나가 두개가 되며(&가 &&로) 1(참)이 되는 조건 또한 동일합니다.
instanceof
A == B 처럼 A instanceof B의 형태로 사용합니다. 굳이 '==' 연산자를 가져온 이유는 둘이 비슷한듯 달라서 그랬습니다. 객체가 특정 클래스 / 인터페이스 유형인지 여부를 확인합니다. 예?? A가 B와 연관이 있니?? 라고 묻는 연산자입니다. 부모 자식관계를 알아낼때도 사용하는 연산자입니다.
A a = new A()로 생성했기에 a와 A는 당연히 연관이 있구요, a입장에는 C랑은 관계가 없죠. 반면 c의 입장에서 A를 상속받았으니 관계가 있습니다. 인터페이스 또한 클래스처럼 사용가능합니다.
assignment(=) operator
대입 연산자로 많이 불리며 할당 연산자로도 불립니다. 따로 언급하지는 않았습니다만 은연중에 제가 여러번 사용했습니다. a = 5에서 =이 대입 연산자입니다. a = a+5처럼 자기 자신을 피연산자로 사용하는 경우에는 축약해서 사용할 수 있습니다. 관련 표 첨부하겠습니다.
화살표(->) 연산자
제가 처음 보는 연산자가 나왔습니다. C언어의 포인터같은 연산자는 아닐테고 무엇일까요?? 화살표 연산자의 정체는 자바 8버전부터 도입된 람다 연산자라고 합니다. (매개변수,...) -> { Body }의 형태로 사용한다고 합니다.
자바스크립트에서 람다식 비슷한걸 본 기억이 있는데 맞는지 잘 모르겠네요. 코틀린 하면서 봤었나..? 아무튼 이 람다식 덕에 자바가 기존 객체지향 언어에서 객체지향 + 함수형 언어로 거듭날 수 있었다고 합니다.
삼항 연산자
A == B의 경우 이항 연산자라고 부르고 !A는 단항 연산자라고 부릅니다. 그렇다면 삼항 연산자는 무엇인가 3개가 필요하구나 유추가 가능합니다.
조건 ? true일때 : false일때의 형태를 가지고 있습니다. 제가 제시한 예제는 5와 3의 크기를 비교하고 있고 5가 크기에 5를 리턴하고 있습니다. 두 수에서 큰 수를 찾아서 리턴하는 예제였습니다.
연산자 우선순위
복잡한 수학 계산식이 있다면 우리는 무작정 왼쪽에서 오른쪽으로 푸는게 아니라 우선순위에 따라서 순서대로 풀죠. 컴퓨터도 마찬가지로 연산을 할때 우선순위를 따릅니다. 컴퓨터도 사람처럼 괄호에 대한 우선순위를 가장 높게
가져갑니다. 그리고 당연하게도 대입 연산자가 가장 마지막 우선순위네요. 계산 결과가 변수에 대입되야 하기에 매우 논리적입니다.
Switch 연산자
이 또한 저는 처음 보는 연산자입니다. switch-case문은 알지만 switch 연산자라니 뭘까요?? 스위치처럼 0과 1을 딸깍딸깍 바꿔주는 연산자일까요?? 그냥.. switch-case문에 수정이 일어났나봅니다. 일단 break문을 대신해서 yield문을 사용하도록 권장합니다. 정확히는 아래 예시처럼 yield를 이용해서 리턴하도록 할 수 있습니다. 또한 람다 연산자를 이용해서 멀티 블록을 깔끔하게 사용할 수 있습니다.
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> {
System.out.println(6);
yield 6;
}
case TUESDAY -> {
System.out.println(7);
yield 7;
}
case THURSDAY, SATURDAY -> {
System.out.println(8);
yield 8;
}
case WEDNESDAY -> {
System.out.println(9);
yield 9;
}
default -> {
throw new IllegalStateException("Invalid day: " + day);
}
};
해당 코드 출처 :
docs.oracle.com/en/java/javase/13/language/switch-expressions.html
참고
'Java' 카테고리의 다른 글
[JAVA] 자바 제어문 - 반복문 (0) | 2021.04.13 |
---|---|
[JAVA] 자바 제어문 - 조건문 (0) | 2021.04.12 |
[JAVA] 배열 선언하기 및 타입 추론 (0) | 2021.04.09 |
[JAVA] 타입 변환 (0) | 2021.04.08 |
[JAVA] 자바 변수 스코프와 라이프타임 (0) | 2021.04.07 |