1. 연산자와 피연산자
연산자는 ‘연산을 수행하는 기호’를 말한다. 예를 들어 ‘+’기호는 덧셈 연산을 수행하며 ‘덧셈 연산자’라고 부른다.
자바에는 사칙연산(+,-,/,*)를 비롯해서 더 다양한 연산자를 제공한다. 연산자가 연산을 수행하기 위해서는 반드시 연산의 대상이 있어야 하는데 이 대상이 ‘피연산자’이다.
4*x+3 이라는 식이 있을 때 4,x,3이 피연산자 *와+가 연산자이다.
2. 연산자의 종류
연산자의 개수는 많지만 연산사의 기능이 비슷한 것들끼리 묶어놓고 보면 종류는 몇 종류 안된다.

피연산자의 개수로 연산자를 분류하기도 하는데 이 경우 피연산자의 개수가 하나면 ‘단항 연산자’, 두개면 ‘이항연산자’, 세개면 ‘삼항 연산자’ 라고 부른다.
예시) – 3 – 5 라는 식이 있을 때 첫번째 ‘-‘ 는 부호연산자이고 두번째 ‘-‘는 산술연산자이다. 연산자의 모양이 같음에도 피연산자의 갯수에 따라 구분할 수 있다.
첫번째 -(부호연산자)의 피연산자는 3이고 두번째 -(산술연산자)의 피연산자는 -3과 5 이다.
이렇게 연산자를 기능,비연산자의 갯수별로 나누어 분류하는 이유는 ‘연산자의 우선순위’ 때문이다. 각 종류별로 우선순위를 외우면 편해진다.
3. 연산자의 우선순위

초등수학에서 배운 내용처럼 곱셈과 나눗셈이 덧셈 뺄셈보다 우선순위가 높다.
연산 방향에 대한 설명은 바로 아래에 있다.
4. 연산자의 결합규칙

첫번째 식은 연산자 결합규칙이 왼쪽에서 오른쪽인 경우, 두번째 식은 연산자 결합규칙이 오른쪽에서 왼쪽인 경우이다.
첫번째 식은 3+4를 먼저 한후 3+4의 연산결과인 7-5를 연산하면 된다.
두번째 식은 오른쪽부터 y=3먼저 연산되어 변수 y에 3이 저장되고 그 다음에 x=3이 저장된다.
두번째 식이 조금 어색할 수 있을 것 같다. 수학에서 수의 같음을 나타내는 등호 ‘=’ 자바에서 변수에 값을 대입하기위한 대입연산자’=’의 모양이 같기 때문인데 잘 적응 하시길 바란다..
5. 증감연산자 ++과–
증가 연산자(++)와 감소 연산자(–)를 합쳐서 ‘증감 연산자’라고 부른다.
증감연산자는 피연산자의 왼쪽, 오른쪽 전부 붙을수 있고 왼쪽에 위치하면 전위형, 오른쪽에 위치하면 후위형이라고 한다.
전위(++i)로 쓰나 후위(i++)로 쓰나 독립적으로 사용하면 i의 값을 1 증가시키며 이 경우 결과의 차이는 없다.
차이가 나는 상황을 보이자면

전위의 경우 먼저 i의 값을 먼저 증가시키고 나서 i의 값을 참조하지만 후위의 경우 i의 값을 참조하고 연산을 하고 나서야 i의 값을 증가 시킨다.
이해가 잘 되지 않더라고 반복문을 배울 때 한번 더 알아볼 기회가 있기에 어렵다면 반복문과 함께 이해해도 좋다.
6. 부호연산자
부호연산자 연산자에 대해 설명할 때 나왔는데 부호연산자’-‘를 붙이면 피연산자의 부호를 반대로 변경한 결과를 반환한다.
피연산자가 음수면 양수로 양수면 음수가 연산의 결과로 나오게 할 수 있다. 부호 연산자’+’는 존재는 하지만 당연하게도 쓸 일이 거의 없다.
7. 형변환(casting) 연산자
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.
형변환 방법은 아주 간단하다. 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호에 넣어 붙여주면 된다.
(타입)피연산자 이런식으로 해주면 된다.

