[Java] 연산자, 입출력, 조건문

Nakjoo·2022년 12월 22일
0

[SEB_BE_43]

목록 보기
5/29

1. 연산자

연란자란?

하나의 값 또는 여러 개의 값을 피연산자로 하여 새로운 값을 만들어내는 기호를 의미한다.

1.1. 산술 연산자

산술 연산자는 사칙연산에 사용되는 연산자(+, -, *, /)와 나머지 연산자(%)을 포함한다.

산술 연산자의 동작은 우리가 알고 있는 일반적인 수학 연산과 거의 동일하다.

연산자기능예시(int)결과값
+ (덧셈 연산자)두 항의 값을 더한 값을 반환한다.7 + 310
- (뺄셈 연산자)좌항의 값에서 우항의 값을 뺀 값을 반환한다.7 - 34
* (곱셈연산자두 항의 값을 곱한 값을 반환한다.7 * 321
/ (나눗셈 연산자)좌항을 우항으로 나눈 값을 반환한다.7 / 32
% (나머지 연산자)좌항의 값을 우항의 값으로 나눈 나머지를 반환한다.7 % 31

용례는 다음과 같다.

int num1 = 1;
int num2 = num1 + 2; // num2 -> 3
int num3 = num2 - 1; // num3 -> 2
int num4 = num3 * 3; // num4 -> 9
int num5 = num4 / 2; // num5 -> 4
int num6 = num5 % 3; // num6 -> 1

나눗셈 연산자와 너머지 연산자를 사용할 때에는 우항에 0이 위차할 수 없다. 즉 어떤 수를 0으로 나눌 수 없다.

int    num1 = 9 / 0;   // 에러
double num2 = 9.0 / 0; // Infinity

int    num3 = 9 % 0;   // 에러
double num4 = 9.0 % 0; // 에러

나눗셈 연산자를 사용할 때, 좌항과 우항이 모두 int형이면 그 결과도 int형이기 때문에 소수점 이하의 값은 버려지고, 오직 몫만 결과로 반환된다.

반면, 좌항이나 우항 중 하나라도 실수 타입의 값이 존재한다면, 실수 타입이 아닌 값도 실수 타입으로 자동으로 형변환되어 계산되며, 결과적으로 실수 간의 나눗셈 연산이 되어 소수점이 버려지지 않은 온전한 값이 결과값으로 반환된다.

double num1 = 9 / 2;   // 4.0
int    num2 = 9 / 2;   // 4
double num3 = 9.0 / 2; // 4.5

1.1.1. 증감연산자

변수의 값을 1씩 증가시키거나 감소시키는 연산자를 증감연산자라고 한다.

num1++; // num1 = num1 + 1;과 같다.
++num1; // num1 = num1 + 1;과 같다.

num2--; // num2 = num2 - 1;과 같다.
--num2; // num2 = num2 - 1;과 같다.

증감 연산자에는 두 가지 종류가 있다.

  • 전위형 증감연산자 : 증감 연산을 먼저 수행한 후, 그 결과값을 적용시킨다.
  • 후위형 증감연산자 : 기존의 값을 먼저 적용시키고 그 다음에 증감 연산을 수행한다.

아래의 예제를 통해 이해할 수 있다.

int num1 = 1;
int prefix = ++num1;

int num2 = 1;
int postfix = num2++;

위의 코드가 실행되고 나면 num1, num2, prefix, postfix의 값으 어떻게 되어져 있을까?

  • num1 & prefix : num1에 전위형 증감연산자 ++를 사용했으므로, num1의 값이 1만큼 먼저 증가된 다음 그 결과값이 prefix에 할당된다.
    • 따라서 num1의 값은 2, prefix의 값도 2가 된다.
  • num2 & postfix : num2에 후위형 증감연산자 ++를 사용했으므로, num2의 값이 먼저 postfix에 할당된 다음에 num2의 값이 1 증가한다.
    • 따라서 num2의 값은 2, postfix의 값은 1이 된다.

1.1.2. 복합 대입 연산자

위의 증감연산자 처럼 1씩 말고 2나 3씩 증가시키거나 감소시키고 싶을 때 증감연산자를 사용할 수 없기에 복합 대입 연산자를 사용하면 된다.

num += 2;
num -= 2;

모든 사칙 연산자 및 나머지 연산자와 대입 연산자를 결합해서 복합 대입 연산자로 사용 가능하다.

// num1~5의 값을 모두 10이라고 한다면,
num1 += 3; // num1 -> 13
num2 -= 3; // num2 -> 7
num3 *= 3; // num3 -> 30
num4 /= 3; // num4 -> 3
num5 %= 3; // num5 -> 1

1.2. 비교 연산자

비교 연산자는 boolean 타입으로 평가될 수 있는 조건식에 사용되며, 크게 대소 비교(>, <, <=, >=)연산자와 등가 비교(==, !=) 연산자로 분류된다.

1.2.1. 대소 비교 연산자

대소 비교 연산자는 boolean을 제외한 너머지 기본 타입에 모두 사용할 수 있다.

대소 비교 연산자결과
5 > 3true
5 <= 5true
3 > 2true
2 >= 3false

1.2.2. 등가 비교 연산자

등가 비교 연산자는 모든 타입에 사용할 수 있는 연산자로, 두 항의 값이 동등한지의 여부를 판단할 때 사용한다. 다만, 기본 타입과 참조 타입 간에는 등가 비교 연산자를 사용할 수 없다.

등가 비교 연산자는 값이 동등하면 true, 그렇지 않으면 false를 반환한다.

등가 비교 연산자결과
5 == 3false
5 == 5true
3 != 2true
3 != 3false

1.3. 논리 연산자

논리 연산자는 AND 연산자 &&, OR 연산자 ||, NOT 연산자 !를 포함하며, 공통적으로 boolean 타입을 반환한다.

논리 연산자의 연산 결과는 다음과 같다.

  • AND 연산자(&&) : 피연산자 두 개가 모두 true일 때 true를 반환하며, 피연산자 두 개 중 하나라도 true가 아니면 false를 반환한다.
  • OR 연산자(||) : 피연산자 두 개 중 단 하나라도 truetrue를 반환하며, 피연산자가 모두 false인 경우에만 false를 반환한다.
xyx && yx II y
falsefalsefalsefalse
falsetruefalsetrue
truefalsefalsetrue
truetruetruetrue

NOT 연산자(!)는 truefalse를 반대로 바꾸는 연산자이다.

// 아래의 비교 연산 결과는 모두 true이다. 
!true == false 
!false == true
!!true == true

2. 콘솔 입출력(I/O)

2.1. 콘솔 출력

프로그래밍을 하면서 변수에 담긴 값을 확인해야 할 필요가 있을 때, 콘솔에 출력할 수 있다. 콘솔에 값을 출력하기 위해서는 System.out.print(), System.out.println(), System.out.printf() 메서드를 활용한다.

2.2. 콘솔 입력

데이터를 입력 받을 때에는 Scanner 클래스를 활용하면 된다.

데이터를 입력받는 코드는 아래와 같다.

import java.util.Scanner;                 // Scanner 클래스를 가져온다.

Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성한다.
String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장된다.

System.out.println(inputValue);           // 입력한 문자열이 출력된다.

3. 조건문

3.1. if 문

if문의 소괄호 안에는 boolean 값으로 평가될 수 있는 조건식을 넣어주고, 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드를 적어주면 된다.

if (조건식) {
	//조건식이 참이라면 실행되는 블록이다.
}

중괄호를 이용해 여러 문장을 하나의 단위로 묶을 수 있는데 이것을 '블록(block)'이라고 한다.

3.2. if...else문

if...else문은 조건식의 결과에 따라 실행블록을 선택한다. if문의 조건식이 true이면 해당 블록이 실행되고, 조건식이 false이면 다음으로 넘어가 else if 문의 조건식을 검사한다. else if문의 모든 조건식이 false라면, 나머지 경우를 의미하는 else 블록이 실행된다.

if(조건식1) {
	//조건식1이 참이라면, 실행되는 블록이다.		
} 
else if (조건식2) {
	//조건식1이 참이 아니면서 조건식2가 참일 때, 실행되는 블록이다.
} 
else {
	//조건식1과 2가 모두 참이 아닐 때, 실행되는 블록이다.
	//else문은 생략 가능하다.
}

3.3. switch문

switch문도 if문과 마찬가지로 조건 제어문이다. 하지만 switch문은 if문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다.

package com.company;

import java.util.Scanner;

public class Main {
    static Scanner myInput = new Scanner(System.in);
    public static void main(String[] args) {
        String dice = myInput.nextLine(); //주사위 번호 입력

        switch (dice) {
            case "1":
                System.out.println("1번");
                break; //다음 case를 실행하지 않고, switch문 탈출!
            case "2":
                System.out.println("2번");
                break;
            case "3":
                System.out.println("3번");
                break;
            case "4":
                System.out.println("4번");
                break;
            case "5":
                System.out.println("5번");
                break;
            case "6":
                System.out.println("6번");
                break;
            default: //switch문의 괄호 안 값과 같은 값이 없으면, 여기서 실행문 실행
                System.out.println("없는 숫자! " + dice);
                break;
        }
    }
}

switch문은 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행한다. 그러나 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행한다(default는 생략 가능하다).

위의 예시 코드에서는 num의 값과 case의 번호가 같으면 해당 case안의 실행문을 실행하고 실행이 완료되면 break를 통해서 switch문을 탈출한다. 주의할 점은, break문을 작성하지 않으면 switch문을 탈출하지 않고 모든 case문을 실행하게 되어 원하는 방식으로 동작하지 않는다는 것이다(이를 fall through라고 한다).

0개의 댓글