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의 배수 이군");
		}
	}
}