연산자종류 | 연산자 | 피연산자수 | 산출값 | 기능설명 |
---|---|---|---|---|
산술 | +, -, *, /, % | 이항 | 숫자 | 사칙연산 및 나머지 계산 |
부호 | +, - | 단항 | 숫자 | 음수와 양수의 부호 |
문자열 | + | 이항 | 문자열 | 두 문자열을 연결 |
대입 | =, +=, -=, *=, /= ... | 이항 | 다양 | 우변의 값을 좌변의 변수에 대입 |
증감 | ++, -- | 단항 | 숫자 | 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);
}
}
NaN
Not 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);
}
}
선생님이 만든 코드는 연산을 한 후에 출력문은 마지막에 한번만 쓰는 코드를 구현 하였다.