[Java] #4 연산자

febCho·2023년 9월 23일
0

Java

목록 보기
5/53

1. 증감 연산자

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. 증가 연산자와 감소 연산자를 변수 앞에 명시할 경우,
    변수 값이 증가 or 감소되어 출력된다.

1)
int i = 5;
System.out.println(++i);
→ 6 출력

2)
int j = 10;
System.out.println(--j);
→ 9 출력

  1. 증가 연산자와 감소 연산자를 변수 뒤에 명시할 경우,
    기존의 변수 값을 먼저 읽어온 후 메모리의 변수 값을 증가 or 감소시킨다.

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 출력

2. 산술 연산자

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
	}
}

산술 연산자를 사용할 때 가장 주의할 점은 자료형 구분이다.

참고) [Java] 3. 자료형과 형변환

산술 연산자의미
+더하기
-빼기
*곱하기
/나누기(몫 구하기)
%나누기(나머지 구하기)
  1. int(정수)와 int(정수)를 연산했을 때는 int(정수)만 출력된다.
    ex.
    System.out.println(10/3);
    → 3 출력

  2. 따라서 실수를 구하고 싶다면 연산에 사용되는 값중 하나는 실수(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 활용하기)

3. 비교 연산자

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에서의 비교 연산자 중 주목할 것은 '==(같다), !=(같지 않다)'이다.

비교 연산자의미
>크다
<작다
>=크거나 같다
<=작거나 같다
==같다
!=같지 않다
  1. '>=', '<=', '==', '!=' 기호 사이 공백이 있으면 안 된다.
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)
  1. 문자열 간의 비교 연산 시, 주의할 점은 '=='는 내용은 같지만 서로 다른 객체일 경우 false를 반환한다는 점이다.
    따라서 객체가 달라도 내용이 같은지 비교하고 싶을 경우에는 equals()라는 메서드를, 객체가 달라도 내용이 같은지 대소문자를 구분하지 않고 비교하길 원할 경우 equalsIgnoreCase() 메서드를 사용해야 한다.

4. 논리 연산자

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로 나타냄

각 연산자에 대한 설명을 경우의 수로 나누어 조금 더 자세하게 설명해 보았다.

  1. 논리곱 (&&)
선조건후조건결과
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

1) 선조건이 false일 경우, 연산 속도를 빠르게 하기 위해 후조건은 미실행한다.
2) '&'는 엔퍼센트라고 읽는다.

  1. 논리합 (||)
선조건후조건결과
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

1) 선조건이 true일 경우, 연산 속도를 빠르게 하기 위해 후조건은 미실행한다.
2) '|'는 파이프라고 읽는다.

  1. 부정 (!)


지금까지 배운 증감 연산자, 비교 연산자, 논리 연산자에 대한 문법 연습을 아래와 같이 진행하였다.

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
	}
}


5. 조건(삼항) 연산자

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();
	}
}
  1. 마지막 자릿수를 제외한 값과 마지막 자릿수를 표시 = 일의 자리는 출력하지 말고, 십의 자리까지만 출력하기 = 10으로 나누기


6. 대입 연산자

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();
	}
}

7. 연산자의 우선순위

① 산술 > 비교 > 논리 > 대입, 대입은 제일 마지막에 수행된다.
② 단항(1) >이항(2) >삼항(3). 단항 연산자의 우선순위가 이항 연산자보다 높다.
③ 단항 연산자와 대입 연산자를 제외한 모든 연산의 진행방향은 왼쪽에서 오른쪽이다.

profile
Done is better than perfect.

0개의 댓글