연산자

파이 ఇ·2023년 5월 15일
2
post-thumbnail

💡 목표 : 자바가 제공하는 다양한 연산자를 학습하자.

⚡️ 목차

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

연산자 (Operator)

  • 프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operation)이라 한다.
  • 연산에 사용되는 표시나 기호를 연산자(operator)라고 한다.
  • 연산되는 데이터는 피연산자(operand)라고 한다. ex ) 산술연산 : +, -, *, /, %

산술 연산자 (arithmetic Operator)

✔️ 이항 연산자 (binary operator)
산술 연산자는 덧셈(+), 뺄셈(-), 곱셉(*), 나눗셈(/), 나머지(%)등의 연산을 할 때 사용되는 연산자로 다음과 같다.

종 류설 명보 기
+덧셈x + y
-뺄셈x - y
*곱셈x * y
/나눗셈x / y
%나머지x % y

✔️ 단항 연산자 (unary operator)
단항 연산자는 1개의 오퍼랜드를 대상으로 연산을 실행하므로 반복문 내에서 카운터로 사용된다.

종 류설 명보 기의 미
++1씩 증가x++, ++xx = x + 1
--1씩 감소x--, --xx = x - 1

후행 증감 연산자 : 변수의 값을 먼저 사용하고 난 후 그 변수의 값을 증가시키거나 감소시킨다.
선행 증감 연산자 : 변수의 값을 먼저 증가시키거나 감소시킨 후 그 변수를 사용한다.

논리 연산자 (logical Operator)

논리 연산자는 논리합(OR), 논리곱(AND), 논리부정(NOT) 등의 연산을 할 때 사용된다.

종 류설 명
AND논리식이 모두 참이면 참을 반환함x && y
OR논리식 중에서 하나라도 참이면 참을 반환함x
XOR논리식이 서로 다르면 참을 반환함!x
&&논리식이 모두 참이면 참을 반환함 (AND)x && y
||논리식 중에서 하나라도 참이면 참을 반환함 (OR)x || y
!논리식의 결과가 참이면 거짓을, 거짓이면 참을 반환함 (NOT)x / y

✔️ 진리표

ABA and B ( A && B)A or B ( A || B)A xor B!A
truetruetruetruefalsefalse
truefalsefalsetruetruefalse
falsetruefalsetruetruetrue
falsefalsefalsefalsefalsetrue

비트 연산자 (bit Operator)

비트 연산자는 논리 연산자와 비슷하지만, 비트(bit)단위로 논리 연산을 수행한다.
또한 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다.

비트 연산자설 명
&대응되는 비트가 모두 1이면 1을 반환함 (비트 AND 연산)
|대응되는 비트 중 하나라도 1이면 1을 반환함 (비트 OR 연산)
^대응되는 비트가 서로 다르면 1을 반환함 (비트 XOR 연산)
~비트를 1이면 0으로, 0이면 1로 반전 시킴 (비트 NOT 연산)
x << y정수 x의 각 비트를 y만큼 왼쪽으로 이동 시킨다. (빈자리는 0으로 채워짐)
x >> y정수 x의 각 비트를 y만큼 오른쪽으로 이동 시킨다. (빈자리는 최상위 부호비트와 같은 값으로 채워짐 )
x <<< y정수 x의 각 비트를 y만큼 오른쪽으로 이동 시킨다. (빈자리는 0으로 채워짐)

관계 연산자 (relational Operator)

두 식의 대소 크기를 비교하는 연산자로, 연산 결과가 참(true)이나 거짓(false)값인 boolean자료형으로 표현한다.

instanceOf 연산자

객체가 어떤 클래스인지, 어떤 클래스를 상속 받았는지 확인하는데 사용하는 연산자. boolean자료형으로 표현한다.

Syntax
object instanceOf type

object가 type이거나 type를 상속받는 클래스라면 true, 아니면 false를 리턴한다.

💡 instanceOf의 사용을 지양하자 불필요한 외부의 객체가 정보를 알게된다 -> 캡슐화가 깨짐

대입 연산자

변수에 값을 대입할 때 사용하는 이항 연산자이며 오른쪽에 있는 값이나, 수식을 계산하여 왼쪽 변수에 넣어주는 연산자.

