산술 연산자
+, -, *, /, %
비트 연산자
&, |, ^
관계 연산자
<, >, ≤, ≥, ==, ≠
논리 연산자
&&, ||
instanceof
instanceof
란 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용하는 연산자이다.
[참조변수] instanceof [타입/클래스명]
연산 결과는 boolean
이다.
결과가 true
이면 참조 변수가 검사한 타입으로 형 변환이 가능하다는 것을 뜻한다.
참고로, 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false
를 결과로 얻는다.
조상타입의 참조변수로 자손 타입의 인스턴스를 참조할 수 있기 때문에, 참조 변수의 타입과 인스턴스의 타입이 항상 일치하지는 않는다.
때문에 조상 타입의 참조변수로는 실제 인스턴스의 멤버들을 모두 사용할 수 없기 때문에, 실제 인스턴스와 같은 타입의 참조변수로 형변환을 해야한 인스턴스의 모든 멤버들을 사용할 수 있다.
class InstaceofTest {
public static void main(String args[]) {
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) {
System.out.println("This is a FireEngine instance.");
}
if (fe instanceof Car) {
System.out.println("This is a Car instance.");
}
if (fe instanceof Object) {
System.out.println("This is an Object instance.);
}
// 클래스의 이름을 출력
System.out.println(fe.getClass().getName());
}
}
class Car {}
class FireEngine extends Car {}
This is FireEngine instance.
This is a Car instance.
This is an Object instance.
FireEngine
생성된 인스턴스는 FireEngine
타입인데도, Object
타입과 Car
타입의 instanceof
연산에서도 true
를 결과로 얻었다.
그 이유는 FireEngine
클래스는 Object
클래스와 Car
클래스의 자손 클래스이므로 조상의 멤버들을 상속 받았기 때문에, FireEngine
인스턴스는 Object
인스턴스와 Car
인스턴스를 포함하고 있는 셈이기 때문이다.
요약하면, 실제 인스턴스와 같은 타입의 instanceof
연산 이외에 조상 타입의 instanceof
연산에도 true
를 결과로 얻으며, instanceof
연산의 결과가 true
라는 것은 검사한 타입으로의 형변환을 해도 아무런 문제가 없다는 뜻이다.
assignment(=) operator
대입 연산자라고도 한다.
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연자들의 결합 방향은 오른쪽에서 왼쪽이다.
또한, 자바에서는 대입 연산자를 다른 연산자와 결합하여 만든 다양한 복합 대입 연산자를 제공한다.
화살표(→) 연산자
람다 표현식(lambda expression)이라고도 한다.
람다 표현식이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다.
// 메소드
int min(int x, int y) {
retrun x < y ? x : y;
}
// 람다 표현식
(x, y) -> x < y ? x : y;
메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다.
자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
익명 클래스
일반적인 인스턴스 생성법 (new
)와 다르게 중괄호가 마지막에 붙어있는 구조이다.
익명, 즉, 이름이 없는 클래스이다.
이름이 없다는 건 무슨 의미일까? 예를 들어 알아보자
public class Peseon {
void whoAmI() {
System.out.println("나는 Person이다.");
}
}
public class Child extends Person {
@Override
void whoAmI() {
System.out.println("I'm Child");
}
}
위는 익명 클래스가 아닌 일반적인 클래스이다.
이런 보통의 경우, 우리는 부모 클래스를 상속 받아 처리하려면 부모 클래스(Person)를 상속받는 클래스(Child)를 별도로 만들어서 처리한다.
💡 Override
부모 클래스로부터 상속 받은 메소드의 내용을 변경하는 것
Overloading
같은 이름의 메서드에 매개변수의 타입, 개수를 다르게 한것. (너무 많이 적재했다라는 뜻)상속 받은 클래스가 재 사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다.
그런데 만약 Person를 상속받아 처리해야하는 클래스가 또 필요한 경우, 매번 Child2 Child3 ... 등의 클래스를 만드는 것은 낭비이다.
상속 받은 클래스가 재 사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다.
이럴 경우 익명 클래스를 사용하면 된다.
public static void main(String[] args) {
Person p = new Person() {
String name = "Kim";
@Override
void whoAmI() {
System.out.println("나는 " + name + "이다.");
}
};
p.whoAmI();
}
위는 익명 클래스의 예이다.
인스턴스 생성시, 일반적인 경우와 다르게 중괄호가 더해져 그 안에 처리구문이 들어갔다.
따로 상속 받을 자식 클래스를 생성하지 않고, 인스턴스 생성 부분에서(new
) 중괄호 내에 자식 클래스의 내용을 선언하는 것이다.
// 람다 표현식
(x, y) -> x > y ? x : y;
// 익명 클래스
new Object() {
int min(int x, int y) {
return x < y ? x : y;
}
}
3항 연산자
(조건) ? 참일 때 : 거짓일 때
연산자 우선 순위
단항→이항→삼항 연산자 순으로 우선순위를 갖는다.
산술→비교→논리→대입 연산자 순으로 우선순위를 갖는다.
Java 13. switch 연산자
Java 12 부터 프리뷰로 추가되었다.
기존의 switch/case 문을 좀 더 간결하게 쓸 수 있다.
String str = "A";
switch(str){
case "A":
System.out.println("1");
case "B":
System.out.println("2");
case "C" :
System.out.println("3");
default :
System.out.println("그 외의 숫자");
}
기존의 switch 문에서 콜론(:
)을 화살표(→
)로 변경하여 사용할 수 있고 break
문을 생략할 수 있다.
String str = "A";
switch (str) {
case "A" -> System.out.println("1");
case "B" -> System.out.println("2");
case "C" -> System.out.println("3");
default -> System.out.println("그 외의 숫자");
}
식(expression)으로 사용될 수 있어서 바로 변수로 할당할 수 있다.
String result = switch(n) {
case "A" -> System.out.println("1");
case "B" -> System.out.println("2");
case "C" -> System.out.println("3");
default -> System.out.println("그 외의 숫자");
}
break
로 반환하는 문법이 JAVA 12에 있었으나,
JAVA 13에선 yield
로 변경되었다.
yield
는 '내다', '산출/생산하다' 등의 의미를 가지고 있다.
String result = switch(n) {
case "A" -> {
System.out.println("1");
yield 1;
}
case "B" -> {
System.out.println("2");
yield 2;
}
case "C" -> {
System.out.println("3");
yield 3;
}
default -> {
System.out.println("그 외의 숫자");
yield 100;
}
}
'JAVA > WhiteShip Java Live Study' 카테고리의 다른 글
[JAVA] 상속이란? (추상클래스, super, final, 오버라이딩...) (0) | 2021.06.07 |
---|---|
[JAVA] 클래스란? (클래스, 객체, new, 메소드, 생성자, this...) (0) | 2021.05.28 |
[JAVA] 제어문 (2) | 2021.05.23 |
[JAVA] 자바 데이터 타입, 변수 그리고 배열 (0) | 2021.05.17 |
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...) (20) | 2021.05.15 |