ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 3. 연산자 ② 이항 연산자, 삼항 연산자
    Programming/Java 2022. 7. 27. 09:00
    반응형

    연산자 이전글: https://erinh.tistory.com/entry/Java-5-연산자단항-연산자

     

    3-4. 이항 연산자

    : 피연산자가 두 개인 연산자

    3-4-1. 산술 연산자 ( +, -, * , /, % )

    연산식 설명
    피연산자 + 피연산자 덧셈 연산
    피연산자 - 피연산자 뺄셈 연산
    피연산자 * 피연산자 곱셈 연산
    피연산자 / 피연산자 좌측 피연산자를 우측 피연산자로 나눗셈 연산
    피연산자 % 피연산자 좌측 피연산자를 우측 피연산자로 나눈 나머지를 구하는 연산
    🎉 산술연산자는 피연산자들의 타입이 동일하지 않을 경우, 아래 규칙에 따라 피연산자의 타입을 일치 시킨 후 연산 수행
    ⓵ 피연산자들이 모두 정수 타입이고, int 타입보다 크기가 작을 경우 모두 int 타입으로 변환 후 int 타입으로 산출
        ex) byte + byte -> int + int = int
    ⓶ 피연산자들이 모두 정수 타입이고, long 타입이 있을 경우 모두 long 타입으로 변환 후 long 타입으로 산출
        ex) int + long -> long + long = long
    ⓷ 피연산자 중 실수 타입(float, double)이 있을 경우, 크기가 큰 실수 타입으로 변환 후 연산 및 해당 실수 타입으로 산출
        ex) int + double -> double + double = double
    [ ❗️Syntax Alert] 산술연산자 규칙에 따른 산출 타입을 지켜주지 않으면 컴파일 에러 발생
    - char 타입을 연산할 경우에도 int 값으로 반환하기 때문에 주의! 
    byte b1 = 1;
    byte b2 = 2;
    byte sumByte = b1 + b2;   // int로 변환되어 산술되고 int값으로 산출되기 때문에 컴파일 에러 발생
    // int, double 연산 
    int int1 = 10;
    int int2 = 4;
    int result1 = int1 / int2;			// 2 출력
    double result2 = int1 / int2;			// 2.0 출력(연산 후에 2를 실수화하기 때문에)
    double result3 = (double)int1 / int2;		// 2.5 출력(피연산자 중 하나라도 double이어야 함)
    
    // char 연산
    char c1 = 'A';
    char c2 = 'B';
    int i1 = 2;
    System.out.println(c1 + c2);			// 아스키코드값 65 + 66 = 131 출력 
    System.out.println(c1 + i1);			// 아스키코드값 65 + 2 = 67 출력
    char c3 = (char)(c1 + i1);
    System.out.println(c3);				// C 출력, 타입 변환을 통해 char형 반환 가능

    [ 오버플로우 ]

    - 데이터타입을 초과하는 값이 입력될 경우, 데이터 손실이 발생한다.
    - 이후, 이런 것을 방지하기 위해 try catch 구문을 통해 오버플로우를 탐지하여 예외처리 할 수 있다.

    public class OverflowExample {
    	public staic void main(String[] args) {
        	int x = 1_000_000;
            int y = 1_000_000;
            int z = x * y;       // long으로 받아야 함. int로 받을 경우 값 손실 발생
            System.out.println(z);
        }
    }

    [ 부동소수점 ]

    - 정확한 계산을 할 때는 int 타입을 활용하여 계산하는 것이 좋다.

    - double 형태를 사용할 경우 부동소수점에 의해 계산에 있어 오차가 발생한다.

    (부동소수점이 발생하는 이유: 컴퓨터는 2진수로만 값을 표현하기 때문에 변환 과정에서 오차가 발생)

    // double 사용시
    int i1 = 1;
    double d1 = 0.1;
    int i2 = 7;
    
    double result = i1 - (d1 * i2);   // 0.29999999999999993 출력

    [ NaN과 Infinity 연산 ]

    - / 또는 % 연산자 사용시 좌측 피연산자가 정수 타입일 경우 우측 피연산자는 0을 사용할 수 없다.

    5 / 0    // ArithmeticException 예외 발생
    5 % 0    // ArithmeticException 예외 발생

    - 실수 타입인 0.0 또는 0.0f로 나눌 경우 예외가 아닌 Infinity 또는 NaN 이 출력된다.

    5 / 0.0    // Infinity, 실수 값을 0으로 나누면 무한히 나누어질 수 있기 때문에 Infinity 출력
    5 % 0.0    // NaN, 존재하지 않고, 숫자가 아니기 때문에 NaN(Not a Number) 출력
    
    // 프로그램에서 연산의 결과가 Infinity or NaN인지 확인하는 법
    // Double.isInfinite(변수) , Double.isNaN(변수)
    // 이를 활용해 이후 Double 타입의 인풋을 받을 경우, 입력 값에 오류가 없는지 점검할 수 있다.
    int x = 5;
    double y = 0.0;
    double z1 = x / y;
    double z2 = x % y;
    
    if(Double.isInfinite(z1) || Double.isNaN(z2)) {
    	System.out.println("값 산출 불가");
    } else {
    	System.out.println(z1 + z2);
    }

    3-4-2. 문자열 연결 연산자 ( + )

    : 문자열을 서로 결합하는 연산자

    [ ❗️Syntax Alert] 문자열과 숫자가 혼합된 + 연산식은 피연산자의 위치에 따라 값이 달라질 수 있음.
    "Java" + "3.0";		// Java3.0 출력
    "Java" + 1 + 2.0;	// Java12.0 출력
    1 + 2.0 + "Java";	// 3.0Java 출력

    3-4-3. 비교 연산자 ( <, <=, >, >=, ==, != )

    : 대소 또는 동등 관계를 비교하여 boolean 타입인 true/false를 산출

    구분 연산식
    설명
    동등비교 피연산자1 == 피연산자2 두 피연산자의 값이 같은지 검사
    피연산자1 != 피연산자2 두 피연산자의 값이 다른지 검사
    크기 비교 피연산자1 > 피연산자2 피연산자1이 큰지를 검사
    피연산자1 >= 피연산자2 피연산자1이 크거나 같은지를 검사
    피연산자1 < 피연산자2 피연산자1이 작은지를 검사
    피연산자1 <= 피연산자2 피연산자1이 작거나 같은지를 검사

    - 비교연산자도 연산을 수행하기 위해 피연산자의 타입을 일치시키기 위한 타입 변환이 자동으로 일어난다.

    'A' == 65;	// true, char타입을 int타입으로 변환
    3 == 3.0;	// true, int타입을 double타입으로 변환
    
    
    // 예외! 
    // 0.1f는 이진 포맷의 가수를 사용하는 부동소수점 타입으로 0.1의 근사값으로 표현되어 0.1보다 큰 값이 됨 
    0.1 == 0.1f;	// false
    
    // 이를 계산하기 위해서는, double 타입을 강제로 타입 변환을 하여 연산하거나 int로 변환하여 비교해야 함
    (float)0.1 == 0.1f;			// true
    (int)(0.1*10) == (int)(0.1f*10);	// true

    - String 타입 동등비교시에는 equals() 메소드를 사용하는 것이 좋다.

    - 동등비교부호로 비교시에는 같은 값이나 false 값이 출력될 수도 있다.

    String str1 = "테스트";
    String str2 = "테스트";
    String str3 = new String("테스트");
    
    str1 == str2;		// true	(동일 참조값이므로 true)
    str1 == str3;		// false
    // new로 생성한 새로운 String 객체의 경우 다른 참조값을 생성하기 때문에 str1, str2와는 다른 참조값임
    
    // 따라서, string의 문자열만 비교하고 싶다면 equals() 메소드를 사용해야 한다.
    str1.equals(str2);	// true
    str1.equals(str3);	// true

    3-4-4. 논리 연산자 ( &&, ||, &, |, ^, !)

    - 논리 연산자의 피연산자는 boolean 타입만 사용 가능

    구분 연산식
    결과 설명
    AND
    (논리곱)
    true &&
    또는
    &
    true true 피연산자가 모두 true일 경우에만
    연산 결과가 true
    * &&는 앞의 값만 보고 결론이 나면 다음 피연산자는 계산하지 않음
    * &은 두 피연산자를 모두 평가하여 결과 산출
    true false false
    false true false
    false false false
    OR
    (논리합)
    true ||
    또는
    |
    true true 피연산자 중 하나만 true이면
    연산 결과는 true
    * ||, |도 &&, &와 같음
    true false true
    false true true
    false false false
    XOR
    (배타적
    논리합)
    true ^ true false 피연산자가 하나는 true, 다른 하나가 false일 경우에만
    연산 결과는 true
    true false true
    false true true
    false false fakse
    NOT
    (논리부정)
      ! true false 피연산자의 논리값을 바꿈
    false true

    3-4-5. 비트 연산자 ( &, |, ^, ~, <<, >>, >>>)

    - 비트 연산자는 데이터를 비트 단위로 연산한다. 즉, 0과 1이 피연산자가 된다.

    - 따라서 정수 타입만 비트 연산을 할 수 있으며, double, float 타입은 연산이 불가하다.

    [ 비트 논리 연산자 ( &, |, ^, ~) ]

    구분 연산식
    결과 설명
    AND
    (논리곱)
    1 & 1 1 두 비트 모두 1일 경우에만 연산 결과가 1
    1 0 0
    0 1 0
    0 0 0
    OR
    (논리합)
    1 | 1 1 두 비트 중 하나만 1이면 연산 결과는 1
    1 0 1
    0 1 1
    0 0 0
    XOR
    (배타적
    논리합)
    1 ^ 1 0 두 비트 중 하나는 1이고 다른 하나가 0인 경우
    연산 결과 1
    1 0 1
    0 1 1
    0 0 0
    NOT
    (논리부정)
      ~ 1 0 보수
    0 1
    [ ❗️Syntax Alert] 비트연산자는 피연산자를 int 타입으로 자동 타입 변환후 연산 수행하므로, 결과는 int 타입으로 반환된다.

    ⓵ & (AND) 연산

    ⓶ | (OR) 연산

    ⓷ ^ (XOR) 연산

    ⓸ ~ (보수)

    [ 비트 이동 연산자 ( <<, >>, <<< ) ]

    구분 연산식
    설명
    이동
    (Shift)
    a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동
    (빈자리는 0으로 채워진다.)
    a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
    (빈자리는 정수 a의 최상위 부호 비트와 같은 값으로 채워진다.)
    a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동
    (빈자리는 0으로 채워진다.)

    result = 16
    result = -1
    result = 536870911

    3-4-6. 대입 연산자 ( =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= )

    : 대입 연산자는 오른쪽 피연산자의 값을 좌측 피연산자인 변수에 저장

    구분 연산식
    설명
    단순 대입 연산자 변수 = 피연산자 우측의 피연산자의 값을 변수에 저장
    복합 대입 연산자 변수 += 피연산자 변수 = 변수 + 피연산자
    변수 -= 피연산자 변수 = 변수 - 피연산자
    변수 *= 피연산자 변수 = 변수 * 피연산자
    변수 /= 피연산자 변수 = 변수 / 피연산자
    변수 %= 피연산자 변수 = 변수 % 피연산자
    변수 &= 피연산자 변수 = 변수 & 피연산자
    변수 |= 피연산자 변수 = 변수 | 피연산자
    변수 ^= 피연산자 변수 = 변수 ^ 피연산자
    변수 <<= 피연산자 변수 = 변수 << 피연산자
    변수 >>= 피연산자 변수 = 변수 >> 피연산자
    변수 >>>= 피연산자 변수 = 변수 >>> 피연산자
    [ ❗️Syntax Alert] 대입연산자는 모든 연산자들 중에서 가장 낮은 연산 순위로, 제일 마지막에 수행

    - 대입연산자는 연산의 진행 방향이 오른쪽에서 왼쪽으로, a = b = c = 5; 는 다음 순서로 진행.

    3-5. 삼항 연산자

    - 세 개의 피연산자를 필요로 하는 연산자

    - ? 앞의 조건식에 따라 콜론(:) 앞 뒤의 피연산자가 선택된다고 해서 조건연산식이라고도 불림

    - if 문으로 변경 사용 가능하나, 한 줄에 간단하게 작성할 때 사용하면 유용

    // 문법
    // 조건식 ? true일때실행할코드 : false일때실행할코드
    
    int score = 95;
    char grade = (score > 90) ? 'A' : 'B';
    반응형

    댓글

Designed by Tistory.