본문 바로가기

코드스테이츠

[코드스테이츠 BE 45기] <Section1> Week2 (Java 기초2)

<연산자(Operator)>

1 산술 연산자

  • 사칙연산에 사용되는 연산자(+, -, *, /)와 나머지 연산자(%)를 포함
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씩 증가시키거나 감소시키는 연산자

//num1, num2 는 1이라는 값을 할당받아 저장하고 있는 변수
num1 = num1 + 1; // num1의 값은 2가 됩니다.
num2 = num2 - 1; // num2의 값은 0이 됩니다.

//위의 코드는 아래처럼 줄여서 작성 가능
num1++; // num1 = num1 + 1;과 같습니다.
++num1; // num1 = num1 + 1;과 같습니다.

num2--; // num2 = num2 - 1;과 같습니다.
--num2; // num2 = num2 - 1;과 같습니다.
  • 전위형 증감 연산자 (증감 연산자가 피연산자보다 앞에 있는 경우)
  • : 증감 연산을 먼저 수행한 후, 그 결과값을 적용
  • 후위형 증감 연산자 (증감 연산자가 피연산자보다 뒤에 있는 경우)
  • : 기존의 값을 먼저 적용하고 그다음에 증감 연산을 수행
int num1 = 1;
int prefix = ++num1; // num1=2, profix=2

int num2 = 1;
int postfix = num2++; // num2=2, profix=1
// num2를 먼저 사용해, 그리고 +1을 해서, num2에 대입해
 • `num1` & `prefix` : `num1`에 전위형 증감연산자 `++`를 사용했으므로, `num1`의 값이 1만큼 먼저 증가한 다음 그 결과값이 `prefix`에 할당

 • `num2` & `postfix` : `num2`에 후위형 증감연산자 `++`를 사용했으므로, `num2`의 값이 먼저 `postfix`에 할당된 다음에 `num2`의 값이 1 증가

복합 대입 연산자

: 1이 아니라 2 혹은 3씩 증가시키거나 감소시키고 싶을 때는 증감 연산자를 사용할 수 없고, 복합 대입 연산자를 사용하여 연산을 간략하게 표현 가능

num1 = num1 + 2; //불가능
num2 = num2 - 2; //불가능

num1 += 2; //복합 대입 연산자
num2 -= 2; //복합 대입 연산자
  • 모든 사칙 연산자 및 나머지 연산자와 대입 연산자를 결합해서 복합 대입 연산자로 사용가능
// num1~5의 값을 모두 10이라고 한다면,
num1 += 3; // num1 -> 13
num2 -= 3; // num2 -> 7
num3 *= 3; // num3 -> 30
num4 /= 3; // num4 -> 3
num5 %= 3; // num5 -> 1

2 비교 연산자

: boolean 타입으로 평가될 수 있는 조건식에 사용

대소 비교(`>`, `<`, `<=`, `>=`) 연산자와 등가 비교(`==`, `!=`) 연산자로 분류
  1. 대소 비교 연산자

• boolean을 제외한 나머지 기본 타입에 모두 사용가능

• 이항 비교만 가능 (”x가 1보다 크고 5보다 작다” →불가(논리연산자 사용))

5 > 3  //true
2 >= 3  //false
  1. 등가 비교 연산자

• 모든 타입에 사용할 수 있는 연산자

• 두 항의 값이 동등한 지의 여부를 판단할 때 사용. 값이 동등하면 true를, 그렇지 않으면 false를 반환

• 기본 타입의 값끼리, 혹은 참조 타입의 값끼리만 등가 비교 연산자 사용가능

기본 타입과 참조 타입 간에는 등가 비교 연산자 사용불가
5 == 3  //false
5 == 5  //true
3 != 2  //true
3 != 3  //false

3 논리 연산자

: AND 연산자 &&, OR 연산자 ||, NOT 연산자 !를 포함하며, 공통으로 boolean 타입을 반환

  • AND 연산자(&&): 피연산자 두 개가 모두 true일 때 true를 반환하며, 피연산자 두 개 중 하나라도 true가 아니면 false를 반환
  • OR 연산자(||): 피연산자 두 개 중 단 하나라도 true면 true를 반환하며, 피연산자가 모두 false인 경우에만 false를 반환

| x | y | x && y(AND) | x || y(OR) | | --- | --- | --- | --- | | false | false | false | false | | false | true | false | true | | true | false | false | true | | true | true | true | true |

  • NOT 연산자(!): true와 false를 반대로 바꾸는 연산자
// 아래의 비교 연산 결과는 모두 true입니다.
!true == false
!false == true
!!true == true

4 연산자 우선순위

1  (), []      // 괄호 / 대괄호
2  !, ~, ++, --      // 부정/ 증감 연산자
3  *, /, %      // 곱셈 / 나눗셈 연산자
4  <, <=, >, >=      // 대소 비교 연산자
5  &&      // AND 연산자
6  ||      // OR 연산자
7  ? :      // 조건 연산자
8  =, +=, -=, /=, %=      // 대입/할당 연산자
참 또는 거짓) ? 참일 때 결과 : 거짓일 때 결과
int num = (1 + 2 == 3 && 4 + 1 * 2 == 6) ? 3 + 4 : 5 + 6;
System.out.println(num);

// * 곱셈 연산자가 수행됨
int num = (1 + 2 == 3 && 4 + 2 == 6) ? 3 + 4 : 5 + 6;

// + 덧셈 연산자가 수행됨
int num = (3 == 3 && 6 == 6) ? 7 : 11;

