<산술연산자>
int result = 10 + 20 - 30 / 40 % 50;
여러개의 연산자가 한꺼번에 있을때, * / 를 먼저 수행
%도 나누기를 하기때문에 /와 우선순위 동일
나머지 연산 : 주로 홀짝 구분시 사용
복합연산자 (변수가 연산과 대입에 사용될 때)
result = result + 3;
result += 3;
아래의 문장을 복합연산자를 사용한 문장으로 만들어주세요.
result = result + 10;
result = result % 5;
result = result -2 * 3;
result += 10;
result %= 5;
result -= 2 * 3;
증감연산자
증가연산자(++) : 변수의 값을 1 증가시킨다.
감소연산자(--) : 변수의 값을 1 감소시킨다.
int i = 0;
++i; 전위형 : 변수의 값을 읽어오기 전에 1 증가된다. (읽은 값이 1)
--i; 후위형 : 변수의 값을 읽어온 후에 1 증가된다. (읽은 값이 0)
사칙연산자
피연산자의 값이 서로 같아야만 연산이 가능하다.
+, -, *, /, % : 2항 연산자
ex) 1 + 1 피연산자가 2개
int _int = 10;
double _double = 3.14;
double result2 = _int + _double;
// 자동형변환을 했기 때문에 연산가능
byte _byte = 5;
short _short = 10;
_int = _byte + _short;
// int보다 작은 타입은 int로 형변환된다.
(컴퓨터는 최소 4byte 이상부터 연산 가능)
char도 2byte여서 int로 형변환되어 연산된다.
char _char = 'a';
char _char2 = 'b';
_int = _char + _char2;
<오버플로우, 언더플로우>
표현범위를 벗어나는 값을 표현할 때 발생하는 현상
오버플로우 : 가장 큰 값을 벗어나는 것
byte b = 127;
b++;
System.out.println(b); //결과값 -128
(byte 타입의 가장 큰 값이 127이므로 1이 증가하면 -128이 됨)
언더플로우 : 가장 작은 값을 벗어나는 것
b--;
System.out.println(b); //결과값 : 127
다음을 한줄씩 계산해서 최종 결과값을 출력해주세요.
long result1 = 123456+654321;
result1 *= 123456;
result1 /= 123456;
result1 -= 123456;
result1 %= 123456;
//result1을 int타입으로 적으면 오버플로우가 발생
3개의 int형 변수를 선언 및 초기화 후 합계와 평균을 구해주세요.
int a = 3;
int b = 5;
int c = 9;
int sum = a+b+c;
double avg = sum / 3.0
//sum이 int이므로 3.0으로 나눠 double 값으로 만들기
System.out.println("합계 : " + sum + " / 평균 : " + avg);
<반올림>
소수점 첫째자리에서 반올림을 해준다.
avg = Math.round(avg);
소수점 첫째자리까지 보고싶다면
avg = Math.round(avg * 10) / 10.0;
소수점 둘째자리까지 보고싶다면
avg = Math.round(avg * 100) / 100.0;
<랜덤 숫자생성>
0.0 ~ 1.0미만의 수를 랜덤으로 발생시킨다.
Math.random()
1~100까지의 수를 랜덤으로 발생시킨다.
int random = (int)(Math.random() * 100) + 1;
// 최대값이 99이므로 1 더해서 100만들기
<비교연산자>
양쪽에 있는 두 값을 비교
<, >, <=, >=, ==, !=(같지 않다, ! 부정의 의미)
문자열 비교 : equals()
int x = 10;
int y = 20;
boolean b = x < y;
System.out.println(b);
산술, 비교 연산자가 있을 때 산술연산자가 먼저 실행된다.
b = x <= y - 15;
System.out.println(b);
String 타입은 참조형이므로 변수의 값을 비교할 수 없다.
아래에서는 각각 저장된 주소를 비교한 것이므로 false가 출력된다.
String str1 = "abc";
String str2 = "ABC";
b = str1 != str2; //!= 같지 않다
System.out.println(b);
문자열 비교를 위해 equals() 메서드를 사용한다.
같지 않다를 표현할 때는 !를 붙인다.
b = !str1.equals(str2);
System.out.println(b);
다음의 문장들을 코드로 작성해주세요.
x는 y보다 작거나 같다.
x + 5와 y는 같다.
y는 홀수이다.
"기본형"과 "참조형"은 다르다.
boolean b;
b = x <= y;
b = x+5 == y;
b = y % 2 == 1;
b = !"기본형".equals("참조형");
<논리연산자>
&&(AND, 양쪽에 있는 피연산자가 TRUE/FALSE) ||(OR, 둘 중 하나만 TRUE/FALSE)
!(NOT,TRUE를 FALSE, FALSE를 TRUE로)
피연산자로 boolean만 허용한다.
논리연산은 효율적 연산을 수행한다.
왼쪽의 피연산자에서 결과가 정해지면 오른쪽은 수행하지 않는다.
(실행하지 않는 연산은 왼쪽에 경고표시)
b = true && true; //true
b = true && false; //false
b = false && true; //false
b = false && false; //false
b = true || true; //true
b = true || false; //true
b = false || true; //true
b = false || false; //false
그러므로 다음과 같은 오류가 발생할 수 있다.
int a = 10;
b = a < 5 && 0 < a++;
System.out.println(a);
//왼쪽 값이 false이기 때문에 오른쪽 연산을 수행하지 않으므로 11이 아닌 10이 출력
-> 논리연산 사용시 의도와 다른 값이 출력될 수 있다.
다음의 문장들을 코드로 작성해주세요.
b = x > y && x < 10;
b = x % 2 == 0 && x <= y;
b = x % 3 == 0 || x % 5 == 0;
<비트연산자>
1byte : 01010101(8bit)
System.out.println(10 | 15); //2진수로 연산
//10 : 00001010
//15 : 00001111
// 00001111
// | 의 경우, 둘다 0이면 결과는 0, 그외는 1
<기타연산자>
int x = 10;
int y = 20;
int result = x < y ? x : y;
System.out.println(result);
주민등록번호 뒷자리의 첫번째 숫자가 1이면 남자, 2이면 여자
int regNo = 3;
String gender = regNo == 1? "남자" : "여자";
//1,2 이외의 숫자를 넣어도 여자로 출력됨
System.out.println("당신의 성별은 " + gender + " 입니다.");
gender = regNo == 1? "남자" : (regNo == 2? "여자" : "확인불가");
// 조건식에 삼항연산을 한번 더 넣어서 해결
System.out.println("당신의 성별은 " + gender + " 입니다.");