스터디/whiteship - live-study

[백기선님 라이브 스터디] 3주차 - 연산자

똧이 2022. 4. 11. 02:41
반응형

목차

산술 연산자

비트 연산자

관계 연산자

논리 연산자

instanceof

assignment(=) operator

화살표(->) 연산자

3항 연산자

연산자 우선 순위

(optional) Java 13. switch 연산자

(추가) 단항 연산자

 

 

 

 

산술 연산자(+ - * / %)

사칙 연산자(+,-,*,/)와 나머지 연산자(%)

public class OperatorEx5 {
    public static void main(String[] args) {
        int a = 10;
        int b = 4;

        // + 덧셈 연산자 (정수형, 실수형 리터럴, 문자열 연산에도 사용 가능)
        System.out.printf("%d + %d = %d%n", a, b, a + b); // 10 + 4 = 14

        // - 뺄셈 연산자
        System.out.printf("%d - %d = %d%n", a, b, a - b); // 10 - 4 = 6

        // * 곱하기 연산자
        System.out.printf("%d * %d = %d%n", a, b, a * b); // 10 * 4 = 40

        // / 나누기 연산자
        System.out.printf("%d / %d = %d%n", a, b, a / b); // 10 / 4 = 2

        // / 나누기 연산자(타입이 다른 두 수)
        System.out.printf("%d / %f = %f%n", a, (float)b, a / (float)b); // 10 / 4.000000 = 2.500000

        // % 나머지 연산자
        System.out.printf("%d %% %d = %d%n", a, b, a % b); // 10 % 4 = 2

    }
}
  • 나누기 연산자: int 타입은 소숫점 아래를 저장하지 못하므로 실수형으로 변환해 연산을 수행해야 함
    • ex. 10 / 4.0f → 10.0f / 4.0f ⇒ 2.5f
    • 연산 결과 역시 float타입
  • 피연산자가 정수형인 경우 나누는 수를 0으로 사용 불가
    • 0으로 나누면 컴파일은 정상적으로 되지만 실행 시 오류(ArithmeticException) 발생
    • 실수형으로 나눌 경우 결과는 Infinity(무한대)
  • 피연산자가 유한수가 아닌 경우 연산 결과   
    x y x/y x%y
    유한수 +-0.0 +-Infinity NaN
    유한수 +-Infinity +-0.0 x
    +-0.0 +-0.0 NaN NaN
    +-Infinity 유한수 +-Infinity NaN
    +-Infinity +-Infinity NaN NaN

 

 

 

비트 연산자(& | ^ ~ << >>)

피연산자를 비트 단위로 논리 연산. 피연산자로 실수는 허용 X, 정수(문자 포함)만 허용됨

  • & (AND연산자): 피연산자 양 쪽 모두 1이어야만 1을 결과로 얻음. 그 외에는 0을 얻음
  • | (OR연산자): 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻음. 그 외에는 0을 얻음
  • ^ (XOR연산자): 피연산자의 값이 서로 다를 때만 1을 결과로 얻음. 같을 때는 0을 얻음
  • ~ (비트전환연산자): 피연산자를 2진수로 표현했을 때 0은 1, 1은 0으로 바꿈. 논리부정연산자 !와 유사 
    • 10진수 10을 비트전환 연산한 결과: -11
  • A<<B (쉬프트 연산자, left shift): A의 비트를 왼쪽으로 N만큼 이동
    • x << n은 x * $2^n$
    • 피연산자의 부호에 상관없이 각 자리를 왼쪽으로 이동시키며 빈칸을 0으로 채움
    • ex. 8 << 2 → 왼쪽 피연산자인 10진수 8의 2진수를 왼쪽으로 2자리 이동
  • A>>B (쉬프트 연산자, right shift): A의 비트를 오른쪽으로 N만큼 이동
    • x >> n은 x / $2^n$
    • 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연산자가 음수인 경우 빈자리를 1로 채움. 양수일 때는 0으로 채움
  • A>>>N (부호가 없는 시프트 연산자, unsigned right shift): A의 2진수를 우측으로 비트를 N만큼 이동
    • 부호를 신경쓰지 않고 모든 비트 값들을 오른쪽으로 이동시킨 후에 왼쪽의 빈 공간은 모두 0으로 채움

 

public class OperatorEx6 {
    public static void main(String[] args) {
        int a = 15; // 1111
        int b = 6;  // 0110
        int c = -15; // 11111111111111111111111111110001
        int n = 2;

        // & AND 연산
        System.out.println("a & b = " + (a & b)); // 6 (0110)

        // | OR 연산
        System.out.println("a | b = " + (a | b)); // 15 (1111)

        // ^ XOR 연산
        System.out.println("a ^ b = " + (a ^ b)); // 9 (1001)

        // ~ 반전 연산자
        System.out.println("~c = " + ~c); // -16

        // << 시프트 연산자 (좌측으로 비트를 이동(
        System.out.println("a << n = " + (a << n)); // 60 (111100)

        // >> 시프트 연산자 (우측으로 비트를 이동)
        System.out.println("a >> n = " + (a >> n)); // 3 (0011)

        // >>> 부호가 없는 시프트 연산자
        System.out.println("a >>> n = " + (a >>> n)); // 3 (0011)
        System.out.println("c >>> n = " + (c >>> n)); // 1073741820 (00111111111111111111111111111100)
    }
}

 

 

 