// == 등가 연산자가 수행됨
int num = (true && true) ? 7 : 11;

// && AND 연산자가 수행됨
int num = true ? 7 : 11;

// ? : 조건 연산자가 수행됨
int num = 7;

// = 대입 연산자가 수행되어 7이 출력됨

<입출력(I/O)>

1 콘솔 출력

  1. 출력하기 : System.out.print()
  2. : 소괄호 안의 내용을 단순히 출력하기만 하고, 줄 바꿈을 하지 않음
System.out.print("Hello JAVA"); // “Hello Java” //커서위치
  1. 출력하고 줄 바꾸기 : System.out.println()
  2. : 소괄호 안의 내용을 콘솔에 출력하고 줄 바꿈을 함
System.out.println("Kim" + "Coding"); // "Kim Coding" 
//커서위치
  1. 형식대로 출력하기 System.out.printf()

지시자(specifier, 형식 지정자)를 이용해 변수의 값을 여러 형식으로 출력해 주는 메서드

지시자는 실제로 출력되는 값이 아니며, 값을 변환해 자신의 위치에 출력해 주는 기능을 함

지시자 출력 포맷

%b 불리언boolean
%d 10진수decimal
%o 8진수
%x, %X 16진수
%c 문자char
%s 문자열tring
%n 줄 바꿈println
System.out.printf("%s%n", "Hello JAVA"); // 줄 바꿈이 일어남
System.out.printf("%s%n", "Kim" + "Coding");
System.out.printf("%d%n", 3+6); 
System.out.printf("지금은 %s입니다", 2022 + "year"); // 자동 타입 변환이 일어남
System.out.printf("나는 %c%s입니다", '김', "코딩"); //여러 개의 인자를 넣을 수 있음

int a = 10;
String b = "codigbug"
System.out.printf("%s의 나이는 %d살입니다", b, a);  //codingbug의 나이는 10살입니다

2 콘솔 입력

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

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

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

• import java.util.Scanner;

: java.util 위치에 저장되어 있는 Scanner를 이 소스 코드로 불러와라 (Scanner=클래스)

• Scanner scanner = new Scanner(System.in);

: 불러온 Scanner 클래스를 new 연산자를 통해 인스턴스를 생성하고, 생성된 인스턴스를 변수 scanner에 할당

• String inputValue = scanner.nextLine();

: scanner.nextLine()은 문자열을 입력받기 위한 코드이며, 입력받은 문자열은 inputValue라는 변수에 할당되어 저장됨 (nextLine(): scanner에 존재하는 메서드)

<제어문(Control Flow Statements) - 조건문>

1 if 문

• if문의 소괄호 안에는 boolean 값으로 평가될 수 있는 조건식을 넣어주고, 중괄호 안의 실행 블록에는 조건식이 참일 때 실행하고자 하는 코드 작성 (조건식이 true일 경우에 블록 내부의 실행문을 실행)

• 블록: 중괄호({})를 이용해 여러 문장을 하나의 단위로 묶은 것

if (조건식) {  //T, F 결과가 나오는 식
	//조건식이 참이라면 실행되는 블록입니다. 
}

int a = 10;
int b = 20;
if(a > b) {  //False
	System.out.println("얘는 출력이 될까요?"); 
//False라서 if문이 작동하지 않음 -> {}메서드 다음 코드가 출력됨
}
System.out.println("그렇다면 얘는 출력이 될까요?"); 
//그렇다면 예는 출력이 될까요?

if(a != b) {  //True
	System.out.println("얘는 출력이 될까요?");
}
System.out.println("그렇다면 얘는 출력이 될까요?");
//얘는 출력이 될까요?
//그렇다면 얘는 출력이 될까요?

2 if...else문

• else는 if랑 짝궁. 혼자쓸 수 없음

• 조건식의 결과에 따라 실행블록을 선택

• if문의 조건식이 true이면 해당 블록이 실행되고, 조건식이 false이면 다음으로 넘어가 else if 문의 조건식을 검사

• else if문의 모든 조건식이 false라면, 나머지 경우를 의미하는 else 블록이 실행

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

int a = 10;
int b = 20;
if(a != b) {  //True
	System.out.println("안녕하세요");
}
else  //아래 실행할 코드가 1줄만 있으면 {} 생략 가능함
	System.out.println("codingbug입니다!");
//안녕하세요
//if문이 True이기에 else문은 실행되지않음

if(a > b) {  //False
	System.out.println("안녕하세요");
}
else 
	System.out.println("codingbug입니다!");
//codingbug입니다!
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(); //주사위 번호 입력값을 받아옵니다.

        if (dice.equals("1")) { // 입력한 주사위 번호가 1이면 다음 블록을 실행
            System.out.println("1번"); // 콘솔에 "1번"을 출력
        }
        else if (dice.equals("2")) {
            System.out.println("2번");
        }
        else if (dice.equals("3")) {
            System.out.println("3번");
        }
        else if (dice.equals("4")) {
            System.out.println("4번");
        }
        else if (dice.equals("5")) {
            System.out.println("5번");
        }
        else if (dice.equals("6")) {
            System.out.println("6번");
        }
        else {
            System.out.println("없는 숫자! " + dice);
        }
    }
}

3 Switch문

• 변수가 어떤 값을 갖느냐에 따라 실행문이 선택됨

• f문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아님

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

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

switch문에는 int 뿐만 아니라, char 타입 변수도 사용가능하고, 자바 7부터는 String 타입의 변수도 올 수 있습니다.