Recent Posts
Recent Comments
Link
06-30 12:53
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

자바 연산자 본문

DEV&OPS/Java

자바 연산자

ALEPH.GEM 2022. 3. 24. 13:26

단항 연산자

1. 부호 연산자: +, -

int i = -100;

2. 증감 연산자: ++, --

int x = 1;
int y = 1;
int result1 = ++x + 10;	//먼저 x를 1증가 후 연산
int result2 = y++ + 10;	//연산 후 y를 1 증가

3. 논리(boolean) 부정 연산자: !

boolean isComplete = false;
System.out.println(isComplete);
System.out.println(!isComplete);

4. 비트 반전 연산자: ~

  • 비트 반전 연산자는 정수 타입에만 사용됩니다.
  • 비트 반전을 하고 나면 데이터 타입이 int 타입이 됩니다.
  • 최상위 비트는 부호비트이므로, 비트 반전시 최상위 비트 포함해서 반전이 되므로 부호가 반전이 됩니다.
byte v1 = 10;
int v2 = ~v1 + 1 	
//v1을 비트 반전하면 -11이 되고 1을 더하므로 v2는 -10이 됩니다.

 

이항 연산자

1. 산술 연산자: +, -, *, /, %

  • int + long을 더하면 결과값은 long 입니다. 즉, 더 큰 자료형으로 자동 형 변환 합니다.
  • byte 타입도 일종의 정수형 데이터라서 연산하고 나면 int형으로 변환이 됩니다.
  • /는 나눗셈이지만 정수형끼리 연산하면 몫을 나타내고 %연산자로 나머지를 구합니다.

※ 산술 연산 후 데이터 타입이 표현할 수 있는 값의 범위를 넘어선경우 오버플로우가 발생합니다. ArithmeticException이 발생하기 때문에 예외 처리를 해야 합니다.

※ 근사값이 아닌 정확한 값을 구하는 계산인 경우 부동소수점 연산을 하면 안되고 정수로 변환하여 연산해야 합니다.

int apple = 1;
int total = apple*10;
int number = 7;
int temp = total - number;
double result = temp / 10.0;
//부동소수점(float, double)은 소수점을 지표와 가수표현으로 연산하기 때문에 근사값입니다. 
//그래서 소수자리가 정확히 떨어지지 않아서 정수로 변환 후 연산을 해야 합니다.
//1 - 0.7 = 0.3 이 나와야 하지만
//부동소수점에서는 0.2999999999... 처럼 근사값으로 나오게 됩니다.

※ NaN(Not a Number): 0.0 으로 나누면 몫은 Infinity가 되고 나머지는 NaN이 됩니다.

 

2. 문자열 연결 연산자: +

String str1 = "JDK" + 1.8;
//문자와 숫자를 연결하면 문자열이 됩니다.

 

3. 비교 연산자: <, <=, >, >=, ==, !=

char char1 = 'A';
char char2 = 'B';
if(char1 < char2){
    System.out.println("A<B");
}
//char 또한 ascii코드지만 내부적으로 정수 형태로 저장되기 때문에 대소 비교가 가능합니다.

String의 경우 기본데이터 타입처럼 사용하면 상수 영역에 저장되어 값이 같다면 같은 메모리 주소를 참조하기 때문에 비교연산자 == 으로 비교하면 true를 리턴합니다.

하지만 String을 클래스 취급해서 인스턴스로 문자열을 생성한다면 인스턴스는 힙영역에 저장되기 때문에 문자열 값이 같다고 하더라도 메모리 영역이 다른 곳에 저장되어 있어서 비교연산자 == 으로 비교시 false를 리턴합니다.

String클래스에서는 문자열의 비교를 위해 equals()메서드를 사용하는데 equals()메서드를 사용하면 값 자체만으로 비교를 하게 됩니다.  

String str1 = "JAVA";
String str2 = "JAVA";
String str3 = new String("JAVA");
System.out.println(str1 == str2);	//true
System.out.println(str1 == str3);	//false
System.out.println(str1.equals(str2));		//true;
System.out.println(str1.equals(str3));		//true;

 

4. 논리 연산자

  • && 논리곱
  • || 논리합
  • ! 부정
  • & 비트논리곱
  • | 비트논리합
  • ^ 배타적 논리합(비트 포함)
  • ~ 비트 부정. 즉, 보수

 

5. 시프트 연산자: <<, >>, >>>

<<: 좌측 비트 이동, 빈자리는 0으로 채움

>>: 우측 비트 이동, 빈자리는 부호비트(최상위 비트값)으로 채움

>>>: 우측 비트 이동, 빈자리는 0으로 채움

 

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

int result = 0;
result += 10;
System.out.println(result);	//10
result -= 5;
System.out.println(result);	//5
result *= 3; // result = result * 3;

 

삼항 연산자 

조건식 ? 조건식이 true일때 실행  : 조건식이 false일때 실행 

int score = 85;
char grade = score > 90 ? 'A' : 'B';

 

 

연산자 우선순위

1. 단항>이항>삼항 연산자

2. 산술>비교>논리>대입(할당) 연산자

3. 왼쪽>오른쪽

4. 소괄호로 묶으면 가장 우선순위가 높아짐

 

정수 실수 연산

정수와 정수간 산술 연산의 리턴 값은 정수 타입으로 리턴합니다.

즉 나눗셈의 경우도 실수 값이 아니라 몫(정수 값)이 리턴됩니다.

나머지의 경우 나머지 연산자 % 를 사용해야합니다.

 

실수와 정수간 산술 연산의 리턴 값은 실수 타입으로 리턴합니다.

 

따라서 강제로 데이터 타입을 변환해야 하는 경우 캐스팅을 해줘야 합니다.

int total = 1+2+3+4+5;
float avg = (float)total/5;
//아래와 같이 total/5의 값을 형변환 하는 경우 소수점 이하 값들은 무시됩니다.
float avg2 = (float)(total/5);

 

 

 

 

 

 

 

 

 

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

자바 클래스와 메서드  (0) 2022.03.28
조건문과 제어문  (0) 2022.03.25
자바 자료형과 변수  (0) 2022.03.22
JDK  (0) 2022.03.22
드디어 이클립스 JSP 한글 깨짐 해결!  (0) 2022.02.22