JAVA - 연산자

Luna·2022년 11월 28일
0

JAVA

목록 보기
3/32

연산자와 연산식

연산자종류연산자피연산자수산출값기능설명
산술+, -, *, /, %이항숫자사칙연산 및 나머지 계산
부호+, -단항숫자음수와 양수의 부호
문자열+이항문자열두 문자열을 연결
대입=, +=, -=, *=, /= ...이항다양우변의 값을 좌변의 변수에 대입
증감++, --단항숫자1만큼 증가/감소
비교==, !=, >, <, >=, <=, intanceof이항boolean값의 비교
논리!, &, |, &&, ||단항, 이항boolean논리적 NOT.AND.OR 연산
조건(조건식) ? A : B삼항다양조건식에 따라 A또는 B중 하나를 선택

모든 클래스는 Object를 상속하기 때문에 object instanceOf Object는 항상 true를 리턴한다.


예제 1 - 증감 연산자

public class IncreaseDecreaseOperatorExample {
	public static void main (String[] args) {
		int x = 10;
		int y = 10;
		int z;
		
		System.out.println("-----------------------");
		x++; // x에 1 증가 (11)
		++x; // x에 1 증가 (12)
		System.out.println("x=" + x);
		
		System.out.println("-----------------------");
		y--; // y에 1 감소 (9)
		--y; // y에 1 감소 (8)
		System.out.println("y=" + y);
		
		System.out.println("-----------------------");
		z = x++; // z값에 x먼저 대입 후(12), x에 1 증가(13)
		System.out.println("z="+z);
		System.out.println("x="+x);
		
		System.out.println("-----------------------");
		z = ++x; // x에 1 먼저 증가 후(14) z값에 대입(14)
		System.out.println("z="+z);
		System.out.println("x="+x);
		
		System.out.println("-----------------------");
		z = ++x + y ++;
		// x에 1 증가(15) -> y와 더함(15+8) -> z에 대입(23) -> y에 1증가(9)
		System.out.println("z="+z);
		System.out.println("x="+x);
		System.out.println("y="+y);		
	}    
}

대입을 먼저하고 증감을 시키는건지, 증감을 먼저 한 후 대입을 시키는건지 헷갈리지 말기!


예제 2 - 논리 부정 연산자

public class DenyLogicOperatorExample {
	public static void main (String[] args) {
		boolean play = true;
		System.out.println(play);
		
		play = !play; // true 값에 !를 붙이면 false
		System.out.println(play);
		
		play = !play; // false 값에 !를 붙이면 true
		System.out.println(play);
	}
}

예제 3 - 산술 연산자

public class ArithmeticOperatorExample {
	public static void main(String[] args) {
		int v1 = 5;
		int v2 = 2;
		
		int result1 = v1 + v2;
		System.out.println("result1="+result1);
		
		int result2 = v1 - v2;
		System.out.println("result2="+result2);
		
		int result3 = v1 * v2;
		System.out.println("result3="+result3);
		
		int result4 = v1 / v2; // int타입이므로 소수점은 제외하고 나온다.
		System.out.println("result4="+result4);
		
		int result5 = v1 % v2; // v1과 v2를 나눈 나머지 값을 구하는 연산
		System.out.println("result5="+result5);
		
		double result6 = (double) v1 / v2; // 소수점까지 구하고 싶으면 double 타입으로 강제 형변환
		System.out.println("result6="+result6);	
	}
}

예제 4 - 산술 연산 전에 오버플로우를 탐지

public class CheckOverflowExample {
	public static void main(String[] args) {
		try {
			int result = safeAdd(2000000000, 2000000000);
			System.out.println(result);
		} catch(ArithmeticException e) {
			System.out.println("오버플로우가 발생하여 정확하게 계산할 수 없음");
		}		
	}
	public static int safeAdd(int left, int right) {
		if((right>0)) { // 양수처리
			if(left>(Integer.MAX_VALUE - right)) {
				throw new ArithmeticException("오버플로우 발생");
			}
		} else { // 음수와 0의 처리
			if(left<(Integer.MIN_VALUE - right)) {
				throw new ArithmeticException("오버플로우 발생");
			}
		}		
		return left + right;
	}
}

