package kr.s04.operator;
public class OperatorMain01 {
public static void main(String[] args) {
System.out.println("===증감연산자===");
//증가연산자
int i = 5;
//증가연산자를 변수 앞에 명시하면 변수값을 1 증가시킨 후 증가된
//값을 읽어옴.
System.out.println(++i);//6
System.out.println("===========");
//증감연산자를 변수 뒤에 명시하면 변수값을 먼저 읽어온 후
//메모리의 변수 값을 1 증가시킴.
//증가된 값을 보기 위해서는 한번 더 호출해야 함.
System.out.println(i++);//6
System.out.println(i);//7
System.out.println("==============");
//감소연산자
int j = 10;
System.out.println(--j);//9
System.out.println("==========");
System.out.println(j--);//9
System.out.println(j);//8
}
}
증감 연산자는 변수 앞에 명시하느냐, 변수 뒤에 명시하느냐에 따라 출력되는 값이 상이하다. 또한 최우선 연산자('()') 다음으로 우선순위가 높다.
| 증감 연산자 | 의미 |
|---|---|
| ++ | 1씩 증가시킴 |
| -- | 1씩 감소시킴 |
1)
int i = 5;
System.out.println(++i);
→ 6 출력
2)
int j = 10;
System.out.println(--j);
→ 9 출력
1)
int i = 6;
System.out.println(i++);
→ 6 출력
System.out.println(i);
→ 7 출력
2)
int i = 9;
System.out.println(j--);
→ 9 출력
System.out.println(j);
→ 8 출력
package kr.s04.operator;
public class OperatorMain02 {
public static void main(String[] args) {
System.out.println("===산술연산자===");
System.out.println(10+10);
System.out.println(20-7);
System.out.println(10*3);//int * int = int 출력
System.out.println(10/3);//나눗셈 (몫 구하기), 역시 int 출력
System.out.println(5%3);//나머지 구하기
System.out.println("==========");
System.out.println(10.0/3);//3.3333333333333335
}
}
산술 연산자를 사용할 때 가장 주의할 점은 자료형 구분이다.
| 산술 연산자 | 의미 |
|---|---|
| + | 더하기 |
| - | 빼기 |
| * | 곱하기 |
| / | 나누기(몫 구하기) |
| % | 나누기(나머지 구하기) |
int(정수)와 int(정수)를 연산했을 때는 int(정수)만 출력된다.
ex.
System.out.println(10/3);
→ 3 출력
따라서 실수를 구하고 싶다면 연산에 사용되는 값중 하나는 실수(double) 형태여야 한다.
ex.System.out.println(10.0/3);
→ 3.333333... 출력
위 산술 연산자 개념을 적용하여 두 가지 실습을 진행하였다.
> 산술 연산자를 활용한 성적 프로그램 만들기
package kr.s04.operator;
public class OperatorMain04 {
public static void main(String[] args) {
/*
* [실습]
* 534자루의 연필을 30명의 학생들에게 똑같은 개수로 나누어 줄 때
* 학생당 몇 개를 가질 수 있고, 최종적으로 몇 개가 남는지를 구하시오.
*
* [출력 예시]
* 학생 한 명이 가지는 연필수 : **
* 남은 연필수 : **
*/
int a = 534/30;
int b = 534%30;
System.out.printf("학생 한 명이 가지는 연필수 : %d자루%n", a);
System.out.printf("남은 연필수 : %d자루%n", b);
/*
* int a = 534;
* int b = 30;
*
* System.out.println("학생 한 명이 가지는 연필수 : " + a/b);
* System.out.println("남은 연필수 : " + a%b);
*
*이 방식도 있음!
*/
}
}
참고) [Java] tip: 데이터 입력받기 (Scanner 활용하기)
package kr.s04.operator;
public class OperatorMain06 {
public static void main(String[] args) {
System.out.println("===비교(관계)연산자===");
boolean result;
int a = 10;
double b = 10.5;
result = a < b;
System.out.println("a < b : " + result);
result = a > b;
System.out.println("a > b : " + result);
result = a >= b;
System.out.println("a >= b : " + result);
result = a <= b;
System.out.println("a <= b : " + result);
result = a == b;
System.out.println("a == b : " + result);
result = a != b;
System.out.println("a != b : " + result);
}
}
java에서의 비교 연산자 중 주목할 것은 '==(같다), !=(같지 않다)'이다.
| 비교 연산자 | 의미 |
|---|---|
| > | 크다 |
| < | 작다 |
| >= | 크거나 같다 |
| <= | 작거나 같다 |
| == | 같다 |
| != | 같지 않다 |
package kr.s00.study;
public class OperatorEx23 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abc");
System.out.printf("\"abc\"==\"abc\" ? %b%n", "abc" == "abc");
System.out.printf(" str1==\"abc\" ? %b%n", str1 == "abc");
//내용은 같지만 서로 다른 객체이기 때문
System.out.printf(" str2==\"abc\" ? %b%n", str2 == "abc");
System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc"));
//equals()는 객체가 달라도 문자열이 같으면 true
System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc"));
//단, equals()는 대소문자를 구분함
System.out.printf("str2.equals(\"ABC\") ? %b%n", str2.equals("ABC"));
//대소문자 구별을 원치 않는다면 equalsIgnoreCase() 사용
System.out.printf("str2.equalsIgnoreCase(\"ABC\") ? %b%n",
str2.equalsIgnoreCase("ABC"));
}
}
출력)
"abc"=="abc" ? true
str1=="abc" ? true
str2=="abc" ? false
str1.equals("abc") ? true
str2.equals("abc") ? true
str2.equals("ABC") ? false
str2.equalsIgnoreCase("ABC") ? true
출처) <Java의 정석>, 남궁성(2016)
equals()라는 메서드를, 객체가 달라도 내용이 같은지 대소문자를 구분하지 않고 비교하길 원할 경우 equalsIgnoreCase() 메서드를 사용해야 한다.package kr.s04.operator;
public class OperatorMain07 {
public static void main(String[] args) {
System.out.println("===논리연산자===");
boolean a,b,result;
a = true;
b = false;
//논리곱 (&&)
//주어진 조건들이 모두 true일 때 결과값이 true
result = a && b;
System.out.println("a && b ---> " + result);
//논리합 (||)
//주어진 조건 중 하나라도 true이면 결과값이 true
result = a || b;
System.out.println("a || b ---> " + result);
//부정 (!)
result = !a;
System.out.println("!a ---> " + result);
}
}
출력)
===논리연산자===
a && b ---> false
a || b ---> true
!a ---> false
논리 연산자는 연산의 대상이 true와 false이다.
| 논리 연산자 | 의미 | 설명 |
|---|---|---|
| && | and(논리곱) | 주어진 조건들이 모두 true일 때만 true를 나타냄 |
| || | or(논리합) | 주어진 조건들 중 하나라도 true이면 true를 나타냄 |
| ! | 부정 | true는 false로 false는 true로 나타냄 |
각 연산자에 대한 설명을 경우의 수로 나누어 조금 더 자세하게 설명해 보았다.
| 선조건 | 후조건 | 결과 |
|---|---|---|
| true | true | true |
| true | false | false |
| false | false | |
| false | false |
1) 선조건이 false일 경우, 연산 속도를 빠르게 하기 위해 후조건은 미실행한다.
2) '&'는 엔퍼센트라고 읽는다.
| 선조건 | 후조건 | 결과 |
|---|---|---|
| true | true | |
| true | true | |
| false | true | true |
| false | false | false |
1) 선조건이 true일 경우, 연산 속도를 빠르게 하기 위해 후조건은 미실행한다.
2) '|'는 파이프라고 읽는다.
지금까지 배운 증감 연산자, 비교 연산자, 논리 연산자에 대한 문법 연습을 아래와 같이 진행하였다.
package kr.s04.operator;
public class OperatorMain08 {
public static void main(String[] args) {
//증감연산자, 비교연산자, 논리연산자
int a, b;
a = b = 10;
boolean c = a++ >= ++b && ++a > b++;
//10 11
// false(이므로) 미실행
System.out.println(a + "," + b);//후조건 미실행으로 a = 11
//b = 11
System.out.println("c : " + c);//false
System.out.println("=============");
int d,e;
d = e = 10;
boolean f = ++d > e++ || d++ >= ++e;
//11 10
// true(이므로) 미실행
System.out.println(d + "," + e);//11, 11
System.out.println("f : " + f);//true
int g,h;
g = h = 10;
boolean i = ++g < h++ || g++ >= ++h;
//11 10 11 12
// false false
System.out.println(g + "," + h);//12, 12
System.out.println("i = " + i);//false
}
}
package kr.s04.operator;
public class OperatorMain09 {
public static void main(String[] args) {
System.out.println("===조건(삼항)연산자");
int x = 10, y = -10;
// 조건 참값 거짓값
int absX = x >= 0 ? x : -x;//절댓값 구하기
int absY = y >= 0 ? y : -y;//절댓값 구하기
System.out.println("x= 10일 때, x의 절댓값은 " + absX);
System.out.println("y = -10일 때, y의 절댓값은 " + absY);
}
}
package kr.s04.operator;
public class OperatorMain10 {
public static void main(String[] args) {
System.out.println("===조건(삼항)연산자)===");
int a = 5, b = 10;
int max; //최대값을 저장할 변수
int min; //최소값을 저장할 변수
//
max = a > b ? a : b;
System.out.println("max = " + max);
min = a < b ? a : b;
System.out.println("min = " + min);
}
}
조건 연산자 혹은 삼항 연산자라고 불리우는 연산자 '?:'는 하나의 조건을 정의하여 만족 시에는 '참값'을 반환하고 만족하지 못할 시에는 '거짓값'을 반환한다.
| 조건(삼항) 연산자 | 의미 | 설명 |
|---|---|---|
| ?: | 조건을 만족하면 참값, 만족하지 못하면 거짓값 반환 | 조건?참값:거짓값 |
위에서 배운 개념들과 Scanner를 이용하여 실습을 진행하였다.
참고) [Java] tip: 데이터 입력받기 (Scanner 활용하기)
package kr.s04.operator;
public class OperatorMain11 {
public static void main(String[] args) {
/*
* [실습]
* 키보드에서 입력한 정수값에 마지막 자릿수를 제외한 값과
* 마지막 자릿수를 표시
* (힌트)123을 입력하면 마지막 자릿수를 제외한 값은 12이고
* 마지막 자릿수는 3
*
* [입력 예시]
* 정수값 : **
*
* [출력 예시]
* 마지막 자릿수를 제외한 값 : **
* 마지막 자릿수 : **
*/
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("정수값 : ");
int in = input.nextInt();
System.out.println("마지막 자릿수를 제외한 값 : " + (in/10));
System.out.println("마지막 자릿수 : " + (in%10));
input.close();
}
}
package kr.s04.operator;
public class OperatorMain12 {
public static void main(String[] args) {
System.out.println("===대입연산자===");
int a = 5, b = 7;
a += b;//a = a+b;
System.out.println("a += b : " + a);
a -= b; //a = a-b
System.out.println("a -= b : " + a);
a *= b; //a = a*b
System.out.println("a * b : " + a);
a /= b; //a = a/b
System.out.println("a / b : " + a);
a %= b; //a = a%b
System.out.println("a % b : " + a);
}
}
대입 연산자는 위와 같이 산술 연산자와 합쳐진 복합대입 연산자가 중요하다.
출력)
===대입연산자===
a += b : 12
a -= b : 5
a * b : 35
a / b : 5
a % b : 5
위 개념들을 바탕으로 숙제를 진행하였다.
package kr.s04.operator;
public class OperatorMain13 {
public static void main(String[] args) {
/*
*[숙제]
* A전자대리점에서는 그날 물건 판매액의 15%를 할인
* 해주시기로 했습니다. 판매한 상품명과 상품의 단가와
* 수량을 입력해서 지불 금액을 출력하는 프로그램을 작성하시오.
* (단, 출력 시에는 소수점 이하 절삭)
*
*[입력 예시]
* 상품명 입력 : 냉장고
* 단가 입력 : 50000
* 판매 수량 입력 : 3
*
* [출력 예시]
* 냉장고 3대 가격은 1,275,000원
*/
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("상품명 입력 : ");
String mer = input.nextLine();
System.out.print("단가 입력 : ");
int price = input.nextInt();
System.out.print("판매 수량 입력 : ");
int count = input.nextInt();
int result = (int)(price * 0.85f * count);
//int result = price*count*85/100;도 가능하며, 이땐 손실이 없다.
System.out.printf("%s %d대 가격은 %,d원", mer, count, result);
input.close();
}
}
① 산술 > 비교 > 논리 > 대입, 대입은 제일 마지막에 수행된다.
② 단항(1) >이항(2) >삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
③ 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.