전 단원에서 String 형변환은 빈 문자열을 붙이는 방법으로 했는데 왜 그럴까? 그건 String은 기본 데이터 타입이 아니기 때문이다.
즉 기본 데이터 타입은 꼭 외우고 기본타입을 형변환 할 때 (타입)피연산자 이런식으로 형변환 하면 된다.
==============이 부분은 이해 못하고 넘어가도됨==================
String도 필자가 느끼기에 기본타입 못지 않게 많이 사용하는 것 같은데 필자는 빈 문자열을 넣기 보단 String.valueOf() 메서드나 객체의 toString() 메서드를 사용한다. 가독성이 더 좋다고 생각하기 때문이다.
기본 타입만 (타입)피연산자 이런식으로 형변환 하면 된다며… 사살 아니었다. 객체타입도 (타입)피연산자로 형변환이 가능하다.
class Parent {}
class Child extends Parent {}
public class Main {
public static void main(String[] args) {
Parent parent = new Child(); // 업캐스팅 (자동 형변환)
Child child = (Child) parent; // 다운캐스팅 (명시적 형변환)
}
}
상속관계에 있는 클래스간의 업캐스팅, 다운캐스팅이다.
그냥 나중에는 기본형 말고도 (타입)피연산자로 형변환을 하는 경우가 있구나 하고 넘어가길 바란다.
==========================================================
8. 자동 형변환(묵시적 형변환)
서로 다른 타입간의 대입이나 연산을 할 때, 먼저 형변환하여 타입을 일치시키는 것이 원칙이다. 하지만 편의상의 이유료 생략할 수 있다. 그렇다고 해서 형변환을 안한건 아니고 컴파일러가 생략된 형변환을 자동으로 추가해주게 된다.
float f = 1234; // float f =(float)1234; 에서 (float)가 생략됨.
9. 사칙 연산자
앞서 말한대로 곱셈(*)과 나눗셈(/)그리고 나머지(%) 연산이 덧셈(+) 뺄셈(-)보다 먼저 우선순위가 높다.
그리고 피연산자가 정수형인 경우 나누는 수로 0을 사용할 수 없다. 사용할 경우 에러가 발생한다.
10. 산술 변환
이항 연산자는 두 피연산자의 타입이 일치해야 연산이 가능하다. 피연산자의 타입이 다르다면 연산전에 형변환 연산자로 타입을 일치시켜야 한다. 이처럼 연산 전에 피연산자 타입의 일치를 위해 자동 형변환 되는 것을 ‘산술 변환’ 이라고 하며 이항연산에서만 아니라 단항 연산에서도 일어난다. 변환 규칙은 아래와 같다.
①두 피연산자의 타입을 같게 일치시킨다.(더 큰 타입으로 일치)
예시) long + int → long + long → long, float + int → float + float → float 등등
② 피연산자의 타입이 int보다 작은 타입이면 int로 변환한다.
예시) byte + short → int + int → int, char + short → int + int → int
산술 변환이란 그저 연산 직전에 발생하는 자동 형 변환일 뿐이니 너무 어렵게 생각하지 말자.
11. Math.round()로 반올림하기
반올림을 하려면 Math.round()를 사용하면 된다. 이메서도는 소수점 첫째 자리에서 반올림한 결과를 정수로 반환한다.
long result = Math.round(4.52); // result에 반올림된 정수 5가 저장된다.
12. 나머지 연산자
나머지 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 나누고 난 나머지 값을 결과로 반환한다.(초등학생 시절 나머지가 있는 나눗셈 할 때 그 나머지다.) 나눗셈과 마찬가지로 나누는 수로 0을 사용할 수 없고 피연산자로 정수와 실수 허용한다.
주로 홀수와 짝수, 배수검사등에 사용한다.
예) 10 % 8 //2
13. 비교 연산자
비교 연산자는 두 연산자를 비교하는데 사용되는 연산자다. 주로 조건문과 반복문의 조건식에 사용되며 연산 결과는 오직 true와 false이다.

