도도한 개발자

[Java] #05. 자바의 연산자 본문

Backend/Java

[Java] #05. 자바의 연산자

Kiara Kim 2022. 3. 10. 17:35

* 복합 대입 연산자 (Compound Assignment Operator)

 

+= : 기존 값에 우측 항의 값을 더함

-= : 기존 값에 우측 항의 값을 뺌

*= : 기존 값에 우측 항의 값을 곱함

/= : 기존 값에 우측 항의 값을 나눔

%= : 기존 값에 우측 항의 값으로 나눈 나머지

 

public class OperatorCompound {
	int intValue = 10; 
	public static void main(String[] args) {
		OperatorCompound opr = new OperatorCompound();
		opr.compound();
	}
	
	public void compound() {
		System.out.println(intValue += 5);	// 15
		System.out.println(intValue -= 5);	// 10
		System.out.println(intValue *= 5);	// 50
		System.out.println(intValue /= 5);	// 10
		System.out.println(intValue %= 5);	// 0
	}
}

 

 

* 단항 연산자 (Unary Operator)

 

+ : 단항 플러스 연산자. Unary plus operator

- : 단항 마이너스 연산자. Unary minus operator

++ : 증가 연산자. Increment operator

-- : 감소 연산자. Decrement operator

! : 논리 부정 연산자. Logical complement operator

 

public class OperatorUnary {

	public static void main(String[] args) {
		OperatorUnary una = new OperatorUnary();
		una.unary();
	}
	
	public void unary() {
		int intVal = 5;
		System.out.println(+intVal);	// 5
		System.out.println(-intVal);	//-5
		System.out.println(intVal++);	// 5
		System.out.println(intVal);	// 6
		System.out.println(++intVal);	// 7
		System.out.println(intVal--);	// 7
		System.out.println(intVal);	// 6
		System.out.println(--intVal);	// 5
	}
}

 

 

* 삼항 연산자 ? (Conditional Operator)

 

변수 = (boolean조건식) ? true일때의 값 : false일때의 값

 

 

* 기본 자료형의 형 변환 (Casting)

 

   형 변환은 서로 다른 타입 사이에 변환하는 작업을 하는 것을 말한다. 자바의 형 변환은 기본 자료형과 참조 자료형 모두 괄호로 묶어주면 된다. 그러나 기본 자로형 중 형 변환이 전혀 되지 않는 것이 있다. 바로 boolean타입인데, 이는 숫자로 변환할 수 없기 때문에 형 변환이 불가능하다. 

 

   또한 기본 자료형 -> 참조 자료형, 참조 자료형 -> 기본 자료형으로의 형 변환은 절대 안된다. 

 

byte에서 short로, short에서 byte로의 형 변환은 약간 다른데 예제로 보자.

 

public class OperatorCasting {

	public static void main(String[] args) {
		OperatorCasting cast = new OperatorCasting();
		cast.casting();
		cast.casting2();
	}
	
	public void casting() {
		byte byteVal = 127;
		short shortVal = byteVal;
		shortVal++;
		System.out.println(shortVal);	// 128
		byteVal = (byte)shortVal;	//-128
		System.out.println(byteVal);
	}
	
	public void casting2() {
		short shortVal = 256;
		byte byteVal = (byte)shortVal;
		System.out.println(byteVal);	// 0
		shortVal = 255;
		byteVal = (byte)shortVal;
		System.out.println(byteVal);	// -1
	}
}

 

   형 변환을 할 때 범위가 더 큰 타입으로 변환하면 아무런 문제가 없다. 그러나 범위가 작은 타입으로 형 변환을 하면, 생각치도 못한 값이 나올 수 있으므로 비트 값을 잘 보자.

 

   128은 2의 7제곱이다. 비트로 표현하면 위와 같이 표시할 수 있다. short에서 byte로 변환한다는 것은 short 앞에 있는 1바이트(8비트)를 그냥 버리기 때문에, 결론적으로 byte로 형 변환한 결과는 아래와 같다.

 

   byte의 가장 첫 bit가 1이면 그 값은 -128이다. 그렇기 때문에 결과가 -128로 나온 것이다. 

 

   다른 예로.

