산술 연산자
사칙 연산을다루는 연산자.
모두 두개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽
산술 연산자 | 설명 |
+ | 왼쪽의 피연산자에 오른쪽의 피연선자를 더함. |
- | 왼쪽의 피연산자에서 오른쪽의 피연섡라를 뺌. |
* | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함 |
/ | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔 |
% | 왼쪽의 피연산자를오른쪽의 피연산자로 나눈 후, 그 나머지를 반환 |
비트 연산자
피연산자를 비트 단위로 논리 연산한다.
| (OR 연산자) : 두 비트 중 하나라도 1일 경우에 연산 결과로 1 반환
& (AND 연산자) : 두 비트 모두 1일 경우에 연산 결과로 1 반환
^ (XOR 연산자) : 두 비트 중 하나만 1일 경우에 연산 결과로 1반환
A | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
B | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
A | B | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
A & B | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
A ^ B | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
~ (비트 전환 연산자) : 2진수로 표현 했을 때, 각 비트의 값을 1은 0으로, 0은 1로 전환한다.
A | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
~A | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
<< , >>, >>> (쉬프트 연산자) : 피연산자의 각 비트를 왼쪽 또는 오른쪽으로 이동한다.
A << 2 : A를 이루는 비트를 각 2칸씩 왼쪽으로 이동한다.
A >> 2 : A를 이루는 비트를 각 2칸씩 오른쪽으로 이동한다.(빈칸은 MSB의 값으로 채워진다.)
A >>> 2 : A를 이루는 비트를 공백은 0으로 채우며 각 2칸씩 이동한다. (MSB를 비롯한 공백 비트의 값이 0이 된다.)
A | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
A << 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
A >> 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
A >>> 2 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 |
관계 연산자
연산의 결과로 true 또는 false의 boolean 타입을 반환한다.
연산자 | 기능 | 예시 |
> | 왼쪽 항이 크면 참을, 아니면 거짓을 반환 | 3 > 4 (false) |
>= | 왼쪽 항이 크거나 같으면 참을, 아니면 거짓을 반환 | 3 >= 4 (false) |
< | 오른쪽 항이 크면 참을, 아니면 거짓을 반환 | 3 < 4 (true) |
<= | 오른쪽 항이 크거나 같으면 참을, 아니면 거짓을 반환 | 3 <= 4(true) |
== | 두개 항의 값이 같으면 참을, 아니면 거짓을 반환 | 3 == 4 (false) |
!= | 두개 항의 값이 다르면 참을, 아니면 거짓을 반환 | 3 != 4 (true) |
논리 연산자
연산자 | 기능 | 예시 |
&& | 두개 항의 값이 모두 참이면 참을, 그렇지 않으면 거짓을 반환 | (5 > 3) && (5 > 2) (true) |
|| | 두개 항 중 하나라도 참이면 참을, 그렇지 않으면 거짓을 반환 | (5 < 3) || (5 < 2) (true) |
! | 단항 연산자. 참인 경우 거짓, 거짓인 경우 참으로 반환 | !(5 < 3) (true) |
(참고) 단락회로평가
논리 연산자를 사용할 때, 두항 중 앞의 항(왼쪽 항)에서 결과가 정해질 경우, 뒤의 항(오른쪽 항)의 값이 참인지 거짓인지 평가하지 않는 것을 단락회로평가라고 한다. 이는 뒤의 항에 연산식이 있을 경우, 해당 연산식 또한 수행되지 않을 수 있음을 의미한다.
public class OperatorEx3 {
public static void main(String[] args) {
int num1 = 10;
int i = 2;
boolean value = ((num1 = num1 +10)<10) && ((i = i+2)<10);
//num1의 값은 20, i의 값은 4가 됐을 거라고 생각 할 수 있음
System.out.println(num1); // 20
System.out.println(i); // 2
// value의 초기화에서 왼쪽항 봐도 평가가 되기 때문에 오른쪽 항을 평가하지 않아 i의 값은 2 그대로이다.
System.out.println(value); //false
int num2 = 10;
int i2 = 2;
boolean value2 = ((num2 = num2 +10)<10) || ((i2 = i+2)<10);
System.out.println(num2); //20
System.out.println(i2); //4
// 왼쪽항이 false여도 오른쪽항까지 체크해야 되기 때문에 i2는 4
// 만약 왼쪽항이 true였다면 이번에도 계산안됨
System.out.println(value2); //true
instanceof
객체 타입을 확인하는데 사용하며, 형변환이 가능한지에 대한 참, 거짓 값을 반환한다.
class A{}
class B extends A{}
class Example{
public static void main(String args[]){
A a = new A();
B b = new B();
system.out.println("a instance of A : " + (a instanceof A)); // true
system.out.println("b instance of A : " + (b instanceof A)); // true
system.out.println("a instance of B : " + (a instanceof B)); // false
system.out.println("b instance of B : " + (b instanceof B)); // true
}
}
위 코드에서 유일하게 false가 나온 a instance of B의 경우는 부모 클래스를 참조하는 a 객체가 자식 클래스인 B로 형변환할 순느 없기 때문이다.
assignment(=) operator
변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
복합 대입 연산자의 경우, 위에서 언급한 산술연산자와 비트연산자를 포함하는 이항 연산자와 합쳐 연산 결과를 왼쪽 항에 저장한다.
화살표(->) 연산자
람다 표현식. 이는 메소드를 하나의 식으로 표현한 것을 의미한다. 이는 일회성 객체의 선언과 같은 불필요한 코드를 줄여주고 코드의 가독성을 높여준다.
그런데 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다.
따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
익명 클래스
new Object() {
// 일반적인 메소드
int min(int x, int y) {
return x < y ? x : y;
}
}
// 람다 표현식
(x, y) -> x < y ? x : y;
람다 표현식 작성
(매개변수목록) -> { 함수몸체 }
ex (x) -> {system.out.println(x);}
람다 표현식을 사용할 때 유의할 점
1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
2. 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. (이때 세미콜론(;)은 붙이지 않음)
4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 된다. (이때 세미콜론(;)은 붙이지 않음)
함수형 인터페이스
람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야만 한다.
이는 아래와 같은 문법으로 나타낼 수 있다.
참조변수의타입 참조변수의이름 = 람다 표현식
위의 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부른다.
함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야 한다.
또한, FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있다.
FunctionalInterface 어노테이션을 적용한 interface의 경우, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.
자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 오류를 발생시킨다.
@FunctionalInterface
interface Calc { // 함수형 인터페이스의 선언
public int min(int x, int y);
}
public class Lambda02 {
public static void main(String[] args){
Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
System.out.println(minNum.min(3, 4)); // 함수형 인터페이스의 사용
}
}
3항 연산자
조건 연산자. 유일한 삼항 연산, '조건식?결과1:결과2;' 로 표현. 이때 조건식이 참이면 결과1을, 거짓이면 2를 실행한다.
public class Example {
public static void main(String[] args) {
int num1 = (5>3)?10:20;
System.out.println(num1); // 10
int num2 = 10;
int num3 = 20;
int max = (num2 > num3)?num2:num3;
System.out.println(max); //20
}
}
연산자 우선 순위
수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정
연산자의 우선순위표
우선 순위 | 연산자 | 설명 | 결합 방향 |
1 | [] | 첨자 연산자 | 왼쪽에서 오른쪽 |
. | 멤버 연산자 | 왼쪽에서 오른쪽 | |
2 | ++ | 후위 증가 연산자 | 왼쪽에서 오른쪽 |
-- | 후위 감소 연산자 | 왼쪽에서 오른쪽 | |
3 | ! | 논리 NOT 연산자 | 오른쪽에서 왼쪽 |
~ | 비트 NOT 연산자 | 오른쪽에서 왼쪽 | |
+ | 양의 부호 (단항 연산자) | 오른쪽에서 왼쪽 | |
- | 음의 부호 (단항 연산자) | 오른쪽에서 왼쪽 | |
++ | 전위 증가 연산자 | 오른쪽에서 왼쪽 | |
-- | 전위 감소 연산자 | 오른쪽에서 왼쪽 | |
- | 음의 부호 (단항 연산자) | 오른쪽에서 왼쪽 | |
++ | 전위 증가 연산자 | 오른쪽에서 왼쪽 | |
(타입) | 타입 캐스트 연산자 | 오른쪽에서 왼쪽 | |
4 | * | 곱셈 연산자 | 왼쪾에서 오른쪽 |
/ | 나눗셈 연산자 | 왼쪽에서 오른쪽 | |
% | 나머지 연산자 | 왼쪽에서 오른쪽 | |
5 | + | 덧셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽 |
- | 뺄셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽 | |
6 | << | 비트 왼쪽 시프트 연산자 | 왼쪽에서 오른쪽 |
>> | 부호 비트를 확장하면서 비트 오른쪽 시프트 연산자 | 왼쪽에서 오른쪽 | |
>>> | 부호 비트까지 모두 비트 오른쪽 시프트 연산자 | 왼쪽에서 오른쪽 | |
7 | < | 관계 연산자 (보다 작은) | 왼쪽에서 오른쪽 |
<= | 관계 연산자 (보다 작거나 같은) | 왼쪽에서 오른쪽 | |
> | 관계 연산자 (보다 큰) | 왼쪽에서 오른쪽 | |
>= | 관계 연산자 (보다 크거나 같은) | 왼쪽에서 오른쪽 | |
instance of | 인스턴스의 실제 타입 반환 | 왼쪽에서 오른쪽 | |
8 | == | 관계 연산자 (와 같은) | 왼쪽에서 오른쪽 |
!= | 관계 연산자 (와 같지 않은) | 왼쪽에서 오른쪽 | |
9 | & | 비트 AND 연산자 | 왼쪽에서 오른쪽 |
10 | ^ | 비트 XOR 연산자 | 왼쪽에서 오른쪽 |
11 | | | 비트 OR 연산자 | 왼쪽에서 오른쪽 |
12 | && | 논리 AND 연산자 | 왼쪽에서 오른쪽 |
13 | || | 논리 OR 연산자 | 왼쪽에서 오른쪽 |
14 | ?: | 삼항 조건 연산자 | 오른쪽에서 왼쪽 |
15 | = | 대입 연산자 및 복합 대입 연산자 (=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=) |
오른쪽에서 왼쪽 |
(optional) Java 13. switch 연산자
switch statement | switch operator |
다수의 case,break가 존재하게 된다. break; 를 빼먹을 경우 다음 분기로 넘어가게 됨. return값이 존재할수없다. |
break를 사용하지 않아도 된다. yield 존재함 return값 존재해도됨 case -> A 같은 람다 형식으로 표현가능 switch의 반환값이 따로 필요하지 않거나 case가 switch 들어오는 모든 인자를 커버하는 경우 default 항목을 넣어주지 않아도 되나 그렇지 않은 경우는 default -> code를 작성해야 한다. |
public class Main {
public static void main(String[] args) {
//Java 12 이전
int num = 1;
int returnNum = 0;
switch(num){
case 1:
returnNum = 1;
System.out.println("1들어옴");
break;
case 2:
returnNum = 2;
System.out.println("2들어옴");
break;
case 3:
returnNum = 3;
System.out.println("3들어옴");
break;
}
System.out.println("returnNum : [ " + returnNum + " ]");
//Java 12
returnNum = switch(num){
case 1 -> 1;
case 2 -> 2;
default -> throw new IllegalStateException("Unexpected value: " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]");
//Java13
returnNum = switch(num){
case 1 : yield 3;
default : throw new IllegalStateException("unexpected value : " + num);
};
System.out.println("returnNum : [ " + returnNum + " ]");
}
}
// 1 들어옴
// returnNum : [ 1 ]
// returnNum : [ 1 ]
// returnNum : [ 3 ]
ref {
http://www.tcpschool.com/java/java_operator_arithmetic
https://staticclass.tistory.com/25
https://velog.io/@foeverna/Java-연산자-관계-논리-조건-비트-연산자
https://improver.tistory.com/140
http://www.tcpschool.com/java/java_lambda_concept
https://castleone.tistory.com/6
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
자바(Java) instanceof 사용방법
instanceof는 객체타입을 확인하는데 사용한다. 속성은 연산자이고 형변환이 가능한 지 해당 여부를 true 또는 false로 가르쳐준다. 객체 타입이라 하니 어려운 개념 같은데, 주로 부모 객체인지 자식
improver.tistory.com
[Java] 연산자 - 관계, 논리, 조건, 비트 연산자
비교 연산자라고도 하며 우리가 수학시간에 배웠던 부등호를 생각하시면 됩니다. 관계연산자의 결과는 true 혹은 false 값인 boolean 자료형으로 반환이 됩니다. 뒤에서 배울 제어문에서 많이 사용
velog.io
07. [자바] 비트 연산자 &, |, ^, ~, <<, >>
비트 연산자란? 비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의 각 자리를 알아보자 |(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다.
staticclass.tistory.com
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
}
'Programming > Java' 카테고리의 다른 글
[JAVA] 클래스 (0) | 2022.02.06 |
---|---|
[JAVA]제어문 (0) | 2022.01.28 |
[whiteship/live-study]2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.01.17 |
[whiteship/live-study]1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.01.10 |
[Spring Boot] Unsupported class file major version 59 (0) | 2022.01.09 |
댓글