1==1 // true
1 < 2 //true
14. 문자열의 비교
두 문자열을 비교할 때는 비교연산자 ‘==’가 아닌 equals()라는 메서드를 사용해야 한다. 비교연산자는 두 문자열이 완전히 같은 것인지 비교할 뿐이다.
만약 대소문자를 구변하지 않고 비교하고싶으면, equals() 대신 equalsIgnoreCase()를 사용하면 된다.
15. 논리 연산자 && ||
|| (OR결합) : 피연산자중 어느 한 쪽이 true이면 true를 결과로 얻는다.
&&(AND결합): 피연산자 양쪽 모두 true여야 ture를 결과로 얻는다.

1==1 || 2==3 //true 이런식으로 논리 연산을 할수있다. 비교 연산의 결과가 true와 false중 하나이기 때문에 논리연산이 가능하다.
그리고 책엔 나와있지 않지만 || 비교연산을 할 때 왼쪽 피연산자가 true인 경우 오른쪽 피연산자가 true인지 flase인지 확인하지 않는다 즉 오른쪽 연산을 아예 무시한다.
16. 논리 부정 연산자 !
위쪽 사진으로 되어있는 표에 이미 적혀있는데 true는 false로 false는 true로 바꿔준다.
! 를 not 이라고 생각하면 맞는 것 같다.
어떤 값에 !를 반복적으로 적용하면 on off가 있는 토글 버튼 처럼 true와 false를 반복하게 된다.
17. 조건 연산자
조건 연산자는 조건식, 식1, 식2 모두 세개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건연산자 하나뿐이다.

아까 논리연산자 || 의 왼쪽 피연산자가 true 이면 오른쪽 연산자가 연산되지 않음을 조건연산자 설명하는 조건연산자로 설명해드리겠습니다.
package ch01;
//import java.util.Scanner; //사용 안해서 주석
public class Hello {
public static void main(String[] args) {
boolean result = true || expensiveOperation(); // 삼항 연산자가 아닌 논리 연산자 사용
System.out.println(result ? "result 왼쪽 피연산자가 true 일때는 단축 평가로 인해 expensiveOperation은 호출되지 않습니다." : "볼 일 없는 메시지");
}
public static boolean expensiveOperation() {
System.out.println("왼쪽 피연산자가 false인가보네요");
return true;
}
}
저는 들여쓰기를 했는데 꼭 안한것 처럼 보이네요.
삼항 연산자에 대해서 먼저 설명드리자면 조건식 result가 true인지 확인하고 true이면 “result 왼쪽 피연산자가 true 일때는 단축 평가로 인해 expensiveOperation은 호출되지 않습니다.”가 출력되고 false 이면 “볼 일 없는 메시지”가 출력됩니다.
하지만 “볼 일 없는 메시지”는 볼일 없으십니다. expensiveOperation()가 true를 반환하고 있기 때문입니다.
boolean result = true || expensiveOperation();를 연산하면 왼쪽 피연산자가 true이기 때문에 expensiveOperation()가 참인지 아닌지 확인하지 않게 되고 “왼쪽 피연산자가 false인가보네요” 는 출력되지 않습니다.
그러나 boolean result = true || expensiveOperation();의 true를 false로 수정하면 || 연산자가 오른쪽 피연산자가 참인지 까지 확인하게 되고 이로 인해 “왼쪽 피연산자가 false인가보네요”는 출력됩니다.
18. 대입 연산자
대입연산자는 연산 진행방향이 오른쪽에서 왼쪽입니다
이미 배웠죠? 대입연산자에서 왼쪽 연산자를 lvalue라고 부르고 오른쪽 연산자를 rvalue라고 부릅니다(저도 오늘 처음알았습니다.)
19. 복합대입 연산자

종류가 많은데 규칙은 똑같습니다 =왼쪽에 있는 연산을 양쪽 피연사들로 먼저 하고 나서 대입연산을 합니다
표의 왼쪽과 오른쪽 비교하면서 봐보세요. 복합대입 연산자도 증감연산자처럼 반복문과 함께 복습하면 더 이해하기 좋은 듯 합니다.