Programming Language/JAVA (2) - 혼공자
[Java 혼자 공부하는 자바] 증감, 비교, 논리, 대입, 삼항 연산자
나수비니
2023. 9. 22. 21:37
728x90
핵심 키워드
- 증감 연산자, 비교 연산자, 논리 연산자, 대입 연산자, 삼항 연산자
핵심 포인트
- 피연산자 수에 따라 단항, 이항, 삼항 연산자로 구분하여 학습한다.
단항 연산자
부호 연산자 (+,-)
- boolean 타입과 char 타입을 제외한 기본타입에 사용
- 정수 및 실수 타입 변수에 붙는 경우
int x = -100;
int result1 = +x;
int result2 = -x;
- 부호 연산의 결과는 int
byte b = 100;
byte result = -b;
- 부호 연산의 결과는 int 타입이므로, int 타입 변수에 저장해야 함
- 부호 연산자
package sec02.exam01;
public class SignOperatorExample {
public static void main(String[] args) {
int x = -100;
int result1 = +x;
int result2 = -x; // -100을 +100으로 바꾸어서 result2에 저장해라
byte b = 100;
// byte result3 = -b; //byte로 저장하면 컴파일 오류 발생. 왜?
int result3 = -b;
System.out.println(result3);
}
}
- 부호 연산자의 결과는 int 타입 -> byte타입 변수를 부호연산 -> int 타입으로 바뀌므로, 컴파일에러 발생
증감 연산자 (++,—)
- 변수의 값을 1 증가 ++ 시키거나, 1 감소 — 시키는 연산자.
- boolean 타입 외 모든 기본 타입 피연산자에 사용 가능
- 변수의 앞뒤 어디에든 올 수 있음
- 다른 연산자와 함께 사용될 경우, 증감 연산자 위치에 따라 결과 달라질 수 있음 주의
증가 연산자 (++)
- 피연산자 값에 1을 더하여 그 결과를 다시 피연산자에 저장
감소 연산자 (--)
- 피연산자 값에서 1을 빼고 그 결과를 다시 피연산자에 저장
package sec02.exam02;
public class IncreaseDecreaseOperatorExample {
public static void main(String[] args) {
int x = 10;
int y = 10;
int z;
System.out.println("-----------");
x++;
++x;
System.out.println("x=" + x);
System.out.println("-----------");
y--;
--y;
System.out.println("y=" + y);
System.out.println("-----------");
z = x++;
System.out.println("z=" + z);
System.out.println("-----------");
z = ++x;
System.out.println("z=" + z);
System.out.println("-----------");
z = ++x + y++;
System.out.println("z=" + z);
System.out.println("x=" + x);
System.out.println("y=" + y);
//++x는 x의 값을 먼저 증감, y++는 y의 값으로 ++x와 연산 후, y값을 1증감
}
}
논리 부정 연산자
- true를 false로, false를 true로 변경
- 조건문과 제어문에서 조건식 값 부정하여 실행 흐름을 제어
- 토글가능
- boolean 타입에서만 사용 가능
- 논리값이어야 반대로 만들 수 있으니까
이항 연산자
산술 연산자
- 피연산자 타입이 동일하지 않을 경우, 아래 규칙에 따라 일치시켜 연산 수행
- 피연산자가 byte, short, char 타입일 경우 모두 int 타입으로 변환
- 피연산자가 모두 정수 타입이고 long 타입 포함될 경우, 모두 long 타입으로 변환
- 피연산자 중 실수 타입이 있을 경우 허용범위 큰 실수 타입으로 변환
package sec02.exam04;
public class ArithmeticOperatorExample {
public static void main(String[] args) {
int v1 = 5;
int v2 = 2;
int result1 = v1 + v2;
System.out.println(result1);
int result2 = v1 - v2;
System.out.println(result2);
int result3 = v1 * v2;
System.out.println(result3);
int result4 = v1 / v2;
System.out.println(result4);
int result5 = v1 % v2;
System.out.println(result5);
double result6 = (double) v1 / v2;
System.out.println(result6);
//v1을 강제타입변환해서 double로 만든다.
}
}
- char 타입의 산술 연산자
package sec02.exam05;
public class CharOperationExample {
public static void main(String[] args) {
char c1 = 'A'+ 1;
char c2 = 'A';
// char c3 = c2 + 1; 컴파일 에러 -> 자바가상머신이 연산하면, int로 변환이 되어서 컴파일에러 발생함 int가 더 큰 허용범위라서 char타입에 들어갈 수 없음.
System.out.println("c1: " + c1);
System.out.println("c2: " + c2);
System.out.println("c3: " + c3);
}
}
문자열 결합 연산자 (+)
- + 연산자의 피연산자 중 한 쪽이 문자열인 경우
String str1 = "JDK" + 6.0;
String str2 = str1 + " 특징";
"JDK" + 3 + 3.0;
**-> "JDK33.0"**
3 + 3.0 + "JDK";
**-> "6.0JDK"**
- 흥미로운 결과값..
비교 연산자
- 피연산자의 대소 비교하여 true/false를 산출: 조건문이나 반복문에서 실행 흐름 제어
- 동등 비교 연산자는 모든 타입에 사용 가능
- 크기 비교 연산자는 boolean 외 모든 기본 타입에 사용 가능
- 비교 연산자
package sec02.exam07;
public class CompareOperatorExample {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
boolean result1 = (num1 == num2);
boolean result2 = (num1 != num2);
boolean result3 = (num1 <= num2);
System.out.println("result1=" + result1);
System.out.println("result2=" + result2);
System.out.println("result3=" + result3);
char char1 = 'A';
char char2 = 'B';
boolean result4 = (char1 < char2);
System.out.println("result4" + result4);
//문자 비교가 대소비교가 될 수 있을까? -> 유니코드로 비교함.
}
}
package sec02.exam08;
public class CompareOperatorExample {
public static void main(String[] args) {
int v2 = 1;
double v3 = 1.0;
System.out.println(v2 == v3);
//int가 double 타입으로 변경된다!
double v4 = 0.1;
float v5 = 0.1f;
System.out.println((double)v5);
//v5를 강제 타입변환 -> 0.1이 나오지 않는다.
//0.1보다 큰 수가 나온다.
//0.1f를double로 강제타입변환하게 되면, 부동소수점방식 때문이다. 정확히 0.1을 저장할 수 없는 구조.
System.out.println(v4 == v5);
//float가 double로 바뀐다!
System.out.println((float)v4 == v5);
//double을 float으로 강제타입변환하면 됨.
System.out.println((int)(v4*10) == (int)(v5*10));
//실수는 double로 통일하든지, 정수화 하든지, 강제타입변환 하든지 해야한다.
}
}
논리 연산자
- boolean 타입만 사용 가능
package sec02.exam09;
public class LogicalOperatorExample {
public static void main(String[] args) {
int charCode = 'A';
if( (charCode >= 65) & (charCode<=90)) {
System.out.println("대문자이군요");
}
if ( (charCode >=97) && (charCode<=122)){
System.out.println("소문자이군요");
} //앞 코드가 false면, 전체 연산 결과는 false가 된다.
if( !(charCode < 48) && !(charCode>57)) {
System.out.println("0~9 숫자 이군요");
} //charCode가 48보다 적어? 아니? = ture가 된다. 57보다 커? 응. 아니 = false가 된다.
int value = 6;
if( (value%2==0) | (value%3==0)) {
System.out.println("2 또는 3의 배수 이군요");
}
if ((value%2==0) || (value%3==0)) {
System.out.println("2 또는 3의 배수 이군");
}
}
}