본문 바로가기
진행중인 학습/자바의 정석_학습

자바의 정석_기초편 CHAPTER 3 中 [9 ~ 14] (230731)

by 트레비봄 2023. 7. 31.
728x90
자바의 정석_기초편 CHAPTER 3 中 [9 ~ 14] (230731)

3-9. 사칙 연산자.

덧셈 ( + ) , 뺄셈 ( - ) , 곱셈 ( * ) , 나눗셈 ( / ) : 사칙 연산자

알고 있듯이 곱셈, 나눗셈, 나머지 연산자 ( % ) 가 덧셈, 뺄셈 연산자보다 우선순위가 높으므로 먼저 처리한다.

그리고 피연산자가 정수형인 경우, 나누는 수는 0을 사용 불가.

만일 0으로 나눈다면 에러가 발생.

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

        System.out.printf("%d + %d = %d%n", a, b, a + b);
        System.out.printf("%d - %d = %d%n", a, b, a - b);
        System.out.printf("%d * %d = %d%n", a, b, a * b);
        System.out.printf("%d / %d = %d%n", a, b, a / b);
        System.out.printf("%d / %f = %f%n", a, (float)b, a / (float)b);
    }
}

결과 >> 14 // 6 // 40 // 2 // 2.500000

여기서 10을 4로 나눈 값이 2.5 가 아닌 2라는 점을 중요하게 봐야함.

나누기 연산자의 두 피연산자가 모두 int 타입인 경우, 연산결과 역시 int타입.

그래서 실 연산 값이 2.5 일지라도 int 타입 값인 2가 결과로 나옴.

소수점을 저장하지 못하므로 정수만 출력되기 때문. (단, 반올림은 발생하지 않음.)

 

올바른 값을 내기위해선 가장 아래 식처럼 해야한다. 형변환을 해야함.

3-10. 산술변환

산술변환 : 연산 전에 피연산자 타입의 일치를 위해 자동 형변환되는 것.

이항 연산뿐만 아니라 단항 연산에서도 일어난다.

1. 두 피연산자의 타입을 길게 일치 시킴(보다 큰 타입으로 일치)

long + int -> long + long -> long

float + int -> float + float -> float

double + float -> double + double -> double

 

2. 피연산자의 타입이 int보다 작은 타입이면 int 로 변환된다.

byte + short -> int + int -> int

char + short -> int + int -> int

 

첫 번째 규칙은 앞서 자동 형변환에서 배운 것처럼 피연산자의 값손실을 최소화하기 위한 것.

두 번째 규칙은 int 보다 작은 타입, 예로 char 나 short 의 표현범위가 좁아서 연산 중 오버플로우가 발생할 가능성이 높기 때문에 있는 것.

즉, 산술 변환이란 그저 연산 직전에 발생하는 자동 형변환일 뿐.

 

3-11. Math.round() 로 반올림 하기.

반올림 하기엔 Math.round() 를 사용하면 된다.

소수점 첫째 자리에서 반올림한 결과를 정수로 반환한다.

long result = Math.round(4.52);
// result에 5가 저장된다.

3-12. 나머지 연산자.

나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환한다.

나눗셈에서처럼 나누는 수(우측 피연산자) 로 0을 사용할 수 없고, 피연산자로 정수와 실수를 허용한다.

나머지 연산자는 주로 짝수, 홀수 또는 배수 검사 등에 주로 사용된다.

 

아래의 예제를 보면서 이해하자. 

나눗셈 연산자와 나머지 연산자를 이용하는 예제.

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

        System.out.printf("%d을 %d로 나누면, %n", x, y);
        System.out.printf("몫은 %d이고, 나머지는 %d 입니다.%n", x / y, x % y);
    }
}

결과

public class Main {
    public static void main(String[] args) {
        System.out.println(-10%8);
        System.out.println(10%-8);
        System.out.println(-10%-8);
    }
}

결과

나머지 연산자 (%)나누는 수로 음수도 허용.

단, 부호는 무시되므로 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.

고로 피연산자의 부호를 모두 무시하고, 나머지 연산을 한 결과에 왼쪽 피연산자(나눠지는 수)의 부호를 붙이면 된다.

3-13. 비교 연산자

비교 연산자는 두 피연산자를 비교에 사용된다.

주로 조건문, 반복문의 조건식에 사용, 연산결과는 true 와 false 둘 중 하나가 나온다.

 

대소비교 연산자. (참이면 true, 거짓이면 false)

비교연산자 연산결과
> 좌변 값이 크면, true 아니면 false
< 좌변 값이 작으면, true 아니면 false
>= 좌변 값이 크거나 같으면, true 아니면 false
<= 좌변 값이 작거나 같으면, true 아니면 false

등가비교 연산자 

비교연산자 연산결과
== 두 값이 같으면, true 아니면 false
!= 두 값이 다르면, true 아니면 false

-> 두 피연산자의 값이 같은지 또는 다른지를 비교하는 연산자.

모든 자료형 (기본형, 참조형) 에 사용가능.

3-14. 문자열의 비교.

두 문자열을 비교할 때는, 비교 연산자 '==' 대신 equals() 라는 메소드를 사용해야 한다.

비교 연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐, 내용의 같은지 비교하기 위해선 equals() 를 사용해야한다.

역시 같으면 true, 다르면 false 이다.

String str = new String("abc");

boolean result = str.equals("abc"); // 내용이 같으니 true 가 저장된다.

String 은 클래스 이므로, new 를 사용해서 새로운 객체를 생성해야한다.

String str = new String("abc");
// String 클래스의 객체를 생성.

String str = "abc";
// 위 문장을 간단히 표현한 것.

만일 대소문자를 구별하지 않고 비교하고자하면 equals() 대신 equalsIgnoreCase() 를 사용하면 된다.

 

230731 학습

728x90