solgitae 2022. 6. 25. 22:00
728x90

목표

자바가 제공하는 다양한 연산자를 학습하세요.

학습할 것

  • 산술 연산자
  • 비트 연산자
  • 관계 연산자
  • 논리 연산자
  • instanceof
  • assignment(=) operator
  • 화살표(->) 연산자
  • 3항 연산자
  • 연산자 우선 순위
  • (optional) Java 13. switch 연산자

1.산술 연산자

산술 연산자에는 사칙 연산자(+, -, *, /)와 나머지 연산자(%)가 있다.
# 산술 연산자

1. 사칙 연산자 + - * /

	-> 곱셈, 나눗셈, 나머지 연산자가 덧셈, 뺄셈 연산자보다 우선순위가 높으므로 먼저 처리된다.
		 그리고 피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다.(에러 발생)

	-> 나누기 연산자의 두 피연산자가 모두 int 타입인 경우, 연산 결과 역시 int 타입이다.
		 그래서 실제 연산 결과는 2.5일지라도 int타입의 값인 2를 결과로 얻는다.
		 int 타입은 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려지기 때문이다.
		 이 때, 반올림이 발생하지 않는다는 것에 주의하자.
		 올바른 연산결과를 얻기 위해서 어느 한 쪽을 실수형으로 형변환을 해야한다.

	-> 크기가 작은 자료형의 변수를 큰 자료형의 변수에 저장할 때는 자동으로 형변환되지만, 반대로 큰 자료형의 값을
		 작은 자료형의 변수에 저장하려면 명시적으로 형변환 연산자를 사용해서 변환해주어야 한다.
		 사칙연산의 피연산자로 숫자뿐만 아니라 문자도 가능하다. 문자는 실제로 해당 문자의 유니코드로 바뀌어 저장되므로
		 문자간의 사칙연산은 정수간의 연산과 동일하다.

2. 나머지 연산자

	-> 나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환하는 연산자이다. 그리고 나눗셈에서처럼 나누는 수로 0을 사용할 수 없다는 점에 주의하자.
		 나머지 연산자는 나누는 수로 음수도 허용한다. 그러나 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.

	

2.비트 연산자

비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의 각 자리를 아래의 규칙에 따라 표와 같이 연산을 수행하며, 피연산자로 실수는 허용하지 않는다. 정수(문자 포함)만 허용된다.
# 비트 연산자

**1. |(OR연산자)**

	-> 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
	
**2. &(AND연산자)**

	-> 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.

**3. ^(XOR연산자)**

	-> 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

**4. 비트 전환 연산자 ~**
	
	-> 이 연산자는 피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다.
		 논리 부정 연산자 !와 유사하다.

5. 쉬프트 연산자 << >>

	-> 이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽(>>)' 또는 '왼쪽(<<)'으로
		 이동(shift)한다고 해서 '쉬프트 연산자'라고 이름이 붙여졌다.

 

3.관계 연산자

비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true와 false 둘 중의 하나이다. 비교 연산자 역시 이항 연산자이므로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교한다는 점에 주의하자.
# 관계 연산자

**1. 대소 비교 연산자 < > <= >=**
	
	 -> 두 피연산자의 값의 크기를 비교하는 연산자이다. 참이면 true, 거짓이면 false를 결과로 반환한다.
			boolean형을 제외한 나머지 자료형에 다 사용할 수 있지만 참조형에는 사용할 수 없다.
	
2. 등가비교 연산자 == !=

	 -> 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자이다. 기본형과 참조형은 서로 형변환이 가능하지
      않기 때문에 등가비교 연산자로 기본형과 참조형을 비교할 수 없다.

* 두 값이 같다는 의미로 '='가 아닌 '=='를 사용하는데, '='는 이미 배운 것과 같이 변수에 값을 저장할 때 사용하는 
  '대입 연산자'이기 때문에 '=='로 두 값이 같은지 비교하는 연산자를 표현한다.

* 두 문자열을 비교할 때는, 비교 연산자 '=='대신 equals()라는 메서드를 사용해야 한다. 비교 연산자는 두 문자열이 완전히 같은 것인지
  비교할 뿐이므로, 문자열의 내용이 같은지 비교하기 위해서는 equals()를 사용하는 것이다. equals()는 비교하는 두 문자열이 같으면
  true, 다르면 false를 반환한다.

4.논리 연산자

두 개의 조건이 결합된 경우를 표현할 때 사용하는 연산자이다. 논리 연산자는 둘 이상의 조건을 ‘AND’ 또는 ‘OR’로 연결하여 하나의 식으로 표현할 수 있게 해준다.
# 기본형

**1. 논리 연산자 && ||**

		->논리 연산자 '&&'는 우리말로 '그리고(AND)'에 해당하며, 두 피연산자가 모두 true일 때만
		  true를 결과로 얻는다. '||'는 '또는(OR)'에 해당하며, 두 피연산자 중 어느 한 쪽만 true이어도 true를
		  결과로 얻는다. 그리고 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다.

**2. 논리 부정 연산자 !**

		->이 연산자는 피연산자가 true이면 false를, false이면 true를 결과로 반환한다.

5.instanceof

instanceof 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용하는 연산자이다.연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용하는 연산자이다. 주로 조건문에 사용하며 연산의 결과로 true나 false를 반환한다.
# instance of
* 어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다.

6.assignment(=) operator

변수에 값을 할당할 때 사용하였던 '=' 기호가 할당 연산자( 대입 연산자) 이다.
# assignment operator

・ ‘=’는 같다라는 의미가 아니라, 변수에 값을 저장하는 연산자이다. 
・ '=' 왼쪽은 반드시 값을 저장할 수 있는 변수이어야하고, 오른쪽은 값을 표현하는 숫자나 변수, 혹은 수식이어야 한다.여러 개의 변수에 동일한 값을 저장하는 것이 가능하다.
・ 여러 변수에 한꺼번에 여러 값을 할당 할 수 있다. (동시 할당문 simultaneous assignment)

7.화살표(->) 연산자

Java 8 이후부터 람다 연산자 ( -> )는 람다식을 도입하는 데 사용되는 연산자입니다. 다음 예에서 볼 수 있듯이 두 가지 공통적 인 구문이 있습니다. 람다 표현식은 익명 함수, 또는 함수 인터페이스 를 구현하는 익명 클래스의 인스턴스를보다 정확하게 정의합니다.
# 화살표 연산자

  a -> a + 1              // a lambda that adds one to its argument
  a -> { return a + 1; }  // an equivalent lambda using a block.

8.삼항 연산자

삼항 연산자는 자바에서 유일하게 피연산자를 세 개나 가지는 조건 연산자입니다. 삼항 연산자의 문법은 다음과 같습니다. 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, 결괏값이 거짓(false)이면 반환값2를 반환합니다.
# 3항 연산자
  int a = 5, b = 7;
  int result;
  result = (a - b > 0) ? a : b;
  System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");
  //두 정수 중 더 큰 수는 7입니다.

9.연산자 우선 순위

연산자에도 우선 순위가 있다. 

 

10.(optional) Java 13. switch 연산자

Java 13에서 switch는 기존에 사용하던 break(값을 반환)라는 키워드를 yield로 대체(확장) 하게 되었다.
# Java 13 switch 연산자

public static String monthCheck(int num){
	int days = switch (num) { 
		case 1, 3, 5, 7, 8, 10, 12 : 
			yield 31; 
		case 4, 6, 9, 11 : 
			yield 30; 
		case 2 : 
			yield 28; 
		default: yield -1; 
 }; 
return "입력하신 달은 "+days+"일 입니다."; 
}