본문 바로가기

웹개발 수업/JAVA

[Day +4] 연산자

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창