연산자 종류와 우선순위
부호연산자
- 변수의 부호를 유지하거나 변경
- + : 피연산자의 부호 유지
- - : 피연산자의 부호 변경
- 부호 변경도 연산이므로 int 타입 변수에 대입해야함 (정수타입 연산 결과는 int타입)
byte b = 100;
int result = -b;
산술연산자 (이항연산자)
- 산술 연산을 정확하게 계산하고 싶다면 실수 타입을 사용하지 않는 것이 좋음 (부동 소수점 방식)
- 피연산자가 정수타입이면 연산 결과는 int 타입
- 피연산자가 정수타입이고 그 중 하나가 long 타입이면 연산의 결과는 long 타입
- 피연산자 중 하나가 실수 타입이면 연산 결과는 실수 타입
- + - (덧셈, 뺄셈)
int num1 = 10;
int num2 = 3;
System.out.println("num1 + num2 = "+ (num1+num2) );
// num1 + num2를 괄호를 안 쓰고 그대로 출력해버리면 String문자열로 취급하기 때문에 103이라는 결과가 나온다.
System.out.println("num1 - num2 = " + (num1 - num2));
// 문자열은 뺄셈이 불가능하다.
- * / % (곱셈, 나눗셈, 나머지)
System.out.println("num1 * num2 = "+ (num1 * num2));
System.out.println("num1 / num2 = "+ (num1 / num2));
System.out.println("num1 % num2 = "+ (num1 % num2));
// 곱셈,나눗셈,모듈러 연산의 경우 덧셈보다는 우선순위가 높기때문에 괄호로 묶지 않아도 정확한 결과가 나온다.
// 다만, 가독성 확보를위해 묶어두는것을 권장한다.
// System.out.println(10 % 0);
// 수학과 마찬가지로 0으로 나누기는 불가능함. 에러가 발생한다.
증감연산자 (단항연산자)
- ++ : 변수에 담긴 값을 1 증가시키는 연산자
- - - : 변수에 담긴 값을 1 감소시키는 연산자
- (증감연산자)변수 : 전위연산 -> 선증감 후처리
변수(증감연산자) : 후위연산 -> 선처리 후증감
// 전위연산
int a = 10;
int b = ++a; // 11 a값을 1증가시키고 b에 담음.
// 후위연산
int c = 10;
int d = c++; // 10 d라는 변수에 값을 대입하는 작업을 처리하고나서, c의값을 1증가시킴.
int a = 10;
int b = 20;
int c = 30;
System.out.println(a++); // a = 10(11) -> 10출력
System.out.println( (++a) + (b++) );// a = 12 , b =20(21) -> 32출력
System.out.println( (a++) + (--b) + (--c) ); // a = 12(13) , b = 20 , c = 29 ->61출력
System.out.printf("a : %d, b : %d, c : %d", a,b,c); // a = 13 , b = 20 , c = 29
복합대입연산자
- 산술연산자와 대입연산자를 함께 사용하는 연산자
- 연산처리속도가 빨라지므로 사용하는걸 권장
- += , -= , *= , /= , %= 등이 있음
- += 의 경우 문자열도 접합이 가능
a = a +3; => a += 3;
a = a -3; => a -= 3;
a = a *3; => a *= 3;
a = a /3; => a /= 3;
a = a %3; => a %= 3;
//기존의 a 값에 3을 더하거나,빼거나,나누거나,곱하고 그결과값을 다시한번 a변수에 대입해주겠다.
비교연산자 / 관계연산자(이항연산자)
- 두 개의 값을 가지고 비교
- 비교 연산한 결과가 참일 경우 true / 거짓을 경우 false값을 반환(즉, 반환값이 boolean)
- 특정 조건을 제시할수 있는 조건문에서 많이 사용됨
- 피연산자의 타입이 다를 경우에는 비교 연산을 수행하기 전에 타입을 일치시킴 (3 == 3.0 → true)
- boolean과 참조형 제외하고 나머지 자료형에 모두 사용 가능 (String은 equals로 비교)
- 비교연산보다 산술연산이 우선순위가 더 크기때문에 괄호로 묶어서 우선순위를 높여줘야한다
- 크고 작음을 비교
a < b : a가 b보다 작습니까?
a > b : a가 b보다 큽니까?
a <=b : a가 b보다 작거나 같습니까?
a >=b : a가 b보다 크거나 같습니까? - 일치함을 비교(동등비교)
a == b : a와 b가 같습니까?
a != b : a와 b가 같지 않습니까?
System.out.println("a가 짝수입니까 : " + (a % 2 == 0) ); // true
System.out.println("a가 짝수입니까 : " + (a % 2 != 1) ); // true
System.out.println("a가 짝수입니까 : " + !(a % 2 == 1) ); // true
// 어떤값을 2로 나누었을때 나머지값이 0이냐, 1이냐를 가지고 홀수인지 짝수인지 판별 가능.
- 예외 : flout과 double은 부동 소수점 방식과 정밀도 차이로 오류
- 해결책 : 피연산자를 float 타입으로 강제 타입 변환 후 비교 연산
0.1f == (float)0.1 -> true
문자열(참조자료형)간 동등비교
- 참조자료형은 ==, !=으로 동등비교시 정상적으로 비교가 안됨
- .equals()로 동등비교 해야함
- 반대 : !name.equals()
- true or false값을 반환
if(name.equals("123")) {
System.out.println("123님 반갑습니다");
}else {
System.out.println("123님이 아니시네요?? 누구죠??");
}
논리연산자
- 논리 값 2개(이항연산자)를 비교하는 연산자
- AND (&&) : 조건식 A && 조건식 B
- 조건식 A와 조건식 B가 모두 참일경우에만 true를 반환.
- 하나라도 false값이 들어간경우 false값 반환
- 왼쪽 조건식의 결과가 false인경우 우측 조건식은 검사조차 하지 않음 ( & 하나만 쓰면 검사함)
- OR ( || ) : 조건식 A || 조건식 B
- 조건식 A와 조건식 B가 모두 거짓일 경우에만 false값 반환.
- 하나라도 true가 들어간경우 true값 반환.
- 왼쪽 조건식의 결과가 true참인경우 우측 조건식은 검사하지 않음 ( | 하나만 쓰면 검사함)
- NOT ( ! ) : !논리값
- 논리값(true/false)을 반대로 바꿔주는 연산자 (논리부정연산자)
// 사용자가 입력한 문자가 알파벳 대문자인지 확인하는 프로그램
Scanner sc = new Scanner(System.in);
System.out.print("영어 한글자를 입력해주세요 : ");
char ch = sc.nextLine().charAt(0);
boolean result = (ch >= 'A') && (ch <= 'Z');
boolean result2 = (ch >= 65) && (ch <= 90);
삼항연산자
- 3개의 항목(값)을 가지고 연산하는 연산자
- 표현법
- 조건식 ? 조건이 true일 경우 : 조건이 false인 경우
- 조건식이란 (true/false)가 나오게하는 연산자(주로 논리연산자를 통해 작성함)
/* 두개의 정수값과 + 또는 -의 문자를 하나 입력받아
* +일경우 두 정수값의 덧셈연산한결과
* -일경우 두 정수값의 뺄셈연산한 결과
* 둘다 아닌결우 "잘못입력하셨습니다"를 출력
*/
Scanner sc = new Scanner(System.in);
// 첫번째 정수 :
System.out.print("첫번째 정수 : ");
int num1 = sc.nextInt();
// 두번째 정수 :
System.out.print("두번째 정수 : ");
int num2 = sc.nextInt();
sc.nextLine(); // 엔터키 비워주기
// 연산자 입력(+ or -) :
System.out.print("연산자 입력(+ or -) :");
char op = sc.nextLine().charAt(0);
// 결과 : xxx
String result = (op == '+') ? (num1 + num2)+"" : (op == '-') ? (num1 - num2)+"" : "잘못입력했습니다";
// ""를 쓰는 이유 : 문자 자료형으로 자동 형변환
System.out.println("결과 : " +result);
'JAVA > 1. 자바 언어 기초' 카테고리의 다른 글
[JAVA] Math.random 메소드 (0) | 2023.11.16 |
---|---|
[JAVA] NaN, Infinity (0) | 2023.11.16 |
[JAVA] 오버플로우, 언더플로우 (0) | 2023.11.16 |
[JAVA] Scanner (0) | 2023.11.16 |
[JAVA] 출력메소드 (0) | 2023.11.16 |