return문과 예외처리 복습하기
자바의 정석 Youtube : return문, 예외처리

예제 4 - 학습하기

/* 점수가 0~100 사이에 있지 않으면 오류를 발생 시키고
 * 그렇지 않으면 점수를 출력하는 프로그램 작성
 * 점수 -1, 0, 100, 101로 테스트 */
public class Practice {
	public static void main(String[] args) {
		try {
			int result = checkScore(101);
			System.out.println(result);
		} catch (ArithmeticException e) {
			System.out.println("범위를 벗어났음.");
		}
	}
	public static int checkScore(int score) {
		if( 0 < score && score < 100 ) {
			return score;
		} else {
			throw new ArithmeticException("점수의 범위를 벗어남");
		}
	}
}

내가 짠 코드는 단순히 코드에 입력값을 넣고 점수의 범위를 벗어났는지 아닌지만 판단하는 용도로 사용되었다.

예제 4 - 선생님이 알려주신 코드

/* 점수가 0~100 사이에 있지 않으면 오류를 발생 시키고
 * 그렇지 않으면 점수를 출력하는 프로그램 작성
 * 점수 -1, 0, 100, 101로 테스트 */
public class CheckScoreExample {
	
	//시작
	public static void main(String[] args) {
		System.out.println("시작");
		// 변수 선언
		int score = -2;
		int safeScore = 0;
		// 예외처리 구조
		try { // 정상처리 
			safeScore = checkScore(score);
			
		} catch (ArithmeticException e) { // 예외처리
			System.out.println(e.getMessage());
			safeScore = score;
			
		} finally { // 정상처리나 에외처리를 한 후 반드시 실행되는 처리문
			System.out.println("입력 점수: " + safeScore);
		}
		System.out.println("끝");
	}
	// 점수 체크
	public static int checkScore(int score) {
		
		// 점수체크 - 0보다 적거나 100보다 크면 안된다.
		if(score < 0) {
			throw new ArithmeticException("점수는 0이상이어야 합니다.");
		} if (score > 100) { 
			throw new ArithmeticException("점수는 100이하이어야 합니다.");
		} 
		return score;	
	}
}

선생님의 코드는 점수를 입력하고 그 점수가 범위를 벗어났는지, 아닌지 확인함과 동시에 0보다 작으면 0 이상이어야 한다는 문구를, 100보다 크면 100보다 작아야 하는 문구를 예외처리를 통하여 구현했다.

예제 4 - 값을 키보드로 입력 받기

/* 점수가 0~100 사이에 있지 않으면 오류를 발생 시키고
 * 그렇지 않으면 점수를 출력하는 프로그램 작성
 * 점수 -1, 0, 100, 101로 테스트 */
import java.util.Scanner;

public class CheckScoreExample2 {
	
	//시작
	public static void main(String[] args) {
		System.out.println("시작");
		
		// 콘솔에서 사용자 입력하는 객체
		Scanner scanner = new Scanner(System.in); // System.in - 키보드
		System.out.print("점수입력 : "); // 점수 입력 안내 문장 출력
		String str = scanner.nextLine(); // 엔터 친 곳 까지 문자열로 입력 받으세요.
		
		// 변수 선언
		int score = Integer.parseInt(str);
		int safeScore = 0;
		
		// 예외처리 구조
		try { // 정상처리 
			safeScore = checkScore(score);
			
		} catch (ArithmeticException e) { // 예외처리
			System.out.println(e.getMessage());
			safeScore = score;
			
		} finally { // 정상처리나 에외처리를 한 후 반드시 실행되는 처리문
			System.out.println("입력 점수: " + safeScore);
		}
		System.out.println("끝");
	} // end of main();
	
	// 점수 체크
	public static int checkScore(int score) {
		
		// 점수체크 - 0보다 적거나 100보다 크면 안된다.
		if(score < 0) {
			throw new ArithmeticException("점수는 0이상이어야 합니다.");
		} if (score > 100) { 
			throw new ArithmeticException("점수는 100이하이어야 합니다.");
		} 
		return score;	
	}
}