관계 연산자(< > <= >= == !=, 비교 연산자)

  • 연산 결과 타입: boolean
  • 대소비교 연산자: < > <= >=
    • 기본형 중에서 boolean형을 제외한 나머지 자료형에 사용 가능. 참조형 사용 불가
  • 등가비교 연산자: == !=
    • 기본형, 참조형 등 모든 자료형에 사용 가능

  • == : 두 값이 같으면 true, 다르면 false
  • != : 두 값이 다르면 true, 같으면 false
  • A < B : B 값이 크면 true, 아니면 false
  • A > B : A 값이 크면 true, 아니면 false
  • A <= B : B 값이 크거나 같으면 true, 아니면 false
  • A >= B : A 값이 크거나 같으면 true, 아니면 false
public class OperatorEx7 {
    public static void main(String[] args) {
        int a = 12;
        int b = 5;
        int c = 12;
        String str = "5";

        // ==
        System.out.println("a == b = " + (a == b)); // a == b = false
        System.out.println("a == c = " + (a == c)); // a == c = true
        System.out.println("'A' == 'B' = " + ('A' == 'B')); // 'A' == 'B' = false

        // !=
        System.out.println("a != b = " + (a != b)); // a != b = true
        System.out.println("a != c = " + (a != c)); // a != c = false
        System.out.println("'A' != 'B' = " + ('A' != 'B')); // 'A' != 'B' = true

        // A < B
        System.out.println("a < b = " + (a < b)); // a < b = false
        System.out.println("b < a = " + (b < a)); // b < a = true

        // A > B
        System.out.println("a > b = " + (a > b)); // a > b = true
        System.out.println("b > a = " + (b > a)); // b > a = false

        // A <= B
        System.out.println("a <= b = " + (a <= b)); // a <= b = false
        System.out.println("b <= a = " + (b <= a)); // b <= a = true
        System.out.println("a <= c = " + (a <= c)); // a <= c = true

        // A >= B
        System.out.println("a >= b = " + (a >= b)); // a >= b = true
        System.out.println("b >= a = " + (b >= a)); // b >= a = false
        System.out.println("a >= c = " + (a >= c)); // a >= c = true
    }
}

 

 

 

논리 연산자(&& || !)

  • && (AND 결합): 피연산자 양쪽 모두 true여야 true 결과를 얻음
  • || (OR 결합): 피연산자 중 어느 한 쪽만 true여도 true 결과를 얻음
  • ! (논리 부정 연산자): 피연산자가 true면 false, false면 true 반환
public class OperatorEx8 {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int c = 5;

        // &&
        System.out.println("a == b && a > 5 = " + (a == b && a > 5)); // a == b && a > 5 = true
        System.out.println("a == b && a == 5 = " + (a == b && a == 5)); // a > b && a == 5 = false

        // ||
        System.out.println("a == b || a > 5 = " + (a == b || a > 5)); // a == b || a > 5 = true
        System.out.println("a == b || a == 5 = " + (a == b || a == 5)); // a == b || a == 5 = true

        // !
        System.out.println("a == b = " + (a == b)); // a == b = true
        System.out.println("!(a == b) = " + !(a == b)); // !(a == b) = false
    }
}

 

 

 

instanceof

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용, 주로 조건문에 사용

참조변수 instanceof 타입(클래스명)
  • 결과값 boolean 반환
  • Reference Type 만 사용 가능
class Animal {}

class Dog extends Animal{}

class OperatorEx9 {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();

        System.out.println("animal instanceof Animal: " + (animal instanceof Animal)); // animal instanceof Animal: true
        System.out.println("animal instanceof Dog: " + (animal instanceof Dog)); // animal instanceof Dog: false
        System.out.println("dog instanceof Animal: " + (dog instanceof Animal)); // dog instanceof Animal: true
        System.out.println("dog instanceof Dog: " + (dog instanceof Dog)); // dog instanceof Dog: true
    }
}

 

 

 

assignment(=) operator

  • 오른쪽의 값을 왼쪽 피연산자에 할당
  • 객체 참조를 할당하기 위해 사용

 

 

화살표(->) 연산자

자바 8 이상의 람다식에서 익명함수를 만들 때 사용

(파라미터) -> { Body }
  • 함수형 프로그래밍 표현
  • 코드가 간결해 진다는 장점
  • @FunctionalInterface 어노테이션을 붙인 인터페이스의 구현체로도 사용 가능
import java.util.Arrays;

