자바의 정석 Chapter03 연산자

Eunkyung·2021년 10월 13일
0

Java

목록 보기
3/21

1. 연산자

1.1 연산자와 피연산자

연산자

연산을 수행하는 기호(+, -, *, /)

피연산자

연산자의 작업 대상(변수, 상수, 리터럴, 수식)

1.2 연산자의 종류와 우선순위

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

1.3 산술 변환

연산 수행 직전에 발생하는 피연산자의 자동 형변환

  • 두 피연산자의 타입을 같게 일치시킨다. (큰 타입으로 일치)
  • 피연산자의 타입이 int보다 작은 타입(byte, short, char)이면 int로 변환된다.

2. 단항 연산자

단항 연산자는 피연산자가 단 하나뿐인 연산자를 말하며, 부호 연산자(+, -), 증감 연산자(++,--), 논리 부정 연산자(!)가 있다.

2.1 부호 연산자

부호 연산자는 양수 및 음수를 표시하며 boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용 가능하다.
연산 수행 시 피연산자 타입 변환이 필요하다.

2.2 증감 연산자

증감 연산자는 변수의 값을 1 증가시키거나 1 감소시키는 연산자로 연산 수행 시 피연산자 타입 변환이 불필요하다.

증감 연산자
/*
증감 연산자 - 피연산자의 타입 변환 불필요
++i와 i=i+1의 연산 속도 차이 없음
 */

public class IncreaseDecreaseOperatorExample {
    public static void main(String[] args) {
        int x = 10;
        int y = 10;
        int z;

        // 증감 연산자는 피연산자의 타입 변환 불필요
        byte b = 5;
        byte bb = b++;
        System.out.println(bb);

        System.out.println("-------");

        x++; // 10 -> 11
        ++x; // 12
        System.out.println("x : " + x); // 12

        System.out.println("--------");

        y--; // 10 -> 9
        --y; // 8
        System.out.println("y : " + y); // 8

        System.out.println("--------");

        z = x++; // z = x; x = x+1;
        System.out.println("z : " + z); // 12
        System.out.println("x : " + x); // 13

        System.out.println("--------");

        z = ++x;
        System.out.println("z : " + z); // 14
        System.out.println("x : " + x); // 14
    }
}

2.3 논리 부정 연산자

논리 부정 연산자는 true를 false로, false를 true로 변경하기 때문에 boolean 타입에만 사용 가능하다.

3. 이항 연산자

3.1 산술 연산자

피연산자들의 타입이 동일하지 않을 경우 타입 일치시킨 후 연산을 수행한다.
두 피연산자가 모두 int타입인 경우, 나누기 연산 결과는 int타입이다. int타입은 소수점을 저장하지 못하므로 정수만 남고 소수점 이하는 버려진다.
올바른 연산결과를 얻기 위해서는 두 피연산자 중 어느 한 쪽을 실수형으로 형변환 해야한다.

public class ArithmeticOperatorExample {
    public static void main(String[] args) {
        int v1 = 5;
        int v2 = 2;
        int result1 = v1 + v2;
        System.out.println("result1 : " + result1);

        int result2 = v1 - v2;
        System.out.println("result2 : " + result2);

        int result3 = v1 * v2;
        System.out.println("result3 : " + result3);

        int result4 = v1 / v2;
        System.out.println("result4 : " + result4);

        // 소수점 이하의 수까지 구하기 위해서는 피연산자 중 하나는 실수 타입이어야함
        double result6 = (double) v1 / v2;
        System.out.println("result6 : " + result6); // 2.5

        // int 타입의 연산 결과는 int인데 이를 double 타입으로 저장한다고 해서 소수점 이하의 값이 출력되지 않음
        double result = v1 / v2;
        System.out.println("result : " + result); // 2.0

        int result5 = v1 % v2;
        System.out.println("result5 : " + result5);
    }
}

3.2 문자열 결합 연산자

피연산자 중 한쪽이 문자열이면 + 연산자는 다른 피연산자를 문자열로 변환하고 서로 결합한다.

String str1 = "JDK" + 6.0; // JDK6.0

4. 비교 연산자

4.1 등가비교 연산자

두 피연산자의 값이 같은지 다른지를 비교하는 연산자로 기본형과 참조형에 사용할 수 있다.
기본형의 경우 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형의 경우 객체의 주소값을 비교하여 같은 객체를 가리키고 있는지 알 수 있다.

비교 연산 수행 전 피연산자의 타입을 일치시켜 비교하는데 한 가지 예외가 있다. 바로 0.1 == 0.1f의 경우인데 비교 연산 수행 결과 false가 나온다. 0.1f가 double 타입으로 변환되어 0.1 == 0.1는 true가 나올 것 같지만 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할 수 없어 0.1의 근사값으로 표현되는데 이 값은 0.1보다 큰 값이 된다. 그 결과 false가 출력되는데 이를 해결하기 위해서는 피연산자 모두 float 타입으로 변환해서 비교하거나 정수 타입으로 변환해서 비교해야 한다.

문자열 비교

기본 타입 변수 값 비교 시 == 연산자를 사용하지만 참조 타입인 String 변수 비교 시 equals() 메서드를 사용한다.

5. 논리 연산자

&&와 &는 결과가 동일하지만 연산 과정이 다르다.
&&는 하나라도 false면 전체 연산식이 false이기 때문에 앞의 피연산자가 false면 뒤의 피연산자는 평가하지 않고 바로 false를 출력한다. 한편, &는 두 피연산자 모두 평가해서 결과를 출력하기 때문에 &보다 &&이 더 효율적이며 ||와 |도 마찬가지이다.

논리 연산자
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char ch = ' ';

        System.out.printf("문자 하나 입력하세요 : ");

        String input = sc.nextLine();
        ch = input.charAt(0);

        if ('0' <= ch && ch <= '9') {
            System.out.printf("입력하신 문자는 숫자입니다.%n");
        }
        if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
            System.out.printf("입력하신 문자는 영문자입니다.%n");
        }
    }
}

출처

  • 자바의 정석 - 남궁성 지음
  • 혼자 공부하는 자바 - 신용권 지음
profile
꾸준히 하자

0개의 댓글