본문 바로가기

Java/Learn_Java

3. 연산자

* 생각해보니, public class에 파일 이름이 있었네? 더이상 주석으로 파일 이름 안 달아도 되겠다..

(여태 뻘짓했구나.. 코드초보는 또 하나 배웁니다..또르륵)

* 개념을 여기에 다 쓰기엔 여백과 시간이 부족해, 자세한 설명은 생략한다.

여기엔 코드와 주석 위주로 작성하겠다.

 

단항 연산자

- 부호 연산자 (Sign Operator)

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

		short s = 100;
		// short result3 = -s; //부호 연산자의 산출 값은 int 타입이어야 하므로 error
		int result3 = -s; // promotion 통한 부호 연산자와 s 저장
		System.out.println("result3=" + result3);
		
	}
}

- 증감 연산자 (Increase, Decrease Operator)

public class IncreaseDecreaseOperator {
	public static void main(String[] args) {
		int x = 10;
		int y = 10;
		int z;

		System.out.println("---------------------");
		x++;
		++x; // x++이든 ++x이든 똑같이 1 증가시킴
		System.out.println("x=" + x);

		System.out.println("---------------------");
		y--;
		--y; // y++이든 ++y이든 똑같이 1 증가시킴
		System.out.println("y=" + y);

		System.out.println("---------------------");
		z = x++; // 현재 x값을 z에 저장한 뒤에 1 증가
		System.out.println("z=" + z);
		System.out.println("x=" + x);

		System.out.println("---------------------");
		z = ++x; // 1 증가한 뒤에 현재 x값을 z에 저장
		System.out.println("z=" + z);
		System.out.println("x=" + x);

		System.out.println("---------------------");
		z = ++x + y++; // 1 증가한 x와 현재 y값을 연산 후, y는 1 증가되어 저장
		System.out.println("z=" + z);
		System.out.println("x=" + x);
		System.out.println("y=" + y);
	}
}

- 논리 부정 연산자 (Deny Logic Operator)

public class DenyLogicOperatorExample {
	public static void main(String[] args) {
		boolean play = true; // 현재 play 값 true 선언
		System.out.println(play);

		play = !play; // 현재 play 값 false 반전
		System.out.println(play);

		play = !play; // 현재 play 값 true 반전
		System.out.println(play);
	}
}

 

이항 연산자

- 산술 연산자 (Arithmetic Operator)

public class ArithmeticOperatorExample {
	public static void main(String[] args) {
		int v1 = 5;
		int v2 = 2;

		int result1 = v1 + v2; // 덧셈
		System.out.println("result1=" + result1);

		int result2 = v1 - v2; // 뺄셈
		System.out.println("result2=" + result2);

		int result3 = v1 * v2; // 곱셈
		System.out.println("result3=" + result3);

		int result4 = v1 / v2; // 나눗셈
		System.out.println("result4=" + result4);

		int result5 = v1 % v2; // 나눈 뒤 나머지 값
		System.out.println("result5=" + result5);

		double result6 = (double) v1 / v2; // 나눗셈 후 값 실수로 casting
		System.out.println("result6=" + result6);
	}
}

* Char 타입의 연산

public class CharOperationExample {
	public static void main(String[] args) {
		char c1 = 'A' + 1;
		char c2 = 'A';
//		char c3 = c2 + 1; 
		// c2 + 1의 값은 int 타입으로 변환되기 때문에, char 타입인 c3에 저장할 수 없다.
		char c3 = (char) (c2 + 1); // c2 + 1 계산한 int 값을 char로 casting 후 c3에 저장

		System.out.println("c1: " + c1);
		System.out.println("c2: " + c2);
		System.out.println("c3: " + c3);
	}
}

* Overflow 발생 및 해결

public class OverflowExample {
	public static void main(String[] args) {
//		Overflow 예시
		int x = 1000000;
		int y = 1000000;
		int z = x * y;
		System.out.println(z); // int 타입 범위 초과로 Overflow 발생

//		해결1_Casting
		int a = 1000000;
		int b = 1000000;
		long c = (long) a * b;
		System.out.println(c);

//		해결2_변수 타입을 Long으로 변환
		long d = 1000000;
		long e = 1000000;
		long f = d * e;
		System.out.println(f);
	}
}

* NaN(Not a Number) 및 Infinity(무한대) 연산