매번 코드에 입력값을 수정 할 수 없으니, 입력값을 키보드로 입력 받는 scanner 객체를 생성해 입력 받는 코드이다.


예제 5 - "NaN" 문자열의 문제점

public class InputDataCheckNaNExample1 {
	public static void main(String[] args) {
		String userInput = "NaN";
		double val = Double.valueOf(userInput);
		// 대문자로 시작되면 class나 Interface. Double(클래스).valueOf(메서드)
		
		double currentBalance = 10000.0;
		
		currentBalance += val; // currentBalance = currentBalance + val
		System.out.println(currentBalance);
	}
}

NaN Not a Number
/ 또는 % 연산자를 사용할 때 좌측 피연산자가 정수 타입인 경우 나누는 수인 우측 피연산자는 0을 사용할 수 없다. 만일 0으로 나누면 컴파일은 정상적으로 되지만, 실행 시 ArithmeticException이 발생한다.
실수를 입력 받을 때에는 반드시 NaN 검사를 해야 한다. 3라인에서 부동소수점으로 변환이 가능한 문자열을 입력받는다고 가정했을 때, 악의성 있는 사용자는 숫자로 변환이 안되는 NaN을 입력할 수도 있다.


예제 6 - 문자열 비교

public class StringEqualsExample {
	public static void main(String[] args) {
		String strVar1 = "가나다";
		String strVar2 = "가나다";
		String strVar3 = new String("가나다");
		
		// 동일한 객체를 참조하는지 확인
		System.out.println(strVar1 == strVar2);
		System.out.println(strVar1 == strVar3);
		
		// hashCode = 해시 알고리즘에 의해 생성된 정수 값
		// 입력한 값을 기준으로 참조한 주소값을 받아온다. - 값이 같으면 똑같은 숫자가 나온다.
		System.out.println(strVar1.hashCode()); // 43761996
		System.out.println(strVar2.hashCode()); // 43761996
		System.out.println(strVar3.hashCode()); // 43761996
		
		// 주소값을 기준으로 주소값을 받아온다.
		System.out.println(System.identityHashCode(strVar1)); // 366712642
		System.out.println(System.identityHashCode(strVar2)); // 366712642
		System.out.println(System.identityHashCode(strVar3)); // 1829164700
		
		// 문자열이 같은지 확인
		// 문자열 비교는 String 안에 비교 메서드를 사용한다. 변수명.equals(비교할변수명);
		System.out.println(strVar1.equals(strVar2));
		System.out.println(strVar1.equals(strVar3));
	}
}

새로운 객체를 생성하면 주소값이 다르기 때문에 == 연산자로 비교 할 시 false가 나온다.
단순히 문자열 비교를 위해서는 .equals()를 사용해야 한다.


예제 7 - 삼항 연산자

public class ConditionalOperationExample {
	public static void main(String[] args) {
		int score = 85;
		char grade = (score>90) ? 'A' : ((score>80)? 'B':'C');
		System.out.println(score + "점은 "+ grade + "등급입니다.");
	}
}

간단한 비교를 할 때에는 if문 보다는 삼항 연산자를 사용한 코드가 훨씬 클린하다.


연산 결과를 출력하는 코드 만들기

내가 만든 코드

import java.util.Scanner;

public class Practice {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("x: ");
		String str1 = scanner.nextLine();
		System.out.print("y: ");
		String str2 = scanner.nextLine();
		
		int x = Integer.parseInt(str1);
		int y = Integer.parseInt(str2);
		
		System.out.println("x+y=" + (x+y));
		System.out.println("x-y=" + (x-y));
		System.out.println("x*y=" + (x*y));
		System.out.println("x/y=" + (x/y));
		System.out.println("x%y=" + (x%y));
	}
}

내가 만든 코드는 입력 받은 각각의 x, y 값은 보이지 않고 결과만 출력하도록 구현했다.

선생님의 코드

import java.util.Scanner;
// 2개의 숫자를 입력 받아서 산술 연산 결과를 출력하하는 프로그램 작성

