210628 월
연산자(Operator)
<연산자 종류와 우선순위>
-쉬프트, 비트 논리 대입 ⇒ 비트 단위 연산이므로 별로 안 중요함
-단항 연산자(형변환 연산자), 산술 연산자, 비교 연산자, 대입 연산자 ⇒ 비교적 중요
<단항 vs 이항 vs 삼항>
-단항 : 항이 한개이다.
예) (int)a
-이항 : 항이 두개이다.
예) 1+1, a+b
-삼항 : 항이 세개이다.
1) 단항 연산자
(1) 논리 부정 연산자 : !
: 논리 값을 부정하여 반대 값으로 변경
⇒ 제어문을 활용할 때 많이 쓰임
*논리 값 : true, false
*느낌표는 항상 부정할 때 쓴다.
<true, false>
package com.kh.operator;
public class A_LogicalNegation {
public void method1() {
System.out.println("true의 부정 : " + !true);
System.out.println("false의 부정 : " + !false);
boolean b1 = true;
boolean b2 = false;
System.out.println("b1 : " + b1);
System.out.println("!b1 : " + !b1);
System.out.println("b2 : " + b2);
System.out.println("!b2 : " + !b2);
}
}
<답>
true의 부정 : false
false의 부정 : true
b1 : true
!b1 : false
b2 : false
!b2 : true
논리 부정 연산자는 boolean하고 함께 쓴다. Why? True or False기 때문
(2) 증감 연산자 : ++, - -
: 피연산자의 값에 1을 더하거나 빼는 연산자로 위치에 따라 결과 값이 다르게 나타남
1> 전위 연산 : 먼저 연산 후 다른 연산 실행
2> 후위 연산 : 다른 연산 우선 실행 후 연산(이 연산을 마지막으로 실행)
package com.kh.operator;
public class B_InDecrease {
public void method1() {
//1) 전위 연산 : ++ 값 => 먼저 연산
int a = 10;
int b = ++a;
System.out.println("a : " + a + ", b : " + b);
//a : 11, b : 11
//2) 후위 연산 : 값 ++ => 마지막에 연산
//(1)
int c = 10;
int d = c++;
System.out.println("c : " + c + ", d : " + d);
//c : 11, d : 10
//(2)
int num1 = 20;
int result = num1++ * 3;
System.out.println("result : " + result);
// 20 * 3 = 60
System.out.println("num1 : " + num1);
// 21
}
public void method2() {
int a = 10;
int b = 20;
int c = 30;
System.out.println(a++);
//a : 10
//그러나 시스템 상에서는 11로 변경되어 있다.
System.out.println((++a) + (b++));
//a: 12 + b : 20 = > 12 + 20 = 31
//그러나 시스템 상으로 비는 21로 변경됨
//a : 12, b : 21
System.out.println((a++) + (--b) + (--c));
//a : 12 + b : 20(=21-1) + c : 29(=30-1) = 61
//그러나 a는 13으로 변경되었다.
System.out.println("a : " + a); // 13
System.out.println("b : " + b); // 20
System.out.println("c : " + c); // 29
2) 이항 연산자
(1) 산술 연산자 : 일반 수학과 동일한 연산 방법, 우선순위.
*연산 종류
+, -, *, /, % 등
% (모듈러)
: 나누기의 나머지 값을 구하는 연산. 즉, 나머지를 구하는 연산자이다.
/
:몫을 구하는 연산자이다.
+-가 순위가 낮고 */%가 순위가 높다.(연산 순서상)
package com.kh.operator;
public class C_Arithmetic {
public void method1() {
int num1 = 10;
int num2 = 3;
//System.out.println("num1 + num2 : " + num1 + num2);
// => 이렇게 쓰면 숫자가 문자열에 흡수 되어서 103이 되어 버린다. 틀린 식
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);
}
}
<답>
num1 + num2 : 13
num1 - num2 : 7
num1 * num2 : 30
num1 / num2 : 3
num1 % num2 : 1
-모듈러 %는 조건문에서 짝홀 판별 등에서 사용 가능
예) 값 % 2 = 0(짝), 값 % 2 = 1(홀)
-배수 판별에도 자주 사용 가능
예) 5의 배수인가? ⇒ 값 % 5가 0인지 확인
(2) 비교 연산자
: 데이터가 같은지, 다른지 비교할 때 쓰이며 항상 논리 값(true, false)이 결과 값임
-기본형 boolean과 참조형을 제외하고 나머지 자료형에 모두 사용 가능
예) “ABC”, “BCD” 등 사용 불가
a == b : a와 b가 같으면 true
a! = b : a와 b가 다르면 true / 같지 않다는 뜻. 헷갈림 주의!
package com.kh.operator;
public class D_Comparison {
public void method1() {
//비교 연산자(관계 연산자)
// : 두 값을 비교하는 연산자
// 조건을 만족하는 true, 만족하지 않으면 false를 반환함
int a = 10;
int b = 25;
boolean result1 = (a==b);
boolean result2 = (a <= b);
boolean result3 = (a > b);
System.out.println("result1 : " + result1);
System.out.println("result2 : " + result2);
System.out.println("result3 + " + result3);
System.out.println("a는 짝수인가 : " + (a % 2 == 0));
System.out.println("b는 홀수인가 : " + (b % 2 == 1));
System.out.println("a는 짝수인가 : " + (a % 2 != 1));
System.out.println("b는 홀수인가 : " + (b % 2 != 0));
}
}
<답>
a는 짝수인가 : true
b는 홀수인가 : true
a는 짝수인가 : true
b는 홀수인가 : true
(3) 논리 연산자
: 논리 값 두 개를 비교하는 연산자
&& : 두 피연산자가 모두 true일 때 true 반환(AND)
|| : 두 피연산자 중 하나만 true여도 true 반환(OR)
*컴퓨터는 순차적으로 연산함. 그래서 a값에 대해서 알면 b값까지 알 필요 없음(추정 불가능하다는 뜻)
package com.kh.operator;
import java.util.Scanner;
public class E_Logical {
public void method1() {
//사용자가 입력한 정수 값이 1부터 100사이의 값인지 확인
Scanner sc = new Scanner(System.in);
System.out.print("정수 하나 입력 : ");
int num = sc.nextInt();
//boolean isTrue = 1 <= num <= 100; 프로그램에서 이렇게는 안됨
boolean isTrue = (num >= 1) && (num <= 100);
System.out.println("사용자가 입력한 값이 1부터 100사이입니까 : " + isTrue);
// && : 두 개의 조건이 모두 true여야 &&의 연산의 결과 값이 true
// 하나라도 조건이 false가 된다면 && 연산의 결과값은 false
}
public void method2() {
//사용자가 입력한 문자 값이 영어 대문자이지 확인하기
Scanner sc = new Scanner(System.in);
System.out.print("문자 하나 입력 : ");
char ch = sc.next().charAt(0);
//boolean isTrue = (ch >= 65) && (ch <= 90); => 이것도 가능
boolean isTrue = (ch >= 'A') && (ch <= 'Z');
System.out.println("사용자가 입력한 값이 대문자입니까 : " + isTrue);
}
public void method3() {
//사용자에게 프로그램 종료 여부 묻기
Scanner sc = new Scanner(System.in);
System.out.print("계속 하시려면 y 또는 Y를 입력하세요 : ");
char ch = sc.next().charAt(0);
boolean isTrue = (ch == 'y') || (ch == 'Y');
System.out.println("사용자가 입력한 값이 y 또는 Y입니까 : " + isTrue);
}
public void method4() {
int num = 10;
System.out.println("&& 연산 전의 num 값 : " + num);
boolean result1 = false && ++num > 0;
System.out.println("result1 : " + result1);
System.out.println("&& 연산 후의 num 값 : " + num);
// && 연산자 앞에 이미 false가 있고 and로 연결되므로 뒤쪽의 연산은 실행되지 않음
// => Dead Code 라는 경고 확인 가능
System.out.println();
boolean result2 = true || ++num < 0;
System.out.println("result2 : " + result2);
System.out.println("|| 연산 후의 num 값 : " + num);
// || 연산자 앞에 이미 true가 있으므로 뒤쪽의 연산은 실행되지 앟음
// => Dead Code라는 경고 확인 가능
}
}
(4) 복합 대입 연산자
: 다른 연산자와 대입 연산자가 결합한 것으로 자기 자신과 연산 후 연산 결과를 자기 자신에게 누적 대입
-증감 연산과 비슷해 보이지만 증감 연산자(++, --)는 1씩 증가
-대입 연산자는 원하는 값을 증가시키고 그 변수에 저장 가능
*왼쪽의 식을 이용하면 더 빠른 처리가 이뤄진다.
package com.kh.operator;
public class F_Compound {
public void method1() {
//복합 대입 연산자
// : 산술 연산자와 대입 연산자를 함께 사용하는 연산자
// 연산 처리 속도가 훨씬 빠르므로 사용 권장
int num = 12;
//num 값 3 증가
//num = num + 3; => 이 식도 맞음
num += 3;
//num 값 5 감소
num -= 5;
//num 값 6배 증가
num *= 6;
//num 값 2배 감소
num /= 2;
// num 값 4로 나눈 나머지
num %= 4;
}
}
3) 삼항 연산자
형식) 조건식 ? 식1 : 식2 ;
참일 경우 식1, 거짓일 경우 식2 수행
예)
int result1 = a > b ? a++ : b--;
int result2 = a < b ? a ++ : ( b == 0 ? a-- : b++)
*삼항 연산자 안에 삼항 연산자를 중첩하여 쓰는 것도 가능
**간결하게 처리하는 것이 좋다. 너무 중첩하여 쓰는 것은 가독성이 별로임.
package com.kh.operator;
import java.util.Scanner;
public class G_Triple {
public void method1() {
//입력 받은 정수가 양수인지 아닌지 판별 후 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수 값 입력 : ");
int num = sc.nextInt();
//조건식 ? 조건이 참일 경우의 식1 : 조건이 거짓일 경우의 식2;
String result = num > 0 ? "양수이다" : "음수이다" ;
System.out.println(num + "은 " + result);
}
public void method2() {
//사용자가 입력한 정수 값이 홀수인지 짝수인지 판별 후 출력
Scanner sc = new Scanner(System.in);
System.out.print("정수 값 입력 : ");
int num = sc.nextInt();
String result = num % 2 == 0 ? "짝수이다" : "홀수이다";
System.out.println(num + "은 " + result);
}
public void method3() {
//사용자에게 2개의 정수 값 입력 받아
// 두 정수 값의 곱셈 결과가 100보다 이상인 경우 "결과가 100이상입니다"
//크지 않은 경우 "결과가 100보다 작습니다" 출력
Scanner sc = new Scanner(System.in);
System.out.print("첫번째 정수값 입력 : ");
int num = sc.nextInt();
System.out.print("두번째 정수값 입력 : ");
int num2 = sc.nextInt();
String result = num * num2 >= 100 ? "결과가 100이상입니다"
: "결과가 100보다 작습니다";
System.out.println(result);
}
public void method4() {
//사용자가 입력한 영문자가 대문자인지 판별 후 출력
Scanner sc = new Scanner(System.in);
System.out.print("영문자 입력 : ");
char ch = sc.next().charAt(0);
String result = (ch >= 'A' && ch <= 'Z') ? "대문자이다" : "대문자가 아니다";
System.out.println(ch + "는" + result);
}
public void method5() {
// 삼항 연산자 중첩 사용
// 입력 받은 정수가 양수인지 음수인지 0인지 판별
Scanner sc = new Scanner(System.in);
System.out.print("정수 값 입력 : ");
int num = sc.nextInt();
String result = num > 0 ? "양수이다" : (num != 0 ? "음수이다" : "0이다");
System.out.println(num + "은 " + result);
}
public void method6() {
//두 수를 입력 받고 + 또는 -를 입력 받아 알맞은 계산 결과 출력
//단, + 또는 -외의 다른 문자를 입력하는 경우 "잘못 입력하셨습니다" 출력
Scanner sc = new Scanner(System.in);
System.out.print("첫번째 수 : ");
int num1 = sc.nextInt();
System.out.print("두번째 수 : ");
int num2 = sc.nextInt();
System.out.print("연산자 입력(+ or -) : ");
char op = sc.next().charAt(0);
String result = op == '+' ? num1 + num2 + "" :
(op == '-' ? num1 - num2 + "" : "잘못 입력하셨습니다");
System.out.println("결과 : " + result);
}
}
<명령어&단어 정리>
*negation : 부정(명제)라는 뜻
*src 기본 값에 바로 클래스를 넣지 않는다. 하위를 만든다.
*ctrl + f11 : console창
'웹개발 수업 > JAVA' 카테고리의 다른 글
[Day +6]반복문 (0) | 2021.07.11 |
---|---|
[Day +5]조건문 (0) | 2021.07.11 |
[Day +3] 선언과 초기화, 형변환, 데이터 오버플로우, printf, escape문자 (0) | 2021.07.11 |
[Day +2] 이클립스 기본 설정, 변수, 자료형, Scanner 사용법 (0) | 2021.07.11 |
[Day +1]프로그래밍 정의, 자바 정의 (0) | 2021.07.11 |