본문 바로가기

java

3주차 과제 연산자

목표

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

학습할 것

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

산술 연산자

수학적 계산 ( 사칙 연산 ) 에 사용되는 연산자이다.

 

연산자

기능 설명 에러
 +  이항 더하기 연산자 하나의 숫자를 다른 숫자에 더한다. null
단항 플러스 연산자 숫자 프로모션을 트리거하는 것과 별개로 기능을 수행 null
문자열 연결을 수행 두개의 문자열을 조인하여 세번째 문자열을 제공 null
 -  이항 더하기 연산자 다른 숫자에서 하나의 숫자를 뺀다. null
단항 플러스 연산자 ( -1 ) 피 연산자를 0에서 뺀 것과 같다. null
 *  이항 연산자 한 숫자에 다른 숫자를 곱한다. null
 /  이항 연산자 한 숫자를 다른 숫자로 나눈다.

Java 정수부는 0을 반올림.Java 부동 소수점 분할의 기본 아이디어는 결과 q  d . q = n 를 만족시키는 데 가장 가까운 값입니다. d* q = n .

부동 소수점 나누기의 결과는 IEEE 754 산술 규칙에 따라 결정됩니다.

분모가 0이면  ArithmeticException
 %  이항 연산자 한 숫자를 다른 숫자로 나눌 때 나머지를 계산합니다.

Java 프로그래밍 언어에서는 부동 소수점 피연산자도 허용합니다.
부동 소수점 나머지는 b 가 0 일 때와 같이 경계 케이스에서 INF  NaN 값을 생성 할 수 있습니다. 
정수 나머지 연산자의 제수 값이 0이면 an ArithmeticException
 INF "무한" 또는 INF 값은 너무 큰 숫자를 나타낸다.
- INF 값은 너무 크고 음수인 숫자를 나타낸다.
INF 값은 오버 플로를 일으키는 부동 연산 또는 0 으로 나누는 부동 소수점 연산에 의해 생성된다.
 NAN "무기한"/ "숫자가 아님"또는 NaN은 의미없는 작업으로 인해 발생하는 값을 나타냅니다.
NaN 값은 0을 0으로 나누거나 0을 나머지로 계산하여 생성됩니다

비트 연산자와 논리 연산자

보수 ( ~ ) 연산자는 하나의 피연산자 비트를 비트 또는, 논리 반전하는 단항 연산자이다.

AND ( & ) 연산자는 두 개의 피연산자의 비트 또는 논리 "and" 를 수행하는 이항 연산자이다.

( 둘다 1이면 1 둘 중 하나가 0이면 0 )

OR ( | ) 연산자는 두 개의 피연산자의 비트 또는 논리 "포함 또는" 을 수행하는 2진 연산자이다.

( 둘 중 하나만 1 이면 1 )

XOR ( ^ ) 연산자는 두 개의 피연산자의 비트 또는 논리 "배타적 논리합" 을 수행하는 이항 연산자이다.

( 둘 중 하나는 1이고 다른 하나가 0 일 경우만 1 )

 

관계 연산자 (<, <=,>,> =)

<, <= 및 >= 연산자는 숫자 유형 비교를 위한 이항 연산자이다.

이러한 연산자의 결과 유형은 모든 경우에 boolean 값이다.

관계 연산자를 사용하여 숫자를 다른 유형과 비교할 수 있다.

int i = 1;
long l = 2;
if (i < l) {
    System.out.println("i is smaller");
}

 이러한 연산자를 사용하여 문자열, 숫자 배열 등을 비교할 수 없습니다 .

 

  1. 피연산자 중 하나가 박스형이면 unbox입니다.
  2. 현재 피연산자 중 하나가 byte , short 또는 char 이면 int 로 승격됩니다.
  3. 피연산자의 유형이 동일하지 않으면 "더 작은"유형의 피연산자가 "더 큰"유형으로 승격됩니다.
  4. 결과는 int , long , float 또는 double 값에 대해 비교가 수행됩니다.

instanceof

객체가 특정 클래스 / 인터페이스 유형인지 여부를 확인합니다. instanceof 연산자는 다음과 같이 작성됩니다.
객체 타입을 확인하는데 사용하는 연산자. 해당 여부를  true, false 로 알려준다. 부모 객체의 인스턴스인지

자식 객체인지 를 알려줄 때 사용합니다.

 

객체 instanceof 클래스
( Object reference variable ) instanceof  (class/interface type)

class A {}

class B extends A {}

public static void main(String[] args) {

    A a = new A();
    B b = new B();
    
    System.out.println(a instanceof A); // true
    System.out.println(b instanceof A); // true
    System.out.println(a instanceof B); // false
    System.out.println(b instanceof B); // true

}

 

assignment(=) operator :: 할당 연산자

 

값을 변수에 할당할 때 쓰는 연산자입니다

주소 할당과 값 할당을 다르게 생각해야합니다.

 

깊은 복사와 얕은 복사?

 

 - 얕은 복사 : 주소를 이어준다. B를 수정하는 것은 A를 수정하는 것과 같다.

 - 깊은 복사 : 값을 복사해서 제대로 복사한다.

ex ) 원본배열.clone(), Arrays.copyOf(원본배열, 내가 원하는 length까지)

System.copyOfRange(원본배열, 원하는 시작점, 원하는 끝점), System.arrayCopy()

(지정된 배열을 대상 배열의 지정된 위치에 복사해줍니다.) 

 

  • 2차원 배열의 경우 1차원 배열과 같은 방식을 취하면, a[x][y]는 얕은 복사가 된다. 무조건 반복문을 돌려서 일일이 복사해줘야합니다.

화살표 연산자

Java 8 이후부터 람다 연산자 ( -> )는 람다 식을 도입하는 데 사용되는 연산자다.

다음 예에서 볼 수 있듯이 두 가지 공통적인 구문이 있다. 

람다 표현식은 익명 함수, 또는 함수 인터페이스를 구현하는 익명 클래스의 인스턴스를 보다 정확하게 정의한다.

 

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

 

Lambda 표현식은 표현식을 사용하는 단일 메서드 인터페이스를 구현하는 명확하고 간결한 방법을 제공합니다.

 

// lambda 안씀
JButton btn = new JButton("My Button");
btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button was pressed");
    }
});

인터페이스 ActionListener는 하나의 메서드 만 정의 actionPerformed()하므로 기능적 인터페이스이므로 Lambda 식을 사용하여 표준 코드를 대체 할 수 있습니다. 위의 예는 다음과 같이 Lambda 표현식을 사용하여 다시 작성할 수 있습니다.

 

// 람다씀
JButton btn = new JButton("My Button");
btn.addActionListener(e -> {
    System.out.println("Button was pressed");
});

삼항연산자

int num1 = 5, num2 = 7;
int result;
result = (num1 - num2 > 0) ? num1 : num2;
System.out.println("두 정수 중 더 큰 수는 " + result + "입니다.");
//두 정수 중 더 큰 수는 7입니다.

연산자 우선 순위

 

java13 switch 연산자

입력값이 정형화되어 있고, 조건이 많은 경우 if문보다는 switch/case문을 쓰는것이 가독성에서 좀 더 유리하다.

 

switch(입력변수) {
    case 입력값1: ...
         break;
    case 입력값2: ...
         break;
    ...
    default: ... // 그 외
         break;
}