public class CalculatorExample {

	public static void main(String[] args) {
		// 키보드로 입력받는 클래스(객체)
		Scanner scanner = new Scanner(System.in);
		// 숫자 1 입력 메시지
		System.out.print("첫번째 숫자를 입력하세요.");
		// 숫자 1 입력
		String strNum1 = scanner.nextLine();
		// 숫자 2 입력 메시지
		System.out.print("두번째 숫자를 입력하세요.");
		// 숫자 2 입력
		String strNum2 = scanner.nextLine();
		
		// 문자열을 숫자로 변환한다.
		int num1 = Integer.parseInt(strNum1);
		int num2 = Integer.parseInt(strNum2);
		
		// 연산하고 출력한다
		System.out.println(num1 + "+" + num2 + "=" + (num1+num2));
		System.out.println(num1 + "-" + num2 + "=" + (num1-num2));
		System.out.println(num1 + "*" + num2 + "=" + (num1*num2));
		System.out.println(num1 + "/" + num2 + "=" + (num1/num2));
		System.out.println(num1 + "%" + num2 + "=" + (num1%num2));
	}
}

선생님의 코드는 연산 결과 출력문에 연산 결과와 더불어 첫번째 숫자와 두번째 숫자를 각각 어떤걸 입력 했는지 까지 구현하였다.


계산기 만들기

내가 만든 코드

import java.util.Scanner;

public class CalculatorTest {
	public static void main(String[] args) {
	
	Scanner scanner = new Scanner(System.in);
	
	System.out.print("첫번째 숫자를 입력하세요: ");
	String str1 = scanner.nextLine();
	
	System.out.print("연산 기호중 하나를 입력하세요. 예) +,-,/,*,% : ");
	String op = scanner.nextLine();
	
	System.out.print("두번째 숫자를 입력하세요: ");
	String str2 = scanner.nextLine();
	
	int num1 = Integer.parseInt(str1);
	int num2 = Integer.parseInt(str2);
	
	if(op.equals("+")) {
		System.out.println(num1 + op + num2 + "=" + (num1+num2));
	} else if(op.equals("-")) {
		System.out.println(num1 + op + num2 + "=" + (num1-num2));
	} else if(op.equals("/")) {
		System.out.println(num1 + op + num2 + "=" + (num1/num2));
	} else if(op.equals("*")) {
		System.out.println(num1 + op + num2 + "=" + (num1*num2));
	} else if(op.equals("%")){
		System.out.println(num1 + op + num2 + "=" + (num1%num2));
	} else {
		System.out.println("잘못 된 연산 기호 입니다.");
	}
}

}

내가 만든 코드는 if문마다 print 출력문을 넣어 다소 복잡해 보인다.

선생님의 코드

import java.util.Scanner;

public class CalculatorTest {
	public static void main(String[] args) throws Exception {
	//키보드 입력 객체
	Scanner scanner = new Scanner(System.in);
	
	// 첫번째 숫자 입력
	System.out.println("첫번째 숫자를 입력하세요.");
	String strNum1 = scanner.nextLine();
	int num1 = Integer.parseInt(strNum1);
	
	// 두번째 숫자 입력
	System.out.println("두번째 숫자를 입력하세요.");
	String strNum2 = scanner.nextLine();
	int num2 = Integer.parseInt(strNum2);
	
	// 연산자 입력
	System.out.println("연산자를 입력하세요");
	String op = scanner.nextLine();
	
	// 연산 결과 저장 변수
	int result = 0;
	if (op.equals("+")) result = num1 + num2;
	else if (op.equals("-")) result = num1 - num2;
	else if (op.equals("*")) result = num1 * num2;
	else if (op.equals("/")) result = num1 / num2;
	else if (op.equals("%")) result = num1 % num2;
	else { 
		scanner.close();
		throw new Exception("잘못된 연산자 입니다."); 
		}
	System.out.println(num1 + op + num2 + "=" + result);
	}
}

선생님이 만든 코드는 연산을 한 후에 출력문은 마지막에 한번만 쓰는 코드를 구현 하였다.


0개의 댓글