연산자 (Operator) 알아보기
국비지원수업 8일차
1. 연산자(Operator) 종류와 우선순위
연산자의 종류
- 산술 연산자 : + - * / %
- 관계(비교) 연산자 : >, >=, <, <=, ==, !=
- 논리 연산자 : && (AND), || (OR), ! (NOT)
- 대입연산 : =
- 삼항연산 : ?
- ++, --, +=, -=, *=, /=, %=
연산자의 우선순위
1. () 괄호
2. 피연산자 앞에 있는 ++, -- (전위연산자)
3. 곱셈(*), 나눗셈(/), 나머지(%)
4. 덧셈(+), 뺄셈(-)
5. 관계 연산 ( < > == != )
6. 논리 연산 ( && || ! )
2. 산술 연산자
산술 연산자 : +, -, *, /, %
int n1 = 25, n2 = 13, result1;
double result2;
char op = '+';
result1 = n1 + n2;
System.out.printf("%d %c %d = %d\n", n1, op, n2, result1);
op = '-';
result1 = n1 - n2;
System.out.printf("%d %c %d = %d\n", n1, op, n2, result1);
op = '*';
result1 = n1 * n2;
System.out.printf("%d %c %d = %d\n", n1, op, n2, result1);
op = '÷';
result2 = n1 / (double)n2;
System.out.printf("%d %c %d = %.1f\n", n1, op, n2, result2);
op = '%';
result1 = n1 % n2; // 피젯수를 젯수로 나눈 나머지를 구하는 연산
System.out.printf("%d %c %d = %d\n", n1, op, n2, result1);
2-1. 코드 간결화 (+=, -=, *=, /=, %=)
- a = n + 10; : n + 10을 계산하고 결과를 a에 저장 -> 불필요하게 변수를 만들고 사용해야 함
n += 10;
1. 연산 당시의 n값(기존의 n값)으로 계산
2. 기존의 n값을 지운 뒤 같은 변수(n)에 저장
int n = 50;
System.out.println("n 변수의 현재값 : " + n);
n = n + 10; // n += 10;
System.out.println("n = n + 10 -> n : " + n);
n = n - 10; // n -= 10;
System.out.println("n = n - 10 -> n : " + n);
n = n * 10; // n *= 10;
System.out.println("n = n * 10 -> n : " + n);
n = n / 10; // n /= 10;
System.out.println("n = n / 10 -> n : " + n);
n = n % 7; // n %= 7;
System.out.println("n = n % 7 -> n : " + n);
2-2. 전위 연산자(++), 후위 연산자(--)
++n : 전위 연산자 -> 다른 연산 진행 전 변환
n++ : 후위 연산자 -> 다른 연산 진행 후 변환
- n = n + 1; 은 증가값이 1인 경우에 한해 n++; 처럼 사용 가능
아래 예시처럼 단항 연산일 경우 ++ --가 앞에 있든 뒤에 있든 결과는 동일
n = 10;
System.out.println("n 변수의 현재값 : " + n);
n = n + 1;
System.out.println("n -> " + n);
n++;
System.out.println("n++ -> " + n);
++n;
System.out.println("++n -> " + n);
n--;
System.out.println("n-- -> " + n);
--n;
System.out.println("--n -> " + n);
다른 연산과 섞여있을 경우 ++, -- 연산의 위치 (앞 or 뒤)에 따라 결과가 차이남
n = 10;
int k = n++; // n값을 k변수에 대입하는 과정에서 '1을 먼저 증가' or 'k에 대입하고 증가'?
System.out.println("k : " + k);
System.out.println("n : " + n);
2-3. 활용 예시
Scanner scan = new Scanner(System.in);
// 갖고 있는 사과의 총 개수 입력
System.out.print("갖고 있는 사과의 총 개수 : ");
int apple = scan.nextInt(); // 총 사과 개수
// 상자 하나에 담길 사과의 개수 입력
System.out.print("상자 하나에 담길 사과의 개수 : ");
int applePerOneBox = scan.nextInt(); // 한 박스에 포장할 수 있는 사과 개수
// 입력 조건으로 포장했을 때, 포장된 박스 개수, 남은 사과 개수 출력
int boxQuantity; // 포장된 사과박스 개수
int theRest; // 남은 사과 개수
boxQuantity = apple / applePerOneBox;
theRest = apple % applePerOneBox;
System.out.printf("포장된 박스 개수 : %d\n", boxQuantity);
System.out.printf("남은 사과 개수 : %d\n", theRest);
3. 관계 연산자 (비교 연산자)
좌항기준 > (초과), < (미만), >= (이상), <= (이하), == (같다), != (같지 않다)
- 좌항과 우항의 크기를 비교하여 true / false 값이 결과가 되는 연산
- 관계식이 올바른 경우 true, 관계식이 틀린 경우 false
3-1. 숫자의 비교
int n1 = 10;
int n2 = 5;
boolean result;
// 10은 5보다 크다 --> true
result = n1 > n2;
System.out.printf("%d은(는) %d보다 크다 -> %b\n", n1, n2, result);
// 10은 5보다 작다 --> false
result = n1 < n2;
System.out.printf("%d은(는) %d보다 작다 -> %b\n", n1, n2, result);
// 10은 5보다 크거나 같다 --> true
result = n1 >= n2;
System.out.printf("%d은(는) %d보다 크거나 같다 -> %b\n", n1, n2, result);
// 10은 5보다 작거나 같다 --> false
result = n1 <= n2;
System.out.printf("%d은(는) %d보다 작거나 같다 -> %b\n", n1, n2, result);
// 10은 5보다 같다 --> false
result = n1 == n2;
System.out.printf("%d은(는) %d와 같다 -> %b\n", n1, n2, result);
// 10은 5보다 같지 않다 --> true
result = n1 > n2;
System.out.printf("%d은(는) %d와 같지 않다 -> %b\n", n1, n2, result);
3-2. 문자(char)의 비교
아스키코드 값을 반영하여 비교
char c1 = 'A', c2 = 'B';
boolean result;
result = c1 > c2;
System.out.printf("%c은(는) %c보다 크다 -> %b\n", c1, c2, result);
result = c1 < c2;
System.out.printf("%c은(는) %c보다 작다 -> %b\n", c1, c2, result);
result = 'C' == 'C';
System.out.printf("%c은(는) %c와 같다 -> %b\n", 'C', 'C', result);
result = 'C' != 'c';
System.out.printf("%c은(는) %c와 다르다 -> %b\n", 'C', 'c', result);
3-3. 문자열(String)의 비교
- String 데이터는 일반 기본 자료형과 비교했을 때 구조, 비교 방법이 다름
- String을 >, <, ==, != 과 같은 관계 연산자로 비교하는 것은 부적절
String s1 = "1234";
String s2 = "987";
boolean result;
// 에러 The operator > is undefined for the argument type(s) java.lang.String, java.lang.String
result = s1 > s2;
String 변수의 특징
- String으로 만들 변수는 대입할 문자열(여러 글자)을 저장하지 않음
- 변수에는 실제 데이터가 저장된 위치 정보만 저장, 실제 데이터는 별도의 공간에 저장
* 자바에서는 '참조 변수'(위치 정보만 저장한 변수), C언어에서는 '포인터'라고 함
- 글자 개수에 제한이 없어서 이러한 구조를 갖음
3-3-1. compareTo()
compareTo() 의 비교 원리
- 문자의 아스키코드 값을 이용하여 앞에 문자에서 뒤에 문자를 뺄셈
- String의 크다 작다를 판단
- compareTo 도구의 결과는 정수
- compareTo의 결과가 양수이면, 앞에 String이 크다
- compareTo의 결과가 음수이면, 뒤에 String이 크다
- compareTo의 결과가 0이면, 둘은 같다
String s1 = "1234";
String s2 = "987";
int r = s1.compareTo(s2);
System.out.printf("%s compareTo %s => %d\n", s1, s2, r);
r = s2.compareTo(s1);
System.out.printf("%s compareTo %s => %d\n", s2, s1, r);
s2 = new String("1234");
r = s2.compareTo(s1);
System.out.printf("%s compareTo %s => %d\n", s2, s1, r);
3-3-2. equals()
- String의 같다 다르다를 판단
- equals() 도구의 결과는 true / false
String s1 = "1234";
String s2 = "987";
boolean result;
result = s1.equals(s2);
System.out.printf("%s equals %s => %b\n", s1, s2, result);
3-4. 예시 (홀수/짝수 판별)
Scanner scan = new Scanner(System.in);
// 정수 하나를 입력 받기
System.out.print("정수 하나를 입력하세요 : ");
int n = scan.nextInt();
boolean result;
result = ((n % 2) == 0);
// 출력 : 입력받은 정수는 짝수입니다 -> ture / false 중 하나 출력
System.out.println("입력받은 정수는 짝수입니다 -> " + result);
4. 논리 연산자
&& (AND), || (OR), ! (NOT)
- 둘 이상의 관계(비교) 연산식 결과값(true / false) 또는 boolean 값을 대상으로 연산하여 boolean 값을 결과로 얻는 연산
- 피연산자 : boolean, 연산의 결과 : boolean
4-1. && (AND)
양쪽 두 항이 모두 true 이어야 결과가 true, 둘 중 하나가 false 이면 결과는 false
- true && true -> true
- true && false -> false
- false && true -> false
- false && false -> false
boolean b1, b2, b3;
int a = 40; // 40을 사용자로부터 입력 받음
// 입력 받은 변수의 값이 30 이상이면서 100 이하인 경우인지 판단
b1 = (a >= 30); // true
b2 = (a <= 100); // true
b3 = b1 && b2;
System.out.println("a >= 30 이면서 a <= 100 : " + b3);
/*
b3 = (a>=30) && (a<=100); // 정상실행
b3 = (30 <= a <= 100); // 잘못된 표기
*/
4-2. || (OR)
양쪽 두 항이 모두 false 이어야 결과가 false, 둘 중 하나가 true 이면 결과는 true
- true || true -> true
- true || false -> true
- false || true -> true
- false || false -> false
boolean b1, b2, b3;
int a = 40; // 40을 사용자로부터 입력 받음
b1 = (a > 70);
b2 = (a < 40);
b3 = b1 || b2;
System.out.println("a > 70 이거나 a < 40 : " + b3);
// b1, b2 대신 연산식을 대입하여 한 번에 처리 가능
b3 = (a > 70) || (a < 40);
System.out.println("a > 70 이거나 a < 40 : " + b3);
4-3. ! (NOT)
단항연산 - 피연산자의 true / false 값을 반대로 바꾸는 연산
- !true -> false
- !false -> true
4-4. 예시 (윤년)
Scanner scan = new Scanner(System.in);
System.out.print("년도를 입력하세요 : ");
int year = scan.nextInt();
boolean result;
// 입력 받은 년도가 윤년이면 true, 평년이면 false를 출력
result = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
System.out.printf("입력한 년도 %d년은 윤년? %b", year, result);
'Backend > Java' 카테고리의 다른 글
[JAVA] 클래스 생성자(Constructor) (0) | 2024.10.14 |
---|---|
[JAVA] 클래스(Class) 생성과 사용 (0) | 2024.10.07 |
[JAVA] 메소드 (Method) (0) | 2024.09.27 |
[JAVA] 배열 (Array), 2차원 배열 (0) | 2024.09.27 |
[JAVA] System.out.printf() (0) | 2024.09.24 |