| 연산자종류 | 연산자 | 피연산자수 | 산출값 | 기능설명 |
|---|---|---|---|---|
| 산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
| 부호 | +, - | 단항 | 숫자 | 음수와 양수의 부호 |
| 문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
| 대입 | =, +=, -=, *=, /= ... | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
| 증감 | ++, -- | 단항 | 숫자 | 1만큼 증가/감소 |
| 비교 | ==, !=, >, <, >=, <=, intanceof | 이항 | boolean | 값의 비교 |
| 논리 | !, &, |, &&, || | 단항, 이항 | boolean | 논리적 NOT.AND.OR 연산 |
| 조건 | (조건식) ? A : B | 삼항 | 다양 | 조건식에 따라 A또는 B중 하나를 선택 |
모든 클래스는 Object를 상속하기 때문에 object instanceOf Object는 항상 true를 리턴한다.
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);
}
}
대입을 먼저하고 증감을 시키는건지, 증감을 먼저 한 후 대입을 시키는건지 헷갈리지 말기!
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);
}
}
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);
}
}
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;
}
}
/* 점수가 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("점수의 범위를 벗어남");
}
}
}
내가 짠 코드는 단순히 코드에 입력값을 넣고 점수의 범위를 벗어났는지 아닌지만 판단하는 용도로 사용되었다.
/* 점수가 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보다 작아야 하는 문구를 예외처리를 통하여 구현했다.
/* 점수가 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객체를 생성해 입력 받는 코드이다.
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);
}
}
NaNNot a Number
/ 또는 % 연산자를 사용할 때 좌측 피연산자가 정수 타입인 경우 나누는 수인 우측 피연산자는 0을 사용할 수 없다. 만일 0으로 나누면 컴파일은 정상적으로 되지만, 실행 시ArithmeticException이 발생한다.
실수를 입력 받을 때에는 반드시NaN검사를 해야 한다. 3라인에서 부동소수점으로 변환이 가능한 문자열을 입력받는다고 가정했을 때, 악의성 있는 사용자는 숫자로 변환이 안되는NaN을 입력할 수도 있다.
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()를 사용해야 한다.
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문마다
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);
}
}
선생님이 만든 코드는 연산을 한 후에 출력문은 마지막에 한번만 쓰는 코드를 구현 하였다.