w1d5 - ch3
연산자와 피연산자
연산자
연산을 수행하는 기호(+ , - , / , * )등
피연산자
연산자 작업 대상 (변수, 상수, 리터럴, 수식)
연산자 종류
- 산술 변환자
- 연산자 : + , - , * , / , % , << , >>
- 사칙 연산과 나머지 연산(%) - 비교 연산자
- 연산자 : > , < , >= , <= , == , !=
- 크고 작음과 같음을 비교 - 논리 연산자
- 연산자 : && , || , ! , & , | , ^ , ~
- '그리고'와 '또는' 으로 조건을 연결 - 대입 연산자
- 연산자 : =
- 우변 값을 좌변에 저장 - 기타
- 연산자 : (type) , ?: , instanceof
- 형변환 연산자 , 삼항 연산자, instanceof 연산자
대입(연산자) / 대입문 ? - > 2가지 역할 (문장역할 ?)
연산자 우선순위
수학과 동일
연산자 결합규칙
- 보통 왼 -> 오 방향
- 단항이나 대입일 경우 오-> 왼
산술변환
1. 두 피연산자의 타입을 같게 일치 (큰 타입으로 일치해서 연산)
2. 피연산자의 타입이 int보다 작으면 int로 변환
byte a = 10;
byte b = 20;
//byte c = a + b; => 연산은 int로 변환되기 때문에 오류, byte
byte c = (byte)(a + b);
System.out.println(c); // 30
단항연산자
1. 증감 연산자
- 종류 : ++ (피연산자 값을 1씩 증가) , -- (피연산자 값을 1씩 감소)
- 피연산자의 타입 변경 x
- 덧셈 / 뺄셈 역할 + W(쓰기) 역할 ?
==> 대입연산자랑 증감 연산자/산술 ? 만 w(쓰기) 역할
- 전위형 , 후위형
- 전위형
값이 참조되기 전에 증가/감소시킴. (j = ++i;) - 후위형
값이 참조된 후에 증가/감소시킴. (j = i++;)
int i = 1;
i++;
System.out.println(i); //2
int j = 1;
++j;
System.out.println(j); //2
==> 독립적으로 쓰일 땐 값이 같게 나옴
int i = 5;
int j = i++;
System.out.println("j : " + j + ", i : " + i); //j : 5, i : 6
i = 5;
j = ++i;
System.out.println("j : " + j + ", i : " + i); //j : 6, i : 6
==> 위는 변수를 읽어오고 난 후에 증가시키고 , 아래는 증가시킨 후에 변수를 읽어와서 값이 다름
2. 부호 연산자
피연산자의 부호를 반대로 변경한 결과를 반환
boolen과 char를 제외한 기본형에만 사용 가능
int i = -10;
int j = +i;
System.out.println(j); //-10
int a = -15;
int b = -a;
System.out.println(b); //15
==> +는 부호에 영향이 없어서 잘 쓰이지 않고 '-'를 자주 사용
산술연산자
사칙연산자
- 종류 : + , - , / , * , %
- 산술 변환 규칙이랑 같음
int a = 1_000_000;
int b = 2_000_000;
long c = a * b;
System.out.println(c); //-1454759936
//int타입으로 연산, 범위를 넘어가서 오버플로우 발생!
c = (long)a * b;
System.out.println(c); //2000000000000
==>a나 b를 long타입으로 바꿔주면 long타입으로 연산되어서 제대로 된 값을 얻을 수 있음
***********여기 헷갈림********
char c1 = 'a'; // 'a' 코드값 = 97;
char c2 = c1;
char c3 = ' ';
int i = c1 + 1; //98 , char보다 int가 큰 단위라서 int + int로 계산
//c3 = c2 + 1; ==> c3이 char타입이라 char로 계산해줘야 됨
c3 = (char)(c2 + 1);
System.out.println(c3); //b
//c2 = c2 + 1; ==> c2는 char타입이라 char로 계산필요
c2++; //증감 연산자는 피연산자의 타입을 변경하지 않음
System.out.println(c2); //b
==> 헷갈렸는데 왼쪽 변수의 타입을 먼저 생각!
char c1 = 'a';
//char c2 = c1 + 1;
char c2 = 'a' + 1;
//System.out.printf(c1 + 1);
System.out.println(c2); //b
System.out.println('a' +1); //98
=================> println(c2)는 char타입이라서 b로 나오고 println('a'+1)은 int값으로 연산돼서 int로 출력
float pi = 3.141592f;
float shortPi = (int)(pi * 1000) / 1000f;
System.out.println(shortPi); //3.141 , 셋째자리까지 출력
//소수점 셋째자리에서 반올림
double d = 3.141592;
double mathPi = Math.round(d * 1000) / 1000.0;
double mathPi2 = Math.round(d * 1000) / 1000;
System.out.println(mathPi); //3.142
System.out.println(mathPi2); //3.0
//소수점 셋째자리에서 반올림
shortPi = (int)(pi * 1000 + 0.5) / 1000f;
System.out.println(shortPi); //3.142
===> Math.round() : 소수점 첫째자리에서 반올림해서 '정수'로 출력해주는 메서드
1000.0으로 하면 double타입으로 연산돼서 3.142가 되고, 1000으로하면 정수와 정수 연산으로 돼서 3.0이 됨 ?
나머지연산자
% , 나누는 수로 0 사용 불가
int x = 10;
int y = 8;
System.out.printf("%d을 %d로 나누면, 몫은 : %d , 나머지는 : %d입니다.", x , y , x/y, x%y);
//10을 8로 나누면, 몫은 : 1 , 나머지는 : 2입니다.
System.out.println(10%8); //2
System.out.println(-10%8); //-2
System.out.println(-10%-8); //-2
==> 부호는 무시돼서 결과는 절댓값으로 나눈 나머지랑 같음!
비교연산자
논리연산자
기타
컴파일러
1. 번역
2. 자동코드추가
3. 최적화
비교연산자
float f = 0.1f != double d = 0.1 이거만 조심하면 됨===> 실수는 비교할 때 작은 쪽으로 맞춰서 계산~! (float로 맞춰서 비교)
헷갈리는 거 : 0.1f -> 0.1d 로 바꿀 때 왜 버려지는지 다시 확인
조건연산자 ( = if문)
-> 자바스크립트랑 어떻게 다른지 비교해서 보기 ~~
-->
? ? ?