2의 8제곱 위치(9번째 위치)에 있는 값만 1인 short를 생각해보자. 이 경우 앞의 1바이트를 버리면 나머지 자리에는 모두 0밖에 안남는다. 

 

 

* 실습

 

SalaryManager 클래스를 만들고 연금이 2000만원인 사람의 근로소득세 12.5%, 국민 연금 8.1%, 건강 보험료 13.5% 공제 후의 월급을 계산하라.

public class SalaryManager {

	public static void main(String[] args) {
		SalaryManager manager = new SalaryManager();
		int salary = 20000000;
		System.out.println(manager.getMonthlySalary(salary));
	}
	public double getMonthlySalary(int yearlySalary) {
		double mSal = yearlySalary / 12.0;
		double tax = calculateTax(mSal);
		double pension = calculateNationalPension(mSal);
		double insurance = calculateHealthInsurance(mSal);
		double total = tax + pension + insurance;
		
		mSal -= total;
		return mSal;
	}
	public double calculateTax(double monthSalary) {
		double tax = monthSalary * 0.125;
		return tax;
	}
	
	public double calculateNationalPension(double monthSalary) {
		double pension = monthSalary * 0.081;
		return pension;
	}
	
	public double calculateHealthInsurance(double monthSalary) {
		double insurance = monthSalary * 0.135;
		return insurance;
	}
}

 

 

* 정리

 

값을 할당할 때 사용하는 연산자의 기호는 무엇인가요?

할당 연산자는 = 이며, 우측에는 할당할 값, 좌측에는 할당 받을 변수를 위치시켜야 한다.


기본적인 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지를 계산할 때 사용하는 연산자의 기호는 무엇인가요?

사칙연산 연산자는 + - * / 이며, 나머지는 % 연산자를 사용하면 된다.


+=는 무엇을 할 때 사용하는 연산자인가요?

+= 는 기존 값에 우측 항의 값을 더할 때 사용한다.


여러분들이 연산의 순서를 모르거나 확실히 하고 싶을 때에서는 어떤 기호를 사용해야 하나요?

연산할 때 연산자의 우선순위가 혼동될 경우에는 소괄호()를 사용하면 계산의 가독성을 높일 수 있다.


==와 !=의 차이는 무엇인가요?

== 는 값이 동등한지를, !=는 값이 다른지를 확인하는 연산자이다. 두 연산의 결과는 모두 boolean 타입이다.


<와 <=의 차이는 무엇인가요?

두 연산자의 차이는 우측항의 값이 포함되는지 여부이다. =이 있는 연산자는 우측항의 값을 포함한다.


! 연산자는 어떤 타입에 사용할 수 있나요?

! 연산자는 무조건 boolean 타입에만 사용할 수 있다. 해당 결과의 반대로 변환한다. (true일 때에는 false로, false일 때에는 true로 변환한다.)


? :로 표시하는 삼항 연산자의 ?와 : 뒤에 명시해 주는 값은 무엇을 의미하나요?

"? :"연산자는 값을 간편하게 할당할 때 사용한다. 조건이 true일 경우에는 ? 뒤의 값을, false일 경우에는 : 뒤의 값을 지정한다.


자바는 형 변환을 한다고 했는데, short의 값을 long에 할당할 때에는 어떤 것을 해 주어야 하나요?

short 타입을 long 타입으로 변환할 때에는 casting을 해 줄 필요가 없다.


반대로 long 값을 short에 할당할 때에는 어떤 것을 해 주어야 하나요?

long 타입을 short 타입으로 변환할 때에는 범위가 큰 타입에서 작은 타입으로 변환되는 것이기 때문에 casting을 해 줘야만 한다.


9와 10의 경우 중 어떤 경우가 가존 값이 사라지고, 엉뚱한 값으로 바뀔 수 있나요?

범위가 큰 타입으로 작은 타입으로 변환할 경우에는 값이 달라질 확률이 매우 높다.

 

 

그럼 이만.