1. 연산자
연산자 : 연산을 수행하는 기호
피연산자 : 연산자의 연산 수행 대상
"모든 연산자는 연산결과를 반환한다."
4 * x + 3
→ 4 * 5 + 3
→ 23
y = 4 * x + 3; // x의 값이 5라면, y의 값은 23이 된다.
System.out.println(y); // y의 값인 23이 화면에 출력된다.
System.out.println(4 * x + 3); // x의 값이 5라고 가정하면
→ System.out.println(23);
2. 연산자의 종류

3. 연산자의 우선순위
"하나의 식(expression)에 연산자가 둘 이상 있을 때, 어떤 연산을 먼저 수행할지를 자동 결정하는 것"


4. 연산자의 결합규칙
"우선순위가 같은 연산자가 있을 때, 어떤 것을 먼저?"
"대입과 단항 연산자를 제외하면, 모두 왼쪽 → 오른쪽"
연산자의 우선순위와 결합법칙은 "세 가지만 기억하자"
1. 산술 > 비교 > 논리 > 대입. 대입은 제일 마지막에 수행된다.
2. 단항(1) > 이항(2) > 삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
3. 단항 연산자와 대입연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.
5. 증감 연산자
증감 연산자(++) 피연산자의 값을 1 증가시킨다.
"증감 연산자가 독립적으로 사용된 경우, 전위형과 후위형의 차이가 없다."



감소 연산자(--) 피연산자의 값을 1 감소시킨다.
6. 부호 연산자
'-'는 피연산자의 부호를 반대로 변경
'+'는 아무런 일도 하지 않는다. (실제 사용X)

7. 형변환 연산자
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
(타입)피연산자
double d = 85.4;
int score = (int)d;
→ int score = (int)85.4;
→ int score = 85;


8. 자동 형변환
float f = 1234; // int타입의 값을 float타입의 변수에 저장
float f = (float)1234;
int i = 3.14f; // 에러
int i = (int)3.14f; // OK.

형변환을 하는 이유는 주로 서로 다른 두 타입을 일치시키기 위해서인데, 형변환을 생략하면 컴파일러가 알아서 자동적으로 형변환을 한다.
"기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환된다."
그래서 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다.

byte b = 100; // OK, byte 타입의 범위(-128 ~ 127)의 값의 대입
byte b = (byte)100; // OK, byte타입으로 형변환하여 대입
int i = 100;
byte b = i; // 에러, int타입을 byte의 타입에 대입
byte b = (byte)i; // OK, byte 타입으로 형변환하여 대입
byte b = 1000; // 에러, byte 타입의 범위(-128 ~ 127)를 벗어난 값의 대입
byte b = (byte)1000; // OK, 그러나 값 손실이 발생해서 변수 b에는 -24가 저장됨.
9. 사칙 연산자 + - * /

10. 산술 변환
"연산 전에 피연산자의 타입을 일치시키는 것"
① 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
long + int → long + long → long
float + int → float + float → float
double + float → double + double → double
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.
byte + short → int + int → int
char + short → int + int → int
"연산 전에 피연산자의 타입을 일치시키는 것"
① 두 피연산자의 타입을 같게 일치시킨다.(보다 큰 타입으로 일치)
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다.


11. 반올림 - Math.round()
실수를 소수점 첫 째자리에서 반올림한 정수를 반환
long result = Math.round(4.52); // result에 5가 저장된다.
double pi = 3.141592; // 3.141로 바꾸려면?

12. 나머지 연산자 %
오른쪽 피연산자로 나누고 남은 나머지를 반환
나누는 피연산자는 0이 아닌 정수만 허용(부호는 무시됨)

System.out.println(10 % 8); // 10을 8로 나눈 나머지 2가 출력된다.
System.out.println(10 % 8); // 위와 같은 결과를 얻는다.
13. 비교 연산자 > < >= <= == !=
두 피연산자를 비교해서 true(참) 또는 false(거짓)을 반환


14. 문자열의 비교
문자열 비교에는 == 대신 equals()를 사용해야 한다.
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
15. 논리 연산자 && ||
조건식을 연결할 때 사용하는 연산자
|| (OR결합) 피연산자 중 어느 한 쪽이 true이면 true를 결과로 얻는다.
&& (AND결합) 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.






16. 논리 부정 연산자 !
true를 false로, false는 true로 바꾼다.

boolean b = true;
!! b → !!true → ! false → true

17. 조건 연산자 ? :
조건식의 결과에 따라 연산결과를 달리한다.

result = (x > y) ? x : y ; // 괄호 생략 가능

result = (x > y) ? x : y ;
→ result = (5 > 3) ? 5 : 3 ;
→ result = (true) ? 5 : 3 ;
→ result = 5;

18. 대입 연산자
오른쪽 피연산자를 왼쪽 피연산자에 저장 후 저장된 값을 반환
System.out.println(x = 3); 변수 x에 3이 저장되고
→ System.out.println(3); 연산결과인 3이 출력된다.

lvalue - 대입 연산자의 왼쪽 피연산자
rvalue - 대입 연산자의 오른쪽 피연산자

int i = 0;
3 = i + 3; // 에러, lvalue가 값을 저장할 수 있는 공간이 아니다.
i + 3 = i; // 에러, lvalue의 연산결과가 리터럴(i+3 → 0+3 → 3)
final int MAX = 3; // 변수 앞에 키워드 final을 붙이면 상수가 된다.
MAX = 10; // 에러, 상수(MAX)에 새로운 값을 저장할 수 없다.
19. 복합 대입 연산자
대입 연산자와 다른 연산자를 하나로 축약

'java' 카테고리의 다른 글
자바강의 3일차 (1) | 2023.12.27 |
---|---|
자바강의 2일차 (1) | 2023.12.27 |
자바강의 1일차 (0) | 2023.12.24 |
자바의 정석 ch4 (1) | 2023.12.24 |
자바의 정석 ch2 (0) | 2023.12.21 |