본문 바로가기
JAVA/이것이 자바다

[Chapter 03] 연산자

by Dream Jin 2022. 12. 3.

Chapter03 연산자

3.1 부호/증감 연산자

부호 연산자

연산식(피연산자) 설명
+ 피연산자의 부호 유지
- 피연산자의 부호 변경

→ +연산자는 잘 사용되지않고, -연산자의 경우 변수값의 부호를 변경할때 사용한다.

//부호 변경 방법
byte b =100;
byte result = -b; //컴파일 에러 -> 정수타입의 연산 결과는 int이다 (부호를 바꾸는것도 연산이다)

byte b =100;
int result = -b;

증감 연산자

→ 1증가, 1감소

++(피연산자) 피연산자의 값을 1증가시킴
—(피연산자) 피연산자의 값을 1감소시킴
(피연산자) ++ 다른연산을 수행한 뒤 피연산자의 값을 1증가
(피연산자)— 다른연산을 수행한 뒤 피연산자의 값을 1감소

 

3.2 산술 연산자

→ 산술 연산자는 (+,-,*,/,%)

(특징)

  1. 피연산자가 정수타입(byte, short, char, int)이면 연산의 결과는 int타입이다.
  2. 피연산자가 정수타입이고, 그 중 하나가 long 타입이면 연산의 결과는 long타입이다.
  3. 피연산자 중 하나가 실수 타입이면 연산의 결과는 실수 타입이다.

 

3.3 오버플로우, 언더플로우

오버플로우: 허용하는 최대값을 벗어나는것.

byte value = 127;
value++; //value +1
System.out.println(value); //범위를 벗어나므로 128이 아닌 -128이 나온다

언더플로우: 허용하는 최소값을 버서나는것

byte value = -128;
value--;
System.out.println(value); //127

 

3.4 정확한 계산은 정수 연산으로

→ 정확한 계산은 실수타입 보단 정수타입으로

public class Accuracyexample {

    public static void main(String[] args) {
        int apple =1 ; //사과 1조각을
        double pieceUnit = 0.1; //총 10조각으로 쪼갠다
        int number = 7;

        double result1 = apple - number*pieceUnit;
        System.out.println("사과 1개에서 남은 양: "+result1);
        //0.2999999999999999

        //정수형 연산을 하면
        int totalPieces = apple*10; //10 조각
        int result2 = totalPieces - number;
        System.out.println("사과 10조각에서 남은 양: " + result2);
        // 3
        System.out.println("사과 1개에서 남은 양: " + result2/10.0);
        // 0.3
    }

}

 

3.5 나눗셈 연산 후 NaN과 Infinity 처리

NaN: Not a number 숫자가 아니다

Infinity: 무한대

5 / 0.0 의 경우 Infinity
5 % 0.0 의 경우 NaN이다.

여기서 중요한건 Infinity + 2 는 계속 Infinity
Nan + 2 는 계속 NaN
따라서

boolean result = Double.isInfinite(변수);
boolean result = Double.isNaN(변수); 로 확인하기
int x =5;
double y = 0.0;
double z = x/y; -> 잘못된 코드

if(Double.isinfinite(z) || Double.isNaN(z)){
    System.out.println("값 산출 불가");
} else{
    System.out.println(z+2);
}

//예외처리 

3.6 비교 연산자

동등비교 (==, ! =) 피연산자가 숫자 and 불리언값

크기 비교( >, > =, <, < =)

중요한건

0.1f == 0.1 false

0.1f == (float) 0.1 true

이렇게 타입을 맞추고 비교

 

문자열을 비교할때에는 equals()와 !equals()를 사용한다.

boolean result = str1.equals(str2) //str1 과  str2가 같은지

 

3.7 논리 연산자

논리곱 (AND) && , &

(한개와 두개의 차이, 두개일때는 앞에꺼만 보고 뒤에꺼 볼지 정하지만, 한개라면 앞에 뒤에 모두 확인하므로 연산속도가 훨씬 느림)

 

논리합(OR) ||

베타적 논리합(XOR) ^ → 두 논리결과가 동일하면 false 서로 다르면 true

논리부정 (NOT) !

 

3.8 비트 논리 연산자

→ Web에는 거의 사용하지않고, HW 제어시 사용한다.

구분 결과
AND(논리곱) 두 비트 모두가 1일 경우에만 1
OR(논리합) 두 비트중 하나만 1이면 1
XOR(배타적 논리합) 두 비트가 같으면 0 다르면 1
NOT(논리 부정) 보수

→ 2진수 로바꿔서 비트 논리연산을 수행하고 값을 구하게 된다.

byte num1 = 45;
byte num2 = 25;
byte result = num1 & num2 //컴파일 에러
int result = num1 & num2

비트 논리 연산이 필요한 이유

→ C Program에서 Java Program으로 데이터를 줄때

C: Uint8_t 타입의 136을 2진수로 보내면 Java에서는 -120으로 읽게 된다 제일앞에 1을 부호로 읽기 때문 따라서 C에서 보낸 숫자를 복원 하기 위해선, 255비트를 논리곱 연산을 한다.

byte receiveData = -120;
int UnsignedInt = receiveData & 255; //136이 된다
//JAVA에서는 코드 제공
int unsignetInt = Byte.toUnsignedInt(receiveData)

 

3.9 비트 이동 연산자

→ Web에는 거의 사용하지않고, HW 제어시 사용한다.

a << b 정수 a의 각 비트를 b만큼 왼쪽으로 이동 오른쪽 빈자리는 0 으로
a >> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 왼쪽 빈 자리는 최 상위 부호 비트와 같은 값으로
a >>> b 정수 a의 각 비트를 b만큼 오른쪽으로 이동 왼쪽 빈 자리는 최 상위 부호 비트는 0으로

(참고만)

3.10 대입 연산자

= 대입연산자

(x)= 복합 대입 연산자

+= 더한 다음 저장하라

-= 뺀 다음 저장하라~~

수행한 다음 값을 변수에 저장하라.

3.11 삼항 조건 연산자

피연산자가 3개가 있다.

조건식 ? 값 또는 연산식 1: 값 또는 연산식2

조건식이 True 이면 연산식 1 수행, False 이면 연산식 2 수행

 

3.12 연산의 방향과 우선순위

증감, 부호, 비트, 논리 대입만 연산 방향이 ← 이쪽이다.

이런게 있다.. 하면서 익히기

'JAVA > 이것이 자바다' 카테고리의 다른 글

[Chapter 06] 클래스  (0) 2022.12.31
[Chapter 05] 참조 타입  (0) 2022.12.31
[Chapter 04] 조건문과 반복문  (0) 2022.12.03
[Chapter 02] 변수와 타입  (0) 2022.12.03
[Chapter01] 자바 시작하기  (0) 2022.11.29

댓글