* 비교연산자 (관계연산자) (>, >=, <=, <, ==, != )
-두 피연산자간의 대소관계등을 비교하여 true 또는 False 값 변환.
int a = 10;
int b = 5;
System.out.println(" a > b 인가? " + ( a > b));
System.out.println(" a > b 인가? " + a > b); // a, b 의 자료형은 int 인데, 괄호가 없으면 앞의 문자열 처럼 취급하기 때문에 에러가 난다.
//-----------------//
System.out.println(3==3.0); //true : int가 double 과 만나면 double로 자동변환되어 비교되니까 true가 된다.
System.out.println(0.1==0.1f); //false : 부동소수점 때문이다. float는 double과 표현방법이 다르기 때문에 맨 뒤쪽으로가면 정확히 같은수가 없다. 그래서 플로트와 더블은 근사치만 맞고 절대 비교하면 안됨.
//-----------------//
String str1 = "abc";
String str2 = "ab";
String str3 = "c";
String str4 = str2 + "c";
String str5 = str2 + str3;
String str6 = "ab" + "c";
//str1,str4,str5,str6 모두 abc로 값이 값다. 하지만 서로 비교를 하면 값이 어떨까?
System.out.println("< 동등비교 연산자 비교 >");
System.out.println(str1 == str4); //false
System.out.println(str1 == str5); //false
System.out.println(str1 == str6); //true
//=>변수안에 있는 주소를 비교했기 때문에 다른 결과가 나온다.
// 그래서 값을 비교하고 싶으면 equals() 메서드로 비교해야 한다.
System.out.println(str1.equals(str4)); //true
System.out.println(str1.equals(str5)); //true
System.out.println(str1.equals(str6)); //true
*논리 연산자(&&:Ampersend, ||:Vertical bar, !, ^:Caret)
<AND연산자>
-두 피연산자 모두 true 일 경우 true.
ex. false && false = false
<OR 연산자 -논리합>
-두 피연산자 중 하나라도 true 일 경우 결과값이 true이고, 모두 false일 경우에만 false
ex. false || false = false
<NOT 연산자(!) - 논리부정 >
-단항 연산자로, 현재 값을 반대로 반전.
ex. !T = F. !F = T
<XOR 연산자(^) - 배타적 논리합.>
-두 피연산자가 서로 다를 때 true, 같으면 false
es. F XOR F = False , T XOR F = True
T XOR T = False, F XOR T = True
=>공장같은데서 뭐가 켜져있으면 꺼야되고 이런거 판단할 때 많이 쓰인다고 함. 일반적 웹개발에서는 잘 안쓰인다고 함.
**삼항연산자
-tip1. 기호를 한개로 안쓰고 && || 이런식으로 이용하는 이유 :
ex.
int i=10;
boolean result = (i>9) | (i++ > 9);
boolean result2 = (i>9)|| (i++ > 9);
=> 10>9 보다 크므로 이미 OR 연산자 조건에 부합하다.
result는 이미 부합한 조건이 왔지만 뒤의 연산을 계속하고 마친다.
result2는 부합한 조건이 나왔으므로 이 부분에서 연산을 마친다.
=>불필요한 연산은 하지않음 (Lazy Evaluation)
-tip2. 자료형 구분하기
int a=2;
String result = (a%2 == 0)? "짝수" : 12; / / 오류 result의 자료형은 String이다. 12는 int이므로 자료형을 맞춰야함.
*오늘의 퀴즈*
Q. double d = 97.7 일 때 반올림 된 값을 int round 변수에 담아보세요.
double d = 97.7;
//int round = d * 10 % 10 >= 5 ; //값 : 7
int rount = d * 10 % 10 >= ? (int)d+1:(int)d;
Q.위에 round변수에 담을 때 (int)형변환 없이 해보세요.
double d = 97.7;
//int round = d * 10 % 10 ? (int)d+1:(int)d;
//=>위의 변수를 형변환 없이 큰타입에서 작은 타입으로
// ................ //
// 어제 7월26일 자바형변환 참고 : 대입연산자를 사용하면 됨.
int round = 0 ; //int 선언 후 0으로 초기화함.
round += d * 10 % 10 ? d+1:d; //double -> int 지만 대입연산자를 사용하여 형변환을 하지않아도 오류가 나지 않는다.
//결과값 98
Q. 더 간단한 방법...
int round = (int)d; //먼저 int로 형변환
round += (d * 10) % 10 >=5 ? 1 : 0; //삼항연산자에서 덧셈을 하지않아도 된다.
*오늘의 퀴즈2*
Q. 삼항연산자를 사용하여 문자 ch에 대해 "대문자"와 "소문자" 판별, 그나머지는 "기타문자"로 표현하시오.
char ch ='a';
String s;
// tip. 자바에서는 범위를 표현할 때 65 <= ch <=90 이런식으로 쓰지 못함. && 연산자를 사용하여 표현해야 함.
// 대문자 : A : 65 - Z : 90 ==> 65 <= ch && ch <=90
// 소문자 : a : 97 - z : 122 ==> 67 <= ch && ch <=122
char ch ='a'; //A:65 -90, a:97 - 122
String s = (65 <= ch && ch <=90) ? "대문자" :
(67 <= ch && ch <=122) ? "소문자" :"기타문자";
System.out.println(s);
'자바스프링웹공부(2024) > 자바' 카테고리의 다른 글
2024.08.02. 반복문( for문, 중첩for문 ) (0) | 2024.08.02 |
---|---|
2024.08.01. 반복문(Loop) - while문, 중첩 while문 (0) | 2024.08.01 |
2024.08.01. 조건문(중첩 if문, switch_case, ) (0) | 2024.08.01 |
2024.07.25. 변수, 형변환, 연산자1 (0) | 2024.07.26 |
2024.07.23. 자바공부 (0) | 2024.07.25 |