변수 = 상수; -> 초기화의 의미
변수 = 변수; -> 치환의 의미
변수 = 수식; -> 연산의 의미
대입 연산자설 명
=왼쪽의 피연산자에 오른쪽의 피연산자를 대입함
+=왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후 그 결과값을 대입함
-=왼쪽의 피연산자에 오른쪽의 피연산자를 뺀 후 그 결과값을 대입함
*=왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후 그 결과값을 대입함
/=왼쪽의 피연산자에 오른쪽의 피연산자를 나눈 후 그 결과값을 대입함
%=왼쪽의 피연산자에 오른쪽의 피연산자를 나눈 후 그 나머지를 결과값에 대입함

화살표(->) 연산자

람다 표현식(lamda expression)이라고도 한다. 람다 표현식이란 간단히 말해 메서드를 하나의 식으로 표현한 것이다.

# 메서드
int min (int x, int y) {
	return x < y ? x : y;
}

# 람다식
(x, y) -> x < y ? x : y;

메서드를 람다식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메서드를 사용할 수 있다. 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.

익명 클래스

일반적인 인스턴스 생성법(new)와 다르게 중괄호가 마지막에 붙어있는 구조.
익명 즉, 이름이 없는 클래스다. 이름이 없다는게 무슨소리일까 ? 예를 들어보자


public class Car {
	void category() {
    	System.out.println("나는 car");
	}
}

public class Kia extends Car {
	@Override
    void category() {
    	System.out.println("나는 kia");
	}
}

위 예는 익명 클래스가 아닌 일반적인 클래스다. 이런 보통의 경우, 우리는 부모 클래스를 상속 받아 처리하려면 부모클래스(Car)를 상속받는 클래스(Kia)를 별도로 만들어 처리한다.

⚡️
Override ?
: 부모 클래스로 부터 상속받은 메서드의 내용을 재정의 하는것
Overloading ?
: 같은 이름의 메서드의 매개변수의 타입, 개수를 다르게 한것.
➡️ 같은 이름이라면 어떻게 사용해야할까 ? 매개변수의 타입과 개수에 일치하는 메서드를 실행시킨다.

그런데 만약 Car를 상속받아 처리해야하는 클래스가 또 필요한 경우 매번 kia, hyundai 등의 클래스를 만드는것은 낭비. 상속받은 클래스가 재사용되면 모를까 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다. 이럴 경우 익명 클래스를 사용한다 !


public static void main(String[]args) {
	Car car = new Car() {
    	String type = "hyundai";
        @Override
        void category() {
        	System.out.println("나는 " + type);
        }
     };
     car.category();
}        

인스턴스 생성시, 일반적인 경우와 다르게 중괄호가 더해져 그 안에 처리 구문이 들어갔다.
따로 상속받은 자식 클래스를 생성하지 않고, 인스턴스 생성 부분에서(new) 중괄호 내에 자식 클래스의 내용을 선언하는것.

삼항 연산자

Syntax
조건식 ? 반환값1 : 반환값 2

물음표 앞의 식이 참이면 반환값1을, 거짓이면 반환값2를 반환한다. 반환값에는 값뿐만 아니라 수식, 함수 호출등 여러가지 형태의 명령문이 올 수 있다.

연산자 우선순위


1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가진다.
2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가진다.
3. 단항, 부호, 대입 연산자를 제외한 모든 방향은 왼쪽에서 오른쪽이다.
4. 복잡한 연산식에는 괄호 ()를 사용해서 우선순위를 정한다.

switch 연산자

Java12 부터 람다 연산을 사용할 수 있어, 기존의 switch/case문을 좀 더 간결하게 사용할 수 있다 !


String str = "A";

switch (str) {
	case"A" -> System.out.println("1");
    case"B" -> System.out.println("2");
    case"C", "D" -> System.out.println("3");
    default -> System.out.println("그 외의 숫자");
}

람다식으로 사용 가능 하다. (기존 switch문에서 콜론(:)을 화살표 (->)로 변경하여 사용할 수 있지만, 혼용하여 사용 불가) multi case Label이다! 원래 조건을 저렇게 "C", "D" 2개를 해줄 수 없는데 12 이후로 여러개의 조건을 가질 수 있다. 식(expression)으로 사용될 수 있어서 바로 변수로 할당할 수 있다. break로 반환하는 문법이 Java12에 있었으나 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("1");
        yield 3;
    default : 
    	System.out.println("그 외의 숫자");
        yield 100;
    };
    System.out.println(result);
}

[ 참 조 ]
http://www.tcpschool.com/c/c_operator_arithmetic
https://doozi0316.tistory.com/entry/3주차-연산자
https://hongong.hanbit.co.kr/자바-기초-연산자-연산의-방향과-우선순위/

profile
⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆

0개의 댓글