[live-study] 3: 연산자
백기선님이 진행하시는 live-study 3주차 과제
3주차 과제
목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
산술 연산자
<용어>연산자: 어떠한 기능을 수행하는 기호피연산자: 연산자의 작업 대상
<연산자>
+: 덧셈 기능을 수행한다.숫자와 String 모두에 적용 가능하다.
"abc" + "cde"; // abccde 10 + 20; // 30
char의 경우 유니코드와 숫자를 혼합한 결과를 char변수에 대입할 수 없고, 결과 타입을 일치시켜야 한다.
char a = 'a'; // char ch = a + 1; // 불가능. char ch = (char)(a+1); // OK
증가연산자
++은x = x + 1과 같은 일을 수행한다.
-: 뺄셈 기능을 수행한다.- 감소연산자
--은x = x - 1과 같은 일을 수행한다.
- 감소연산자
*: 곱셈 기능을 수행한다./: 나눗셈 기능을 수행한다.%: 나머지(modular)기능을 수행한다.int modular = 5%3; // 5 나누기 3의 나머지인 2가 저장된다. double modular2 = 8.0 % 2.5; // 0.5가 저장된다.
산술 연산자는 이항연산자이고, 피연산자중 표현범위가 큰 타입으로 프로모션하여 타입을 일치시킨다.
ex. char + int => int + int => int
특이한 점은 다음 예제이다.
byte a = 1;
byte b = 2;
// byte result = a + b; // int + int가 되어 에러. 캐스팅 필요
byte result = (int)(a+b); // 성공위처럼 되는 이유는 byte에서 수행되는 수학적 결과는 int형으로 저장되기 때문이다.
즉 byte result = a + b는 byte result = (int)a + (int)b; 와 같다는 말이다.
비트 연산자
피연산자를 비트단위로 계산한다. 실수형(float, double)을 제외한 모든 기본형에 사용할 수 있다.
| (OR 연산자): 피연산자중 어느 한쪽이 1이면 1이다.0|0 => 0 0|1 => 1 1|1 => 1
& (AND 연산자): 피연산자 양쪽이 1이여야 1이다.0|0 => 0 0|1 => 0 1|1 => 1
^ (XOR 연산자): 피연산자가 서로 다를때 1이다.0|0 => 0 0|1 => 1 1|1 => 0
10진수로 예를 들면 1 ^ 3은 다음과 같다.
0000 0001(= 1)^0000 0011(= 3)
결과는0000 0010= 2가 된다.
관계 연산자
값을 비교할때 사용하는 연산자이다.
피연산자를 같은 타입으로 두고 계산한다.
결과값으로 boolean true나 false를 반환한다.
참조형은 ==와 !=만 사용할 수 있다.
- x
==y : x와 y가 같으면 true, 다르면 false - x
!=y : x와 y가 다르면 true, 같으면 false - x
>y : x가 y보다 크면 true, 같거나 작으면 false - x
>=y : x가 y보다 크거나 같으면 true, 작으면 false - x
<y : x가 y보다 작으면 true, 같거나 크면 false - x
<=y : x가 y보다 작거나 같으면 true, 크면 false
'0'과0은 각각char(유니코드 48)와int다. 그러므로'0' == 0은false이다.
논리 연산자
피연산자가 반드시 boolean이여야 하고, 논리 연산의 결과 또한 boolean이다.
- x
&&y : x와 y가 모두 true일 때 true, 하나라도 false라면 false를 반환 - x
||y : x와 y중 하나만 true여도 true, 둘 다 false라면 false를 반환
&&가 ||보다 우선순위가 높다. &&와 ||를 같이 사용하는 경우 괄호를 사용하도록 한다.
(1==0) || (1==1) // true
(1==0) && (1==1) // false
('0'!=0) || (1==1) // true
('0'!=0) && (1==1) // true
('0'==0) && (1==1) // falseinstanceof
instanceof는 참조변수가 어떠한 타입이 맞는지 여부를 확인하기 위해 사용한다.참조변수 instanceof 클래스(타입) 으로 사용할 수 있고, true면 참조변수를 해당 클래스로 형변환 할 수 있다는 의미이다.
다음의 상속관계인 서브클래스 인스턴스도 슈퍼클래스를 참조하고 있기 때문에 true가 나온다.
public class SuperClass {
}
public class SubClass extends SuperClass {
}
public class Main {
public void main() {
SuperClass subClass = new SubClass();
subClass instanceof SuperClass; // true
}
}assignment(=) operator
좌측 피연산자에 오른쪽 피연산자를 대입하는 것을 말한다.
좌측 피연산자는 상수가 아니여야 한다.
=앞에 다른 연산자가 오면 좌측 피연산자에 우측 피연산자를 연산하고, 다시 좌측 피연산자에 저장한다 는 의미가 된다. (프리미티브 타입에만 적용, 단 +=은 String에도 적용 가능 )
int a = 10 // a에 10을 대입한다.
a += 10 // a = a + 10과 같은 의미다. 즉 현재 a == 20
a -= 5 // a = a - 5. --> a == 15
a *= 2 // a = a * 2 --> a == 30
a /= 3 // a = a / 3 --> a == 10
a %= 9 // a = a % 9 --> a == 1// 시프트 연산자도 사용할 수 있다.
int a = 1 // 2진수로 0000 0001
a <<= 4 // 4만큼 왼쪽으로 비트를 이동한다. 0001 0000 == 10진수 16
a >>= 1 // 1만큼 오른쪽으로 비트를 이동한다. 0000 1000 == 10진수 8화살표(->)
자바 8부터 도입된 람다식에 이용되는 연산자로, 간단하게 설명하면 재사용되지 않는 함수나 인터페이스를 익명함수로 구현하는데, 익명함수 작성을 간편하게 해주는 것이 람다식이다.
매개변수 -> 리턴 값 or () -> 리턴 값 or 매개변수 -> {//코드} or () -> {//코드} 의 모습을 하고있다.
람다식 사용 전
public interface PlusInterface {
int plus(int a, b);
}
public class PlusImplement implements PlusInterface {
@Override
int apply(int a, int b){
return a + b;
}
}
public class Main {
public void main() {
PlusInterface plus = new PlusImplement();
plus.apply(10, 20);
}
}`람다식 사용 후` ``` public interface Plus { void plus(int a, int b); }
public class Main {
public void main() {
PlusInterface plus = (a, b) -> a+b;
}
}
## 3항 연산자
조건식을 한 줄에 나타낼 수 있는 연산 방법이다.
`조건 ? A : B`의 형태로 나타낸다. 만약 조건이 true일 경우 A, false일 경우 B를 반환한다.
// 만약 나이가 성인나이보다 어리냐는 조건에 true이면 "학생", false이면 "성인"이라는 문자열을 person에 저장한다.
int myAge = 15;
int adultAge = 20;
String person = myage < adultAge ? "학생" : "성인";
연산자 우선순위

()괄호>{}괄호>산술>비교>논리>대입순이다.단항>이항>삼항순이다.- 연산 진행방향은 단항, 대입 대입연산자를 제외하고 왼쪽 -> 오른쪽 순이다.
- 증감연산자는(++, --) 피연산자 앞에 올경우 해당 줄의 코드를 실행하기 전에 연산을 하고, 뒤에 올 경우 코드를 실행한 후 연산한다.
int a = 1; int b = 0; b = a++; // b = 1 (변하기전 a의 값) -> 마지막에 a = a + 1
Java 13. switch 연산자
자바 12에서 switch문을 statement가 아닌 ->를 사용한 expression으로 사용할 수 있게 되었는데, 자바 13에서 switch expression의 break대신 yield 키워드를 사용해서 반환되야 하는 값을 지정한다. (이 부분은 완전하게 이해가 되지 않았다)
// 오라클에 나와있는 예제
// https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html
Day day = Day.WEDNESDAY;
int numLetters = switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
yield 6;
case TUESDAY:
System.out.println(7);
yield 7;
case THURSDAY:
case SATURDAY:
System.out.println(8);
yield 8;
case WEDNESDAY:
System.out.println(9);
yield 9;
default:
throw new IllegalStateException("Invalid day: " + day);
};
System.out.println(numLetters);참고
https://github.com/castello/javajungsuk_basic/blob/master/javajungsuk_basic_%EC%9A%94%EC%95%BD%EC%A7%91.pdf
https://kils-log-of-develop.tistory.com/336
https://stackoverflow.com/questions/58049131/what-does-the-new-keyword-yield-mean-in-java-13