연산자
연산자
프로그램에서 데이터를 처리하여 결과를 산출하는 과정을 연산이라고 한다.
연산에 사용되는 표시나 기호를 연산자라고 하며, 연산의 대상이 되는 데이터를 피연산자라고 한다.
-
단항 연산자
한 개의 피연산자를 필요로 하는 연산자이다.
> 부호 연산자
양수 및 음수를 표시하는 연산자. (+ 부호 유지, - 부호 변경)
boolean, char 타입을 제외한 기본 타입에 사용할 수 있다.
> 논리 부정 연산자
True를 False로, False를 True로 변경하는 연산자
boolean 타입에만 사용 가능하다.
표현법은 아래와 같다.
논리 부정 연산자
[표현법]
!논리값(true, false)
package com.beyond.operator.practice;
public class A_logicalNegation {
public void method1() {
boolean b1 = true;
boolean b2 = false;
System.out.println("b1 : " + b1);
System.out.println("b1의 부정 : " + !b1);
System.out.println("b1 : " + b1);
System.out.println("b2 : " + b2);
System.out.println("b2의 부정 : " + !b2);
System.out.println("b2 : " + b2);
}
}
> 증감 연산자
피연산자의 값에 1을 증가시키거나 감소시키는 연산자
boolean 타입을 제외한 기본 타입에 사용할 수 있다.
증감 연산자가 피연산자 앞에 있으면 먼저 증감 연산을 수행하고 다음 연산을 수행한다.
증감 연산자가 피연산자 뒤에 있으면 다른 연산을 먼저 수행하고 증감 연산을 수행한다.
증감 연산자의 표현법은 아래와 같다.
증감 연산자
[표현법]
(증감연산자)피연산자; 또는 피연산자(증감연산자);
++ : 피연산자의 값을 1 증가시키는 연산자
-- : 피연산자의 값을 1 감소시키는 연산자
public void method1() {
int number = 10;
// 전위 연산 테스트
System.out.println("전위 연산 적용 전 number의 값 : " + number);
System.out.println("1회 수행 후 값 : " + (++number));
System.out.println("2회 수행 후 값 : " + (++number));
System.out.println("3회 수행 후 값 : " + (++number));
System.out.println("전위 연산 적용 후 number의 값 : " + number);
// 후위 연산 테스트
System.out.println("후위 연산 적용 전 number의 값 : " + number);
System.out.println("1회 수행 후 값 : " + (--number));
System.out.println("2회 수행 후 값 : " + (--number));
System.out.println("3회 수행 후 값 : " + (--number));
System.out.println("전위 연산 적용 후 number의 값 : " + number);
}
public void method2() {
int number1 = 10;
int number2 = 20;
int number3 = 30;
System.out.println(number1++); // 10 / 수행 후 number1 = 11
System.out.println((++number1) + (number2++)); // 12 + 20 / 수행 후 number2 = 21
System.out.println((number1++) + (--number2) + (--number3)); // 12 + 20 + 29 / 수행 후 number1 = 13
System.out.println();
System.out.println("number 1 : " + number1); // 13
System.out.println("number 2 : " + number2); // 20
System.out.println("number 3 : " + number3); // 29
}
증감 연산자는 전위 연산을 진행하느냐, 후위 연산을 진행하느냐에 따라
값이 증감하는 순서가 다르기 때문에 헷갈림에 주의해야 한다.
이항 연산자
두 개의 피연산자를 필요로 하는 연산자
> 산술 연산자
수학의 사칙연산(+, -, *, /)과 나머지 연산(%) 실행
boolean 타입을 제외한 기본 타입에 사용 가능하다.
산술 연산자의 종류는 아래와 같다.
산술 연산자
+ : 더하기
- : 빼기
* : 곱하기
/ : 나누기
% : 나머지
public void method1() {
// 정수의 산술 연산
int number1 = 10;
int number2 = 3;
System.out.printf("%d + %d = %d\n", number1, number2, (number1 + number2));
System.out.printf("%d - %d = %d\n", number1, number2, (number1 - number2));
System.out.printf("%d * %d = %d\n", number1, number2, (number1 * number2));
System.out.printf("%d / %d = %d\n", number1, number2, (number1 / number2));
System.out.printf("%d %% %d = %d\n", number1, number2, (number1 % number2));
System.out.println();
// 문자의 산술 연산
System.out.println((char)('김' + 1));
System.out.println('a' + 'b');
System.out.println();
// 실수의 산술 연산
double dNumber1 = 35.0;
double dNumber2 = 10.0;
System.out.printf("%.1f + %.1f = %.1f\n", dNumber1, dNumber2, dNumber1 + dNumber2);
System.out.printf("%.1f - %.1f = %.1f\n", dNumber1, dNumber2, dNumber1 - dNumber2);
System.out.printf("%.1f * %.1f = %.1f\n", dNumber1, dNumber2, dNumber1 * dNumber2);
System.out.printf("%.1f / %.1f = %.1f\n", dNumber1, dNumber2, dNumber1 / dNumber2);
System.out.printf("%.1f %% %.1f = %.1f\n", dNumber1, dNumber2, dNumber1 % dNumber2);
// 참고
// System.out.println(5 / 0); //
System.out.println(5 / 0.0); // Infinity
// System.out.println(5 % 0); // ArithmeticException
System.out.println(5 % 0.0); // Nan(Not a Number)
System.out.println((5 / 0.0) + 2); // Infinity
System.out.println((5 % 0.0) + 2); // Nan
// 연산 결과가 Infinity인지 검사하는 메소드
System.out.println(Double.isInfinite(5/0.0));
// 연산 결과가 NaN인지 검사하는 메소드
System.out.println(Double.isNaN(5 % 0.0));
}
> 문자열 연결 연산자
문자열에서 + 연산자는 문자열을 서로 연결하는 연산자이다.
피연산자 중에 한쪽이 문자열이면 다른 피연산자를 문자열로 변환하고 서로 연결한다.
> 비교 연산자
피연산자의 대소(>, >=, <, <=) 또는 동등(==, !=)을 비교하는 연산자
대소 비교는 boolean 타입을 제외한 모든 기본 타입에 사용할 수 있고, 동등 비교는 모든 타입에서 사용할 수 있다.
비교 연산의 결과 값은 boolean 타입이다. (True or False)
비교 연산자의 종류는 아래와 같다.
비교 연산자
크기 비교 (>, <, >=, <=)
동등 비교 (==, !=)
public void method1() {
int number1 = 10;
int number2 = 25;
boolean result = false;
result = number1 != number2;
// result = number1 == number2;
// result = number1 > number2;
// result = number1 < number2;
// result = 'A' == 65; // 65 == 65
// result = 3 == 3.0; // 3.0 == 3.0
// 단, 예외가 있다.
// 부동 소수점 방식은 오차가 생길 수 있기 때문에
// 대부분 비교 연산에서는 정수 타입을 사용한다.
// result = 3.0 == 3.0F;
result = 0.1 == 0.1F; // 소수점에 대해서는 오타가 생길 수 있다.
System.out.println("result : " + result);
}
아래는 산술 연산과 비교 연산을 함께 진행한 예제이다.
public void method2() {
/*
* 산술 연산 + 비교 연산
* 사용자에게 입력받은 값은 짝수인지, 홀수인지 판단하기
*/
int number = 0;
boolean result = false;
// 변수 추출 Alt + Shift + l
Scanner scanner = new Scanner(System.in);
System.out.print("임의의 정수를 입력해 주세요. > ");
number = scanner.nextInt();
result = (number % 2) == 0;
System.out.printf("%d은 짝수인가요?, %b\n", number, result);
}
> 논리 연산자
논리 값을 비교하는 연산자 (동등, 크기 비교 X)
논리 연산의 결과 값은 boolean 타입이다. (True or False)
논리 연산자의 종류는 아래와 같다.
논리 연산자
&&(AND, 논리곱)
- 왼쪽, 오른쪽 피연산자 모두 true일 경우 참(true)
||(OR, 논리합)
- 왼쪽, 오른쪽 피연산자 중에 하나라도 true인 경우 참(ture)
public void method1() {
// 사용자가 입력한 정수값이 1부터 100사이의 값인지 확인하기
int number = 0;
boolean result = false;
Scanner scanner = new Scanner(System.in);
System.out.print("임의의 정수를 입력해 주세요. > ");
number = scanner.nextInt();
// 1 <= number <= 100
// result = (1 <= number <= 100); // 1 <= number는 논리값, 논리값 <= 100은 비교 불가 -> 그래서 오류 발생
result = (number >= 1) && (number <= 100);
System.out.printf("%d는 1부터 100사이의 값인가요? %b\n", number, result);
}
public void method2() {
// Short Cut 연산 테스트 / false || true 면 뒤 연산을 계산하지 않음
int number = 10;
boolean result = false;
System.out.println("&& 연산 전의 number의 값 : " + number);
// && 연산자를 기준으로 앞에서 이미 false가 나왔기 때문에 굳이 뒤쪽의 연산은 수행하지 않는다.
result = (number < 5) && (++number > 0);
// result = (number < 5) & (++number >0);
System.out.println("result : " + result);
System.out.println("&& 연산 후의 number의 값 : " + number);
System.out.println();
System.out.println("|| 연산 전의 number의 값 : " + number);
// || 연산자를 기준으로 앞에 이미 true가 나왔기 떄문에 굳이 뒤쪽의 연산을 수행하지 않는다.
result = (number < 20) || (++number > 0);
// result = (number < 20) | (++number > 0);
System.out.println("result : " + result);
System.out.println("|| 연산 후의 number의 값 : " + number);
}
논리 연산자 && 사용 시에 앞 조건에서 이미 False라는 결과가 나왔다면 이미 최종 결과가 False 이기 때문에 굳이 뒤쪽 조건의 연산은 수행하지 않는다.
논리 연산자 || 사용 시에 앞 조건에서 이미 True라는 결과가 나왔다면 이미 최종 결과가 True이기 때문에 굳이 뒤쪽 연산을 수행하지 않는다.
아래는 단순한 실습 문제이다.
/*
* 실습 문제
* 사용자가 입력한 문자 값이 알파벳 대문자인지 확인하기
* 'A' ~ 'Z'까지 코드값으로 65 ~ 90까지의 숫자로 나열되어 있다.
*
* 예시)
* 문자 하나 입력 > f
* 사용자가 입력한 값이 대문자입니까? : false
*/
public void practice() {
char alphabet = '\u0000'; // 초기화
boolean result = false;
Scanner scanner = new Scanner(System.in);
System.out.print("문자 하나 입력 > ");
alphabet = scanner.nextLine().charAt(0);
result = (alphabet >= 'A') && (alphabet <= 'Z');
System.out.printf("사용자가 입력한 값이 대문자입니까? : %b", result);
}
> 대입 연산자
오른쪽 피연산자의 값을 왼쪽 변수에 저장
> 복합 대입 연산자
다른 연산자와 대입 연산자가 결합한 것으로 자기 자신과 연산 후 연산 결과를 자기 자신에게 대입한다.
코드가 간결하고 메모리에서 직접 연산을 수행하여 연산 속도가 빠르다.
증감 연산자와 비슷해 보이지만 증감 연산자는 1씩 증감하지만 복합 대입 연산자는 원하는 값만큼 증감시키고 변수에 저장한다.
public void method1() {
int number = 12;
String str = "Hello";
number += 3; // number = number + 3;
System.out.println("number += 3 은(는) "+ number);
number -= 5; // number = number -5;
System.out.println("number -+ 5 은(는) "+ number);
number *= 6; // number = number * 6;
System.out.println("number *= 6은(는) " + number);
number /= 3; // number = number / 3
System.out.println(("number /= 3 은(는)") + number);
number %= 3; // number = number / 3
System.out.println(("number %= 3 은(는)") + number);
str += " World!"; // str = str + "World!";
System.out.println("str += \"World!\" 은(는) " + str);
}
삼항 연산자
세 개의 피연산자를 필요로 하는 연산자
뒤에서 배우는 if문으로 변경해서 작성 가능, 한 줄에 간단하게 사용하고자 할 때 사용
중첩해서 여러번 사용 가능
삼항 연산자의 표현법은 아래와 같다.
삼항 연산자
[표현법]
조건식 ? 식1 : 식2;
(TRUE - 식1, FALSE - 식2)
만약 조건식이 TRUE라면 식 1을 결과값으로 반환하고, FALSE라면 식 2를 결과값으로 반환한다.
/*
* 사용자에게 입력받은 정수가 양수인지, 음수인지 판별 후 출력하기
*
* 예시)
* 정수값 입력 > 2
* 2은(는) 양수이다.
*
* 정수값 입력 > -3
* -3은(는) 음수이다.
*
* 정수값 입력 > 0
* 0은(는) 0이다.
*/
public void method1() {
int number = 0;
String result = "";
Scanner scanner = new Scanner(System.in);
System.out.print("정수값 입력 > ");
number = scanner.nextInt();
// result = (number > 0) ? "양수이다." : "음수이다.";
result = (number > 0) ? "양수이다." :
(number == 0) ? "0이다." : "음수이다.";
System.out.printf("%d은(는) %s", number, result);
}
아래는 추가 실습 문제들이다.
/*
* 실습 문제 1
*
* 사용자한테 두 개의 정수값을 입력받아서
* 두 정수의 곱셈 결과 100보다 큰 경우 "결과가 100 이상입니다."
* 아닌 경우 "결과가 100 보다 작습니다." 출력
*/
public void practice1() {
int num1 = 0;
int num2 = 0;
String result = "";
Scanner scanner = new Scanner(System.in);
System.out.printf("첫 번째 정수를 입력하세요: ");
num1 = scanner.nextInt();
System.out.printf("두 번째 정수를 입력하세요: ");
num2 = scanner.nextInt();
result = ((num1 * num2) >= 100) ? "결과가 100 이상입니다." : "결과가 100보다 작습니다.";
System.out.printf("두 정수의 곱셈 결과 %s", result);
}
/*
* 실습 문제 2
*
* 사용자한테 문자를 하나 입력받아서
* 입력한 문자가 대문자이면 "알파벳 대문자이다."
* 아닌 경우 "알파벳 대문자가 아니다." 출력
*/
public void practice2() {
String result = "";
char alphabet = '\u0000';
Scanner scanner = new Scanner(System.in);
System.out.printf("알파벳을 입력하세요: ");
alphabet = scanner.nextLine().charAt(0);
result = ((alphabet >= 'A') && (alphabet <= 'Z')) ?
"알파벳이 대문자이다." : "알파벳이 대문자가 아니다.";
System.out.printf("입력한 %s", result);
}
/*
* 실습 문제 3
*
* 두 정수를 입력받고 + 또는 - 를 입력받아서 계산을 출력하라
* 단, + 또는 - 외의 문자를 입력하는 경우 "잘못 입력했습니다." 출력
*
* 예시)
* 첫 번째 수 > 3
* 두 번째 수 > 4
* 연산자 입력(+ 또는 -) > +
*
* 3 + 4 = 7
*/
public void practice3() {
int num1 = 0;
int num2 = 0;
char op;
String result = "";
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 수 > ");
num1 = scanner.nextInt();
System.out.print("두 번째 수 > ");
num2 = scanner.nextInt();
scanner.nextLine(); // 엔터값 비워주기
System.out.print("연산자 입력(+ 또는 -) > ");
op = scanner.nextLine().charAt(0);
result = (op == '+') ? (num1 + " + " + num2 + " = " + (num1 + num2)):
(op != '-') ? "잘못 입력했습니다." : (num1 + " - " + num2 + " = " + (num1 - num2));
System.out.println();
System.out.printf("%s", result);
}
실습 문제 3번 코드를 작성할 때 nextInt()로 정수를 받은 다음 엔터값을 비워주지 않고
연산자 입력에서 nextLine().charAt(0)을 진행해서 계속 에러가 발생했었다.
이 부분은 계속해서 실수할 것 같으니 꼭 잊지말고 엔터값을 비워주도록 하자! -_-