본문 바로가기

Backend/Study Halle - Java

온라인 자바 스터디 3주차 - 연산자

산술연산자

사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자.

산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.

 

  • + : 더하기
  • - : 빼기
  • * : 곱하기
  • / : 정수에서는 몫, 실수에서는 나누기
  • % : 정수에서는 나머지
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);

 

 

12. 비트단위시프트연산자 <<, >>

정수 1개를 입력받아 2배 곱해 출력해보자. 참고 *2 의 값을 출력해도 되지만, 정수를 2배로 곱하거나 나누어 계산해 주는 비트단위시프트연산자 <<, >>를 이용한다. 2진수 형태로 저장되어 있는 값

yunieom.tistory.com

 

 

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

www.tcpschool.com/java/intro

m.blog.naver.com/PostView.nhn?blogId=yuyyulee&logNo=221089960198&proxyReferer=https:%2F%2Fwww.google.com%2F

edu.goorm.io/learn/lecture/201/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-c%EC%96%B8%EC%96%B4-%EA%B8%B0%EC%B4%88/lesson/397667/%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90

improver.tistory.com/140

coding-factory.tistory.com/265