산술연산자
사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자.
산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.
- + : 더하기
- - : 빼기
- * : 곱하기
- / : 정수에서는 몫, 실수에서는 나누기
- % : 정수에서는 나머지
System.out.println(10 + 3); // 13
System.out.println(10 - 3); // 7
System.out.println( 20 / 5); // 4
System.out.println( 10 / 3); // 몫인 3
System.out.println(10 % 3); // 나머지 1
System.out.println(10.0 / 3); // 나누기 3.33333
대입 연산자(Assignment Operator), 복합대입 연산자
대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자(=)이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.
자바에서는 대입 연산자와 다른 연산자(산술, 비트)를 결합하여 만든 다양한 복합 대입 연산자를 제공한다.
- = : 등호 오른쪽 값을 왼쪽의 변수로 저장한다.(보낸다)
예) a = 10; 가능
10 = a; 불가능 - += : 더해서 보내라.
- -= : 빼서 보내라.
- *= : 곱해서 보내라.
- /= : 몫을 보내라. 나눠서 보내라.
- %= : 나머지를 보내라.
- &= : 비트 AND 연산한 후 보내라.
- |= : 비트 OR 연산한 후 보내라.
- ^= : 비트 XOR 연산한 후 보내라.
- <<= : 왼쪽 시프트한 후 보내라.
- >>= : 부호를 유지하며 오른쪽 시프트한 후 보내라.
- >>>=: 부호에 상관없이 오른쪽 시프트한 후 보내라.
int a = 10;
a += 10; // a 에 10 을 더한 값을 보내라
System.out.println(a); // 20
a -= 5; // a(20)에 5를 뺀 값을 보내라
System.out.println(a); // 15
증감연산자
- a++ : a 를 사용하고 나서 1 증가시킨다.
- ++a : a 를 1증가시키고 나서 사용한다.
- a-- : a 를 사용하고 나서 1 감소시킨다.
- --a : a 를 1 감소시키고 나서 사용한다.
int b = 10;
System.out.println(b++); // 10 // +해주기는하는데 이번 실행에서는 +된 값을 반영해주진 않음. 사용을 먼저하기 때문
System.out.println(b); //11
int c = 12;
System.out.println(--c); //11 // -를 먼저 해준 뒤 사용하기 때문에 -된 값이 반영된다.
System.out.println(c); // 11
관계연산자
비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단하여 true / false 로 반환한다. 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의결합 방향은 왼쪽에서 오른쪽이다.
- > : 크다
- >= : 크거나 같다 ( => 는 안됨)
- < : 작다
- <= : 작거나 같다 ( =< 는 안됨)
- == : 같다 (기본자료형: primitive type)
- != : 같지 않다
int a=20;
int c=10;
System.out.println(a<c); //false
System.out.println(a>c); //true
System.out.println(a!=c); //true
System.out.println(a==c); //false
//변수값 초기화
a=11;
c=11;
System.out.println(a>=c); //true
System.out.println(a<=c); //true
논리 연산자(logical operator)
주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자.
AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, 피연산자의 결합 방향은 오른쪽에서 왼쪽입니다.
- && : 모든 조건식을 만족하면 true, 아니면 false 이다.
false 인 조건식이 나타나면 그 이후는 더 이상 처리하지 않는다. - || : 조건식을 하나라도 만족하면 true, 아니면 false 이다. ( 기호는 shift + \ )
true 인 조건식이 나타나면 그 이후는 더 이상 처리하지 않는다. - ! : 조건식의 결과를 반대로 변경한다.
int b = 100;
System.out.println(b == 100 && b > 10); // true
System.out.println(b == 100 && b < 10); // false
System.out.println(b == 100 || b < 10); // true
System.out.println(!(b == 100)); // false
int c = 100;
System.out.println(b == 10 && c++ > 10); // false
System.out.println(c); // 100 -> 왜 101이 아님? c++ 헸는데? : 앞 조건식이 false 이기 때문에 그 이후는 더 이상 처리하지 않음!!
System.out.println(b == 100 || c++ > 10); // true
System.out.println(c); // 100 -> 왜 101이 아님? c++ 했는데? : 앞 조건식이 true 이기 때문에 그 이후는 더 이상 처리하지 않음!!
삼항 연산자
자바에서 유일하게 피연산자를 세 개나 가지는 조건 연산자이며, 조건 연산자라고도 한다.
조건식 ? 조건식이 true 경우 : 조건식이 false 경우 (총 3가지 연산 조건식, 조건식 true, 조건식 false)
int age = 30;
boolean isAdult = age >= 20; // true 조건식만들어주기
System.out.println( isAdult ? "요금은 3000원" : "요금은 1000원"); //요금은 3,000원
비트 연산자(bitwise operator)
논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자.
컴퓨터는 2진수를 기반으로 데이터를 저장하고 연산을 진행하고, 2진수는 0과 1로 표현되는 수이다. 저 0과 1의 각 숫자는 자료를 나타내는 가장 작은 단위로 비트라고 한다. 그리고 이 비트가 8개 모이면 byte가 된다.
- 0과 1, 참과 거짓, 스위치의 on/off와 같은 두가지의 상태 값
- 1개 비트는 0, 1 두가지 상태를 나타냄
- 2개의 비트는 00, 01, 10, 11 - 4가지 상태를 나타냄
- n개의 비트는 2^n가지의 정보를 표현할 수 있음
- & (비트 AND) : 두 비트 자리수가 모두 1이면 1을 반환함, 다르거나 모두 0일땐 0을 반환함
- | (비트 OR) : 두 비트 중 하나라도 1이면 1을 반환함
- ^(비트 XOR) : 두 비트가 다를 때 1을 반환함
- ~(비트 NOT) : 비트를 1이면 0으로, 0이면 1로 반전시킴, 단 위 3가지 연산자와 달리 피연산자가 1개이다. 1개의 비트값을 모두 반전시킴
- <<(left shift) : 비트를 왼쪽으로 이동시킴
- >>(right shift) : 부호를 유지하면서 지정한 수 만큼 비트를 오른쪽으로 이동시킴
- >>> : 비트를 전부 오른쪽으로 이동시키는데 >>와 달리 이동으로 빈 공간이 된 자리를 전부 0으로 채우기 때문에 음수의 경우에는 >>를 사용해야함
// & (비트 AND): 정수만 가능, 실수는 컴파일 에러
int a = 9; // 1001
int b = 10; // 1010
int and = a & b; // 1000
System.out.println(and); //10진수 8 // 1000 (2진수) = 8 (10진수)
a = -10;
b = -9;
and = a & b;
System.out.println(and);
double c = 1.5;
double d = 3.2;
double doubleAnd = c & d; // 컴파일 에러
// | (비트 OR) : 두 비트 중 하나라도 1이면 1을 반환함
int or = a | b; // 1001 1010 -> 1011
System.out.println(or); //출력: 10진수 11 // 1011 (2진수) = 11 (10진수)
// ^ (비트 XOR) : 두 비트가 다를 때 1을 반환함
int xor = a ^ b; // 1001 1010 -> 0011
System.out.println(xor); //출력: 10진수 3 // 0011 (2진수) = 3 (10진수)
// ~ (비트 NOT) : 비트를 1이면 0으로, 0이면 1로 반전시킴;
int not = ~a; // 000000000001001 -> 111111111110110 ?
System.out.println(not); //출력: -10
/*
* int 타입은 최상위 비트를 부호 비트로 사용하는 signed 타입이기 때문에 -10이 나온다. (예: a=10; ~a: -11, a=4; ~a: -5 이런식으로 간다.)
*unsigned char 혹은 byte 타입이라고 가정하면 32758이 나올 것 같다.
*/
// <<(left shift) : 비트를 왼쪽으로 이동시킴
a=9;
b=2;
int leftShift = a<<b; // 9*2(1) = 18 *2(2) =36
System.out.println(leftShift); //36
// >>(right shift) : 부호를 유지하면서 지정한 수 만큼 비트를 오른쪽으로 이동시킴
int rightShift = a>>b; //9/2(1) = 4 /2(2) = 2
System.out.println(rightShift); //2
a=-9;
System.out.println(rightShift); //2
// >>> : 비트를 전부 오른쪽으로 이동시키는데 >>와 달리 이동으로 빈 공간이 된 자리를 전부 0으로 채우기 때문에 음수의 경우에는 >>를 사용해야함
a=9;
System.out.println(a>>>b);
a=-9;
System.out.println(a>>>b);
instanceof 연산자
instanceof 연산자는 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 ture/ false 로 반환한다. 즉, 해당 객체가 어떤 클래스나 인터페이스로부터 생성되었는지를 사실/거짓으로 알려준다. 주로 부모 객체인지, 자식 객체인지 확인하는데 사용한다고 한다.
왼쪽 피연산자인 인스턴스가 오른쪽 피연산자인 클래스나 인터페이스로부터 생성되었으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- 인스턴스이름 instanceof 클래스또는인터페이스이름
class A {}
class B extends A{}
public class Instanceof {
public static void main(String[] args) {
A classA = new A(); //부모 클래스
B classB = new B(); //자식 클래스
System.out.println(classA instanceof A); // true
System.out.println(classB instanceof A); // true
System.out.println(classA instanceof B); // false 부모클래스가 자식클래스가 될 수 없으니까.
System.out.println(classB instanceof B); // true
}
}
람다 표현식(lambda expression)
화살표 연산자. 람다 표현식(lambda expression)이란 간단히 말해 "식별자 없이 실행가능한 함수"이다. 자바 8부터 람다식을 지원하면서 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다. 따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
표현식
(매개변수목록) -> {실행문(함수몸체)}
주의
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
- 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다.(이때 세미콜론(;)은 붙이지 않음)
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
- return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됨. (이때 세미콜론(;)은 붙이지 않음)
람다식 장점
- 간결한 코드를 작성할 수 있다.
- 식에 개발자의 의도가 명확히 드러나므로 가독성이 향상된다.
- 함수를 만드는 과정없이 한번에 처리할 수 있기에 코딩하는 시간이 줄어들 수 있다.
- 병렬프로그래밍에 용이하다.
람다식 단점
- 람다를 사용하면서 만드는 무명함수는 재사용이 불가능하다.
- 디버깅이 다소 까다롭다.
- 람다를 남발하면 코드가 지저분해질 수 있다. (비슷한 함수를 계속 중복생성할 가능성이 높음)
- 재귀로 만들경우 부적합할 수 있다.
@FunctionalInterface
interface Compare {
int num(int a, int b);
}
public class Lambda {
public static void prac(Compare com) {
int c = 10;
int d = 20;
int sum = com.num(c, d);
System.out.println(sum);
}
public static void main(String[] args) {
prac((e,f)->{
return e+f;
});
}
}
연산자 우선 순위
우선순위 | 연산자 | 설명 | 결합방향 |
1 | [] | 첨자 연산자 | 왼쪽에서 오른쪽으로 |
. | 멤버 연산자 | 왼쪽에서 오른쪽으로 | |
2 | ++ | 후위 증가 연산자 | 왼쪽에서 오른쪽으로 |
-- | 후위 감소 연산자 | 왼쪽에서 오른쪽으로 | |
3 | ! | 논리 NOT 연산자 | 오른쪽에서 왼쪽으로 |
~ | 비트 NOT 연산자 | 오른쪽에서 왼쪽으로 | |
+ | 양의 부호 (단항 연산자) | 오른쪽에서 왼쪽으로 | |
- | 음의 부호 (단항 연산자) | 오른쪽에서 왼쪽으로 | |
++ | 전위 증가 연산자 | 오른쪽에서 왼쪽으로 | |
-- | 전위 감소 연산자 | 오른쪽에서 왼쪽으로 | |
(타입) | 타입 캐스트 연산자 | 오른쪽에서 왼쪽으로 | |
4 | * | 곱셈 연산자 | 왼쪽에서 오른쪽으로 |
/ | 나눗셈 연산자 | 왼쪽에서 오른쪽으로 | |
% | 나머지 연산자 | 왼쪽에서 오른쪽으로 | |
5 | + | 덧셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽으로 |
- | 뺄셈 연산자 (이항 연산자) | 왼쪽에서 오른쪽으로 | |
6 | << | 비트 왼쪽 시프트 연산자 | 왼쪽에서 오른쪽으로 |
>> | 부호 비트를 확장하면서 비트 오른쪽 시프트 | 왼쪽에서 오른쪽으로 | |
>>> | 부호 비트까지 모두 비트 오른쪽 시프트 | 왼쪽에서 오른쪽으로 | |
7 | < | 관계 연산자(보다 작은) | 왼쪽에서 오른쪽으로 |
<= | 관계 연산자(보다 작거나 같은) | 왼쪽에서 오른쪽으로 | |
> | 관계 연산자(보다 큰) | 왼쪽에서 오른쪽으로 | |
>= | 관계 연산자(보다 크거나 같은) | 왼쪽에서 오른쪽으로 | |
instanceof | 인스턴스의 실제 타입 반환 | 왼쪽에서 오른쪽으로 | |
8 | == | 관계 연산자(와 같은) | 왼쪽에서 오른쪽으로 |
!= | 관계 연산자(와 같지 않은) | 왼쪽에서 오른쪽으로 | |
9 | & | 비트 AND 연산자 | 왼쪽에서 오른쪽으로 |
10 | ^ | 비트 XOR 연산자 | 왼쪽에서 오른쪽으로 |
11 | | | 비트 OR 연산자 | 왼쪽에서 오른쪽으로 |
12 | && | 논리 AND 연산자 | 왼쪽에서 오른쪽으로 |
13 | || | 논리 OR 연산자 | 왼쪽에서 오른쪽으로 |
14 | ? : | 삼항 조건 연산자 | 오른쪽에서 왼쪽으로 |
15 | = |
대입 연산자 및 복합 대입 연산자 (=, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=) |
오른쪽에서 왼쪽으로 |
참고
donologue.tistory.com/55?category=724213
coding-factory.tistory.com/265
'Backend > Study Halle - Java' 카테고리의 다른 글
온라인 자바 스터디 4주차 - 제어문 (0) | 2020.12.16 |
---|---|
온라인 자바 스터디 2주차 - (2) 타입의 변환, var 그리고 배열 (0) | 2020.12.05 |
온라인 자바 스터디 2주차 - (1) 자바의 변수와 데이터 타입 (0) | 2020.12.03 |
온라인 자바 스터디 1주차 - 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 (0) | 2020.11.28 |