(코드 상태 BE 45등석) 2주차 – 5일차(자바 기초 2)

<운영자>

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; //복합 대입 연산자
  • 4개의 연산자와 모듈로 연산자를 할당 연산자와 결합하면 복합 할당 연산자로 사용할 수 있습니다.
// num1~5의 값을 모두 10이라고 한다면,
num1 += 3; // num1 -> 13
num2 -= 3; // num2 -> 7
num3 *= 3; // num3 -> 30
num4 /= 3; // num4 -> 3
num5 %= 3; // num5 -> 1

2 비교 연산자

: 불리언 타입으로 평가할 수 있는 조건식에 사용

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

• 부울을 제외한 모든 기본 유형에 사용할 수 있습니다.

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

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

• 모든 유형에 사용할 수 있는 연산자

• 두 항의 값이 같은지 판단할 때 사용한다. 값이 같으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

• 같음 비교 연산자는 기본 타입 값 또는 참조 타입 값 사이에서만 사용할 수 있다.

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

논리 연산자

: AND 연산자 &&, OR 연산자 ||, NOT 연산자 !를 포함하며 일반적으로 부울 유형을 반환합니다.

  • AND 연산자(&&): 두 피연산자가 모두 참이면 참을 반환하고 둘 중 하나라도 참이 아니면 거짓을 반환합니다.
  • OR 연산자(||): 피연산자 중 하나가 참이면 참을 반환하고 두 피연산자 모두 거짓이면 거짓을 반환합니다.

| 엑스 | 와이 | x && y(및) | 엑스 || y(OR) | | — | — | — | — | | 거짓 | 거짓 | 거짓 | 거짓 | | 거짓 | 사실 | 거짓 | 사실 | | 사실 | 거짓 | 거짓 | 사실 | | 사실 | 사실 | 사실 | 사실 |

  • NOT 연산자(!): 참과 거짓을 반전시키는 연산자
// 아래의 비교 연산 결과는 모두 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() 인쇄

지정자(포맷 지정자)를 이용하여 변수의 값을 다양한 형식으로 출력하는 방식

인디케이터는 실제 출력값이 아니라 그 값을 해당 위치로 환산하여 출력하는 기능을 합니다.

지표 출력 형식

%비 부울
%디 십진수
%영형 8진수
%x, %X 16진수
%씨 문자 문자
%에스 스트링 트링
%N 줄 바꿈 인쇄
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=class)

• 스캐너 스캐너 = new Scanner(System.in);

: new 연산자를 통해 호출된 Scanner 클래스의 인스턴스를 생성하고 생성된 인스턴스를 scanner 변수에 할당

• String inputValue = scanner.nextLine();

: scanner.nextLine()은 문자열을 받기 위한 코드로, 입력된 문자열은 inputValue라는 변수에 대입하여 저장한다(nextLine(): 스캐너에 존재하는 메소드)

<제어 흐름 문 – 조건문>

1 if 문

• if 문의 괄호 안에 boolean 값으로 평가할 수 있는 조건식을 넣고 중괄호 안의 실행 블록에 조건식이 참일 때 실행할 코드를 작성한다. 조건식이 참이다)

• 블록: 여러 문을 중괄호({})를 사용하여 함께 그룹화합니다.

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 문의 조건식이 참이면 해당 블록이 실행된다. 조건식이 거짓이면 else if 문의 조건식을 검사합니다.

• else if 문의 조건식이 모두 거짓이면 나머지 case를 나타내는 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);
        }
    }
}

스위치 문

• 변수가 가지는 값에 따라 실행문이 선택된다.

• f 문과 마찬가지로 조건식이 참이면 블록 내부의 실행문이 실행되지 않는다.

switch 문은 괄호 안의 값과 같은 값을 가지는 경우로 이동하여 실행문을 실행합니다. 단, 괄호 안의 값과 동일한 값을 가지는 경우가 없을 경우에는 default를 실행하고 실행문을 실행한다(default는 생략 가능).

위의 예제 코드에서 num의 값과 case 번호가 같으면 case 안의 실행문을 실행하고 실행이 완료되면 break문을 통해 switch문을 탈출한다. break 문을 작성하지 않으면 switch 문을 이스케이프 처리하지 않고 모든 case 문이 실행되므로 원하는 방식으로 동작하지 않게 됩니다(이를 fall through라고 함).

switch 문에는 int 뿐만 아니라 char 형 변수도 사용할 수 있으며 Java 7부터는 String 형 변수도 사용할 수 있다.