본문 바로가기

자바스프링웹공부(2024)/자바

2024.07.26. 연산자

반응형

* 비교연산자 (관계연산자) (>, >=, <=, <, ==, != )


-두 피연산자간의 대소관계등을 비교하여 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);

 

반응형