연산자는 필요로 하는 피연산자의 수에 따라 단항, 이항, 삼항 연산자로 구분된다.
단항 연산자: ++x;
이항 연산자: x + y;
삼항 연산자: (sum > 90) ? "A" : "B"
단항 연산자는 피연산자가 단 하나뿐인 연산자를 말한다.
부호 연산자(+, -), 증감연산자(++, --), 논리 부정 연산자(!)가 있다.
부호연산자
부호연산자는 양수 및 음수를 표시하고 boolean 타입과 char 타입을 제외한 나머지 기본 타입에 사용할 수 있다.
주의할 점은 부호 연산자의 결과가 int타입이기 때문에 byte 타입 변수를 부호 연산하면 int타입으로 변환된다.
byte b = 100;
byte result = -b // int타입으로 변환되므로 컴파일오류가 뜬다
package chapter3_2;
public class SignOperatorExample {
public static void main(String[] args) {
int x = -100;
int result1 = +x;
int result2 = -x;
System.out.println("result1= " + result1);
System.out.println("result2= " + result2);
byte b = 100;
// byte result3 = -b; byte 타입 값을 부호연산하면 int로 변환되기 때문에 byte에 담을 수 없다.
int result3 = -b;
System.out.println("result3 = " + result3);
}
}
/* 실행결과
result1 = -100
result2 = 100
result3 = -100
*/
증감 연산자(++, --)
package chapter3_2;
public class IncreaseDecreaseOperatorExample {
public static void main(String[] args) {
int x = 10;
int y = 10;
int z;
System.out.println("------------------------");
x++;
++x;
System.out.println("x= " + x);
System.out.println("------------------------");
y--;
--y;
System.out.println("y= " + y);
System.out.println("------------------------");
z = x++;
System.out.println("z= " + z);
System.out.println("x= " + x);
System.out.println("------------------------");
z = ++x;
System.out.println("z= " + z);
System.out.println("x= " + x);
System.out.println("------------------------");
z = ++x + y++;
System.out.println("z= " + z);
System.out.println("x= " + x);
System.out.println("y= " + y);
}
}
/* 실행결과
------------------------
x= 12
------------------------
y= 8
------------------------
z= 12
x= 13
------------------------
z= 14
x= 14
------------------------
z= 23
x= 15
y= 9
*/
증감연산자가 피연산자 뒤에 있으면 연산을 수행한 후에 값을 증가시키거나 감소시키고
앞에 붙어있으면 값을 증가시키거나 감소시킨 후 연산을 수행한다.
논리 부정 연산자(!)
논리 부정 연산자는 true를 false로 false를 true로 변경하기 때문에 boolean 타입에만 사용할 수 있다.
논리 부정 연산자는 조건문과 제어문에서 조건식의 값을 부정하도록 해서 실행 흐름을 제어할 때 주로 사용된다.
또한 두 가지 상태를 번갈아가며 변경하는 토글 기능을 구현할 때도 사용된다.
package chapter3_2;
public class DenyLogicOperatorExample {
public static void main(String[] args) {
boolean play = true;
System.out.println(play);
play = !play;
System.out.println(play);
play = !play;
System.out.println(play);
}
}
/* 실행결과
true
false
true
*/
산술 연산자(+, -, *, /, %)
산술연산자의 특징은 피연산자들의 타입이 동일하지 않을 경우 다음과 같은 규칙을 적용해서 피연산자들의 타입을 일치시킨 후 연산을 수행한다.
1. 피연산자들이 byte,short,char타입일 경우 모두 int타입으로 변환된 후에 연산을 수행한다.
byte + byte -> int + int = int
2. 피연산자들이 모두 정수 타입이고 long 타입이 포함되어 있을 경우, 모두 long 타입으로 변환된 후 연산을 수행한다.
int + long -> long + long = long
3. 피연산자 중 실수타입(float, double)이 있을 경우 허용 범위가 큰 실수 타입으로 변환된 후 연산을 수행한다.
int + double -> double + double = double
1번 예제
byte byte1 = 1;
byte byte2 = 1;
byte byte3 = byte1 + byte2; // 컴파일 에러남
int result3 = byte1 + byte2 // 올바른 코딩
3번 예제
int int1 = 10;
int int2 = 4;
int result2 = int1/ int2;
double result3 = int1/ int2; // 컴파일 오류
// 올바른 코딩
double result3 = (int1 *0.1) / int2;
double result3 = (double) int1/ int2;
double result3 = int1/ (double)int2;
package chapter3_2;
public class ArithmeticOperatorExample {
public static void main(String[] args) {
int v1 = 5;
int v2 = 2;
int result1 = v1 + v2;
System.out.println("reslt1= " + result1);
int result2 = v1 - v2;
System.out.println("reslt2= " + result2);
int result3 = v1 * v2;
System.out.println("reslt3= " + result3);
int result4 = v1 / v2;
System.out.println("reslt4= " + result4);
int result5 = v1 % v2;
System.out.println("reslt5= " + result5);
double result6 = (double) v1 / v2;
System.out.println("reslt6= " + result6);
}
}
/* 실행결과
reslt1= 7
reslt2= 3
reslt3= 10
reslt4= 2
reslt5= 1
reslt6= 2.5
*/
char 타입도 정수 타입이므로 산술연산이 가능하다.
char 타입의 산술 연산
package chapter3_2;
public class CharOperatorExample {
public static void main(String[] args) {
char c1 = 'A' + 1;
char c2 = 'A';
char c3 = (char) (c2 + 1);
// char c3 = c2 +1 -- char 변수가 산술연산에 사용되면 int 타입으로 변환된다.
System.out.println("c1: " + c1);
System.out.println("c2: " + c2);
System.out.println("c3: " + c3);
}
}
/* 실행결과
c1: B
c2: A
c3: B
*/
'A' + 1은 리터럴 문자 'A'에 1을 더한 것인데 A는 65라는 유니코드를 가지므로 'A' + 1 =66이 된다.
하지만 연산결과를 char타입에 저장하기 위해서는 강제 타입 변환을 해야한다.
char c3 = (char)(c2 + 1);
문자열 결합 연산자 +
문자열 결합 연산자인 + 는 문자열을 서로 결합하는 연산자다.
산술연산자인지 문자열 결합 연산자인지 판단이 힘든 경우가 있다.
JDK + 6.0 = JDK6.0
JDK라는 문자열과 숫자가 합쳐져 JDK6.0이라는 문자열이 만들어지게 된다.
하지만
3+3.0+JDK =6.0JDK
앞의 숫자가 계산되어 6.0이 되고 뒤에 JDK가 결합되어 6.0JDK가 된다.
결합 순서에 따라 다른 결과가 나올 수 있으니 주의해야 한다.
package chapter3_2;
public class StringConcatExample {
public static void main(String[] args) {
String str1 = "JDK" + 6.0;
String str2 = str1 + " 특징";
System.out.println(str2);
String str3 = "JDK" + 3 + 3.0;
String str4 = 3 + 3.0 + "JDK";
System.out.println(str3);
System.out.println(str4);
}
}
/* 실행결과
JDK6.0 특징
JDK33.0
6.0JDK
*/
비교 연산자 <, <= , >=, ==, !=
비교연산자는 boolean타입을 제외한 기본 타입에서 사용할 수 있고 동등 연산자는 모든 타입에서 사용할 수 있다
구분 | 연산식 | 설명 | ||
동등비교 | 피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
피연산자1 | !== | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | |
크기비교 | 피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | |
피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
만약 피 연산자가 char타입이면 유니코드 값으로 비교 연산을 수행한다.
('A' < 'B') -> (65 < 66)
package chapter3_2;
public class CompareOperatorExample {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
boolean result1 = (num1 == num2);
boolean result2 = (num1 != num2);
boolean result3 = (num1 <= num2);
System.out.println("result1= " + result1);
System.out.println("result2= " + result2);
System.out.println("result3= " + result3);
char char1 = 'A';
char char2 = 'B';
boolean result4 = (char1 < char2);
System.out.println("result4= " + result4);
}
}
/* 실행결과
result1= true
result2= false
result3= true
result4= true
*/
비교 연산자에서도 연산을 수행하기 전에 피연산자로 타입을 일치시킨다.
문자가 유니코드로 변환되어 int 타입으로 비교를 하게 되는데
0.1 == 0.1f
의 연산에서는 비교연산이 되지 않는다.
이유는 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할 수 없기 때문이다.
0.1f는 근사값으로 표현되기 때문에 0.1보다 큰 값이 되어버린다.
따라서 피연산자를 모두 float타입으로 변환해서 비교하거나 정수타입으로 변환해서 비교해야 한다.
package chapter3_2;
public class CompareOperatorExample2 {
public static void main(String[] args) {
int v2 = 1;
double v3 = 1.0;
System.out.println(v2 == v3); // true
double v4 = 0.1;
float v5 = 0.1f;
System.out.println(v4 == v5); // false
System.out.println((float) v4 == v5); //true
}
}
/* 실행결과
true
false
true
*/
String 변수비교
String 문자열을 비교할 때에는 대소 비교 연산자 (<,>,<=,>=)를 사용할 수 없으니 (==, !=) 처럼 동등 비교 연산자는 사용할 수 있다.
하지만 문자열이 가튼지 다른지를 비교하는 용도로는 사용되지 않는다.
기본타입의 변수의 값을 비교할 때와 달리 문자열을 비교할 때에는 equals()메소드를 사용해야 한다.
String strVar1 = "야채";
String strVar2 = "야채";
System.out.println(strVar1.equals(strVar2)); // true
System.out.println(!strVar1.equals(strVar2)); // false
논리 연산자 (&&, ||, &, ^, !)
논리 연산자의 피연산자는 boolean타입만 사용할 수 있다
구분 | 연산식 | 설명 |
AND | && | 피연산자 모두가 true일 경우에만 결과가 true |
OR | || | 피연산자 중 하나라도 true이면 결과는 true / 둘다 false일 경우에도 false |
XOR | ^ | 피연산자 중 하나는 true 다른 하나는 false일 경우에만 true |
NOT | ! | 피연산자의 논리값을 바꿈 true->false, false->true |
&&와 &은 산출결과가 같지만 연산과정이 다르다.
&는 피연산자 모두를 평가해서 산출결과를 낸다. 하지만
&&는 앞에가 false라면 바로 false라는 결과를 산출하기 때문에 더 효율적으로 동작한다.
이는 |와 ||도 마찬가지이다.
package chapter3_2;
public class LogicalOperatorExample {
public static void main(String[] args) {
int charCode = 'A';
if( (charCode >=65) & (charCode <= 90)){
System.out.println("대문자군요");
}
if ((charCode >= 97) && (charCode <= 122)) {
System.out.println("소문자군요");
}
if ((charCode < 47) && !(charCode > 57)) {
System.out.println("0~9 숫자군요");
}
int value = 6;
if ((value % 2 == 0) | (value % 3 == 0)) {
System.out.println("2 또는 3의 배수군요");
}
if ((value % 2 == 0) || (value % 3 == 0)) {
System.out.println("2 또는 3의 배수군요");
}
}
}
/*
대문자군요
2 또는 3의 배수군요
2 또는 3의 배수군요
*/
대입 연산자(=, +=, -=, *=, /=, %=)
대입 연산자는 오른쪽 피 연산자의 값을 왼쪽 피 연샂나인 변수에 저장합니다.
a = a+1 -> a += 1
a = a*2 -> a *= 2
대입연산자는 모든 연산자들 중에서 가장 낮은 연산 순위를 가지고 있기 때문에 제일 마지막에 연산된다.
package chapter3_2;
public class AssignmentOperatorExample {
public static void main(String[] args) {
int result = 0;
result += 10;
System.out.println("result= " + result);
result -= 5;
System.out.println("result= " + result);
result *= 3;
System.out.println("result= " + result);
result /= 5;
System.out.println("result= " + result);
result %= 3;
System.out.println("result= " + result);
}
}
/* 실행결과
result= 10
result= 5
result= 15
result= 3
result= 0
*/
삼항 연산자
삼항 연산자는 3개의 피연산자를 필요로 하는 연산자를 말한다.
조건식 ? 값 또는 연산식(1) : 값 또는 연산식(2)
조건식이 true인 경우 연산식1번을 실행
조건식이 false인 경우 연산식2번을 실행
상항 연산자를 사용하면 코드를 간단하게 작성하는 것이 가능하다.
int score = 95;
char grade;
if(score > 90){
grade = 'A';
} else {
grade = 'B';
}
위의 코드를 삼항 연산자를 사용해서 효율적으로 작성할 수 있다.
int score = 95;
char grade = (score > 90) ? 'A' : 'B';
실행결과는 같다.
package chapter3_2;
public class ConditinalOperatorExample {
public static void main(String[] args) {
int score = 85;
char grade = (score > 90) ? 'A' : ((score > 80) ? 'B' : 'C');
System.out.println(score + "점은 " +grade+ "등급입니다.");
}
}
/* 실행결과
85점은 B등급입니다.
*/
확인문제
1. 다음 코드에서 컴파일에러가 발생하는 위치와 이유를 설명하시오.
package chapter3_2;
public class Quiz1 {
public static void main(String[] args) {
byte b = 5;
// b = -b; byte를 음수변환하면 int형으로 바뀐다 byte타입인 b에 -b를 저장할 수 없다.
// int result = 10 / b; // b를 -b로 바꿔준다.
int result = 10 / -b;
System.out.println(result);
}
}
2. 다음 코드를 실행했을 때 출력 결과는?
package chapter3_2;
public class Quiz2 {
public static void main(String[] args) {
int x = 10;
int y = 20;
int z = (++x) + (y--); 11 + 20 // y는 연산이 끝난 후에 -1된다.
System.out.println(z);
}
}
/* 실행결과
31
*/
3. stop이 true일 때 반복을 멈추고 싶다. while문으로 작성하라
package chapter3_2;
public class Quiz3 {
public static void main(String[] args) {
boolean stop = true;
while (!stop) {
System.out.println("작동중입니다."); // stop이 false일 때 내용이 반복된다.
}
}
}
4. 543자루의 연필은 30명의 학생들에게 똑같은 개수로 나누어 줄 때 1인당 몇 개를 가질 수 있고,
몇 개가 남는지를 구하는 코드를 작성하시오.
package chapter3_2;
public class Quiz4 {
public static void main(String[] args) {
int pencils = 534;
int students = 30;
// 학생 1명이 가지는 연필 개수
int pencilsPerStudent = (pencils/students);
System.out.println(pencilsPerStudent);
//남은 연필 개수
int pencilsLeft = (pencils % students);
System.out.println(pencilsLeft);
}
}
5. 다음 코드를 실행하면 출력 결과로 5를 기대했는데 4가 출력되었습니다. 어디에서 잘못된 것인지 찾으시오.
package chapter3_2;
public class Quiz5 {
public static void main(String[] args) {
int var1 = 5;
int var2 = 2;
double var3 = var1 / var2; // 2.0 (double)var1 / var2 두 변수 모두 또는 둘 중 하나를 double형으로 강제변환
int var4 = (int) (var3 * var2); //2.0 * 2 = 4
System.out.println(var4);
}
}
6. 십의 자리 이하를 버리는 코드를 작성할 때, 변수 value의 값이 356이라면 300이 나올 수 있도록 코드를 작성하세요.
(산술 연산자만 사용)
package chapter3_2;
public class Quiz6 {
public static void main(String[] args) {
int value = 356;
System.out.println(value / 100 * 100); // 순서대로 계산하면 356/100 = 3 * 100 = 300
}
}
7. 다음 코드에서 출력결과로 10%입니다를 기대했는데 10%가 아닙니다가 출력되었다. 어디가 잘못 작성된 것인가?
package chapter3_2;
public class Quiz7 {
public static void main(String[] args) {
float var1 = 10f;
float var2 = var1 / 100;
if (var2 == 0.1f) { // 0.1을 float으로 만들어야한다.
System.out.println("10%입니다.");
} else {
System.out.println("10%가 아닙니다.");
}
}
}
8. 사다리꼴의 넓이를 구하는 코드를 작성할 때 정확히 소수 자릿수가 나올 수 있도록 작성하시오.
package chapter3_2;
public class Quiz8 {
public static void main(String[] args) {
int lengthTop = 5;
int lengthBottom = 10;
int height = 7;
double area = (double)(5 + 10) * 7 / 2;
System.out.println(area);
}
}
// 사다리꼴 구하는 공식
// (윗변 + 아랫변)*높이/2
9. 키보드로 두 실수를 다음과 같이 입력받는다. 입력된 첫 번째 수에 두 번째 수를 나눈 결과를 "결과:값"으로 출력하되 두번 째 수에
0 또는 0.0이 입력되었을 경우 "결과:무한대"가 출력도되록 코드를 작성하시오.
첫 번째 수: 7.3
두 번째 수: 2.5
---------------------------
결과:2.92(or 결과:무한대)
package chapter3_2;
import java.util.Scanner;
public class Quiz9 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("첫 번째 수: ");
double num1 = Double.parseDouble(scanner.nextLine());
//문자열로 입력된 줏자를 double형으로 바꾼다.
System.out.print("두 번째 수: ");
double num2 = Double.parseDouble(scanner.nextLine());
System.out.println("---------------------");
if (num2 != 0.0) {
// 두번쨰 수가 0이 입력되도 double형으로 변환되어 0.0이 된다.
// 0.0인지 아닌지만 판별하면 된다.
System.out.println("결과: " + (num1 / num2));
} else {
System.out.println("결과: 무한대");
}
}
}
10. 반지름이 10인 원의 넓이를 구하는데 다음과 같이 var2, ".", var3 + 연산해서 원주율을 얻은 다음 계산하려고 한다. 코드를 작성하시오.
int var1 = 10;
int var2 = 3;
int var3 = 14;
double var4 = var1 * var1 * var2 + "." + var3;
System.out.println("원의 넓이:" + var4);
package chapter3_2;
public class Quiz10 {
public static void main(String[] args) {
int var1 = 10;
int var2 = 3;
int var3 = 14;
double var4 = var1 * var1 * Double.parseDouble(var2 + "." + var3);
// 원의 반지름 * 원의 반지름 * 3.14
// var2 + . + var3 은 문자열이므로 문자열을 double로 타입 변환한다.
System.out.println("원의 넓이: " + var4);
}
}
11. 키보드로 아이디와 패스워드를 입력받습니다. 입력 조건으로 이름은 문자열이고 패스워드는 정수입니다.(패스워드는 int타입으로 변환)
입력된 내용을 비교해서 아이디가 "java"이고 패스워드가 12345라면 "로그인 성공"을 출력하고 그렇지 않으면 "로그인 실패"를 출력 하도록 코드를 작성하시오.
package chapter3_2;
import java.util.Scanner;
public class Quiz11 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("아이디:");
String name = in.nextLine();
System.out.print("패스워드:");
int password = in.nextInt();
if (name.equals("java")) {
if (password == 12345) {
System.out.println("로그인 성공");
} else {
System.out.println("로그인 실패:패스워드가 틀림");
}
} else {
System.out.println("로그인 실패:아이디가 존재하지 않음");
}
}
}
12. 다음 코드는 비교 연산자와 논리 연산자의 복햡 연산식이다. 연산식의 출력 결과를 구하시오.
package chapter3_2;
public class Quiz12 {
public static void main(String[] args) {
int x = 10;
int y = 5;
System.out.println((x > 7) && (5 <= y)); // true
System.out.println((x % 3 == 2) || (y % 2 != 1)); //false
// 10/3 나머지는 1 or 5/2의 나머지는 1 둘다 false
}
}
13. 대입 연산자(=)와 산술 연산자(+, -, *, / )로 구성된 실행문을 대입 연산자 하나로 구성된 실행문으로 변경해보시오.
package chapter3_2;
public class Quiz13 {
public static void main(String[] args) {
int value = 0;
value = value + 10; // value += 10;
value = value - 10; // value -= 10;
value = value * 10; // value *= 10;
value = value / 10; // value /= 10;
}
}
14. 다음 코드를 실행했을 때 출력 결과는?
int score = 85;String result = (!(score > 90)) ? "가" : "나";
System.out.println(result)
package chapter3_2;
public class Quiz14 {
public static void main(String[] args) {
int score = 85;
String result = (!(score > 90)) ? "가" : "나";
System.out.println("조건문이 참이면 \"가\" 거짓이면 \"나\": " + result);
}
}
/* 실행결과
조건문이 참이면 "가" 거짓이면 "나": 가
*/
'Java > 혼공자' 카테고리의 다른 글
JAVA) 조건문 iF문, Switch문 (0) | 2023.04.22 |
---|---|
JAVA) 연산자와 연산식 (0) | 2023.04.18 |
JAVA) 변수와 시스템 입출력 (0) | 2023.04.02 |