public class InfinityAndNaNCheckExample {
	public static void main(String[] args) {
		int x = 5;
		double y = 0.0;

		double z = x / y;

//		/와 % 연산의 결과가 Infinity 또는 NaN인지 확인하려면 아래의 method를 사용하면 된다.
		System.out.println(Double.isInfinite(z)); // Infinity 확인 method
		System.out.println(Double.isNaN(z)); // NaN 확인 method

		System.out.println(z + 2); // infinity + 2 = infinity
	}
}

** NaN 값이 나오면 원래 데이터에 NaN을 저장하지 않도록 조사 후 실행하게 해야 한다.

public class InputDataCheckNaNExample {
	public static void main(String[] args) {
		String userInput = "NaN";
		double val = Double.valueOf(userInput);

		double currentBalance = 10000.0;

//		NaN일 경우 실행되는 코드
		if (Double.isNaN(val)) {
			System.out.println("NaN이 입력되어 처리할 수 없음");
			val = 0.0; // val 값 초기화
		}

//		NaN이 아닐 경우 실행되는 코드
		currentBalance += val;
		System.out.println(currentBalance);
	}
}

- 문자열 연결 연산자(+)

피연산자 중 한 쪽이 문자열이면, + 연산자는 문자열 연결 연산자로 사용되어

다른 피연산자를 문자열로 변환하고 서로 결합한다.

public class StringConcatExample {
	public static void main(String[] args) {
		String str1 = "JDK" + 6.0; // 피연산자에 문자열 JDK가 있으므로 +는 연결 연산자로 사용됨
		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);

	}
}

- 비교 연산자(==, != 등등)

public class CompareOperatorExample {
	public static void main(String[] args) {
		int v2 = 1;
		double v3 = 1.0;
		System.out.println(v2 == v3);
		// v3이 double이므로, v2도 큰 타입인 double로 바꿔 비교해 true 출력됨

		double v4 = 0.1;
		float v5 = 0.1F;
		System.out.println(v4 == v5);
		/*
		 * 0.1F는 0.1의 근사값, 즉 정확한 0.1이 아닌 0.1000000149011612...이런 식이 되므로 false 출력됨
		 * double로 바꾸면 v4가 0.1의 근사값, 즉 정확한 0.1이 아닌 0.1000000149011612...가 출력되므로
		 * float으로 casting 한 이후 비교 연산을 해야 올바른 값을 산출할 수 있다.
		 */

//		올바른 예
		System.out.println((float) v4 == v5);
//		또는(소숫점 자리를 10 곱해 없앤 후 비교)
		System.out.println((int) (v4 * 10) == (int) (v5 * 10));

	}
}

** (중요) String 객체의 문자열만을 비교하고 싶으면 ==을 쓰면 안 된다.(==은 문자열의 주소값이 같은지 비교하게 됨)

equals() method를 써야 한다.

 

public class StringEqualsExample {
	public static void main(String[] args) {
		String strVar1 = "Chaarles";
		String strVar2 = "Chaarles";
		String strVar3 = new String("Chaarles");

		System.out.println(strVar1 == strVar2);
		System.out.println(strVar1 == strVar3); // 주소값이 다르므로 false 출력
		System.out.println();
//		문자열 비교하는 올바른 방법
		System.out.println(strVar1.equals(strVar2));
		System.out.println(strVar1.equals(strVar3));
	}
}

 

//알파벳 하나를 입력 후 대/소문자 판별해 출력

import java.util.Scanner;

public class LogicalOperatorExercise {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("알파벳 하나를 입력하세요>");
		String value1 = sc.next();
		char value2 = value1.charAt(0);
//		java scanner는 character를 입력받는 기능이 없다.
//		문자열 받은 뒤, charAt로 꺼내와야 한다.

		if ((value2 >= 'A') && (value2 <= 'Z')) {
			System.out.println("대문자입니다.");
		}
		if ((value2 >= 'a') && (value2 <= 'z')) {
			System.out.println("소문자입니다.");
		} else {
			System.out.println("올바른 값을 입력하세요.");
		}

	}
}
//		실행문이 계속 반복되게 하는 방법도 생각해보자

 

'Java > Learn_Java' 카테고리의 다른 글

4. 조건문과 반복문_활용문제  (0) 2020.03.29
3. 연산자_연습문제  (0) 2020.03.29
2. 변수와 타입_3. 타입 변환  (0) 2020.03.28
2. 변수와 타입  (0) 2020.03.28
Intro  (0) 2020.03.28