public class OperatorEx10 {
    public static void main(String[] args) {
        int[] arr = new int[5];
        Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
        // 배열을 채우는데 인터페이스를 매개변수로 받아서 지정
    }

	// (i) -> (int)(Math.random()*5)+1 부분을 직접 작성한다면
    int method(){
        return (int)(Math.random()*5)+1;
    }
}

 

 

 

3항 연산자(Ternary Operator)

  • 변수 = (조건) ? true 인 경우 : false 인 경우
public class OperatorEx11 {
    public static void main(String[] args) {
        int a = 12;
        String answer = a > 6 ? "크다" : "작다";
        System.out.println("answer = " + answer); // answer = 크다

        String answer2 = a > 18 ? "크다" : "작다";
        System.out.println("answer2 = " + answer2); // answer2 = 작다
    }
}
  • 항 연산자 사용 VS if-else 사용
    • 3항 연산자: expression
    • if-else: statement

 

 

 

연산자 우선 순위

  • →: 왼쪽에서 오른쪽으로 결합
  • ←: 오른쪽에서 왼쪽으로 결합
우선순위 연산자 내용 결합 방향
1 (), [] 괄호 / 대괄호
2 expr++, expr— 후위 증가/감소 연산자
3 ++expr, --expr, +expr , -expr, ~, ! 전위 증가/감소 연산자, 양/음 부호, 논리/비트 NOT 연산자
4 *, /, % 곱셈 / 나눗셈 /나머지 연산자
5 +, - 덧셈 / 뺄셈 연산자
6 <<, >>, >>> 비트 왼쪽/오른쪽 Shift 연산자, Unsigned Shift 연산자
7 <, <=, >, >=, instanceof 관계 연산자, instanceof
8 ==, != 와 같은/와 다른 관계 연산자
9 & 비트 AND 연산자
10 ^ 비트 XOR 연산자
11 | 비트 OR 연산자
12 && 논리 AND 연산자
13 || 논리 OR 연산자
14 () ? true : false 삼항 조건 연산자
15 =, +=, -=, /=, %=, <<=, >>=, &=, ^=, ~= 대입/할당 연산자

 

 

(optional) Java 13. switch 연산자

  • Java 12 에서는 콜론(:) 대신 화살표(->) 연산자 사용 가능
    • break을 통해 값을 반환
  • Java 13 에서는 기존에 사용하던 break이라는 키워드를 yield로 대체(확장)
  • Java 14 에서는 해당 기능을 표준으로 제공
public class OperatorEx12 {
    public static String monthCheck(int num) {
        int days = 0;
        switch (num) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 2:
                days = 28;
                break;
            default:
                days = -1;
        }
        return "입력하신 달은 " + days + "일 입니다.";
    }

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

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

    public static String monthCheck13_1(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 + "일 입니다.";
    }

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

}

 


 

 

단항 연산자

  • 증감 연산자: ++ --
    • 증가 연산자(++): 피연산자의 값을 1 증가
    • 감소 연산자(--): 피연산자의 값을 1 감소
      
    타입 설명 사용예
    전위형 값이 참조되기 전에 증가 j = ++i;
    후위형 값이 참조된 후에 증가 j = i++;
    public class OperatorEx1 {
        public static void main(String[] args) {
            int i = 5;
            i++; // i = i + 1;
            System.out.println("i = " + i); // i = 6
    
            i = 5;
            ++i;
            System.out.println("i = " + i); // i = 6
        }
    }
    
    class OperatorEx2 {
        public static void main(String[] args) {
            int i = 5, j = 0;
    
            j = i++;
            System.out.println("i++; 실행 후, i = " + i + ", j = " + j); // i++; 실행 후, i = 6, j = 5
    
            i = 5;
            j = 0;
    
            j = ++i;
            System.out.println("++i; 실행 후, i = " + i + ", j = " + j); // ++i; 실행 후, i = 6, j = 6
        }
    }
    
    class OperatorEx3 {
        public static void main(String[] args) {
            int i = 5, j = 5;
    
            System.out.println(i++); // 5
            System.out.println(++j); // 6
            System.out.println("i = " + i + ", j = " + j); // i = 6, j = 6
    
        }
    }
    

 

  • 부호 연산자: + -
    • boolean, char형을 제외한 기본형에만 사용 가능
      • : 피연산자의 부호를 반대로 변경한 결과를 반환(음수면 양수, 양수면 음수)
    class OperatorEx4{
        public static void main(String[] args) {
            int i = -10;
            i = +i;
            System.out.println(i); // -10
    
            i = -10;
            i = -i;
            System.out.println(i); // 10
        }
    }
    

 

 

 

 


출처

https://lob-dev.tistory.com/entry/Live-StudyWeek-03-연산자

https://github.com/sombrero104/java-study/blob/master/w3.md

https://www.notion.so/3-f3a94e0092664d8aa1debe7e88dec43b

https://kils-log-of-develop.tistory.com/336#산술-연산자

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001 자바의 정석 - 남궁성

 

728x90