자바 기본

자바 프로그램 구조

/*
*     소스 파일 : Hello.java
*/
public class Hello {

  public static int sum(int n, int m) {
    return n + m;
  }

  // main() 메소드에서 실행 시작
  public static void main(String[] args) {
    int i = 20;
    int s;
    char a;

    s = sum(i, 10); // sum() 메소드 호출
    a = '?';
    System.out.println(a); // 문자 '?' 화면 출력
    System.out.println("Hello"); // "Hello" 문자열 화면 출력
    System.out.println(s); // 정수 s 값 화면 출력
  }
}

예제 설명

  • 클래스 만들기

    • Hello 이름의 클래스 선언

      public class Hello {
      }
      
    • class 키워드로 클래스 정의(4장 참고)

    • public으로 선언하면 다른 클래스에서도 접근 가능

    • 클래스 코드는 { } 내에 모두 작성

  • 주석문

    • // 한 라인 주석

    • /* 여러 행 주석 */

  • main() 메소드

    • public static void으로 선언되어야 함

      public static void main(String[] args) {
      }
      
    • 자바 프로그램은 main() 메소드부터 실행 시작

    • String[] args로 실행 인자를 전달 받음(3장 참고)

  • 메소드

    • C/C++에서의 함수를 메소드로 지칭

      public static int sum(int n, int m) {
        ...
      }
      
    • 클래스 바깥에 작성할 수 없음

  • 메소드 호출

    • sum() 메소드 호춯

      s = sum(i, 10); // 메소드 sum() 호출
      
    • sum() 메소드의 호출 시 변수 i의 값과 정수 10을 전달

    • sum() 메소드의 n, m에 각각 20, 10 값 전달

    • sum() 메소드는 n과 m 값을 더한 30 리턴

    • 변수 s는 정수 30을 전달받아 저장

  • 변수 선언

    • 변수 타입과 변수 이름 선언

      int i=20;
      char a;
      
  • 문장

    • 세미콜론 ;로 한 문장의 끝을 인식

  • 화면 출력

    • 표준 출력 스트림에 메시지 출력

      System.out.println("Hello"); // "Hello" 화면 출력
      
    • 표준 출력 스트림 System.out의 println() 메소드 호출

    • println()은 여러 타입의 데이터 출력 가능

    • println()은 출력 후 다음 행으로 커서 이동

sum() 메소드 호출과 리턴

_images/java_method_call.png

식별자 (identifier)

  • 식별자란?

    • 클래스, 변수, 상수, 메소드 등에 붙이는 이름

  • 식별자의 원칙

    • @, #, ! 와 같은 특수 문자, 공백 또는 탭은 식별자로 사용할 수 없으나 _, $ 는 사용 가능

    • 유니코드 문자 사용 가능. 한글 사용 가능

    • 자바 언어의 키워드는 식별자로 사용불가

    • 식별자의 첫 번째 문자로 숫자는 사용불가

    • _ 또는 $를 식별자 첫 번째 문자로 사용할 수 있으나 일반적으로 잘 사용하지 않는다.

    • 불린 리터럴 (true, false)과 널 리터럴(null)은 식별자로 사용불가

    • 길이 제한 없음

  • 대소문자 구별

    • Testtest는 별개의 식별자

식별자 이름 예제

  • 사용 가능한 예

int           name;
char  student_ID;     // '_' 사용 가능
void  $func() { }     // '$' 사용 가능
class         Monster3 { } // 숫자 사용 가능
int           whatsyournamemynameiskitae; // 길이 제한 없음
int           barChart;       int barchart; // 대소문자 구분. barChart와 barchart는 다름
int           가격; // 한글 이름 사용 가능
  • 잘못된 예

int           3Chapter; // 식별자의 첫문자로 숫자 사용 불가
class         if { } // 자바의 예약어 if 사용 불가
char  false; // false 사용 불가
void  null() { } // null 사용 불가
class         %calc { } // '%'는 특수문자

자바 키워드

abstract

continue

for

new

switch

assert

default

if

package

synchronized

boolean

do

goto

private

this

break

double

implements

protected

throw

byte

else

import

public

throws

case

enum

instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp

volatile

const(not used)

float

native

super

while

식별자 이름 붙이는 관습

  • 기본 : 가독성 높은 이름

    • 목적을 나타내는 이름 붙이기 : s 보다 sum

    • 충분히 긴 이름으로 붙이기 : AVM 보다 AutoVendingMachine

  • 자바 언어의 이름 붙이는 관습 : CamelCase 이름 붙이기

    • 클래스 이름

      public class HelloWorld {}
      class AutoVendingMachine {}
      
      • 첫 번째 문자는 대문자로 시작

      • 여러 단어가 복합될 때 각 단어의 첫 번째 문자만 대문자

  • 변수, 메소드 이름

    • 첫 단어 이후 각 단어의 첫 번째 문자는 대문자로 시작

      int  myAge;
      boolean isSingle;
      public int getAge() {}
      
    • 첫 단어 이후 각 단어의 첫 번째 문자는 대문자로 시작

  • 상수 이름

    final static double PI = 3.141592;
    
    • 모든 문자를 대문자로 표시

자바의 데이터 타입

  • 자바의 데이터 타입

    • 기본 타입 : 8 개

      • boolean

      • char

      • byte

      • short

      • int

      • long

      • float

      • double

  • 레퍼런스 타입 : 1 개이며 용도는 다음 3 가지

    • 클래스(class)에 대한 레퍼런스

    • 인터페이스(interface)에 대한 레퍼런스

    • 배열(array)에 대한 레퍼런스

자바의 기본 데이터 타입

  • 특징

    • 기본 데이타 타입의 크기가 정해져 있음

      • 기본 데이타 타입의 크기는 CPU나 운영체제에 따라 변하지 않음

_images/java_type.png

문자열

  • 문자열은 기본 타입이 아님

  • String 클래스로 문자열 표현

    • 문자열 리터럴 – "JDK", "한글", "계속하세요"

      String toolName="JDK";
      
    • 문자열이 섞인 + 연산은 문자열 연결

      toolName + 1.8            -> "JDK1.8"
      "(" + 3 + "," + 5 + ")"   -> "(3,5)"
      System.out.println(toolName + "이 출시됨"); // "JDK1.8이 출시됨" 출력
      

변수와 선언

  • 변수

    • 프로그램 실행 중에 값을 임시 저장하기 위한 공간

      • 변수 값은 프로그램 수행 중 변경될 수 있음

    • 데이터 타입에서 정한 크기의 메모리 할당

  • 변수 선언

    • 변수의 타입 다음에 변수 이름을 적어 변수를 선언

    _images/java_var_declaration.png

변수 선언 예제

  • 변수 선언 예제

    int radius;
    char c1, c2, c3; // 3 개의 변수를 한 번에 선언한다.
    double weight;
    
  • 변수 선언과 초기화

    • 선언과 동시에 초기값 지정

      int radius = 10;
      char c1 = 'a', c2 = 'b', c3 = 'c';
      double weight = 75.56;
      
  • 변수에 값 대입

    • 대입 연산자 = 다음에 식(expression)

      radius = 10 * 5;
      c1 = 'r';
      weight = weight + 5.0;
      

리터럴과 정수 리터럴

  • 리터럴(literal)

    • 프로그램에서 직접 표현한 값

    • 정수, 실수, 문자, 논리, 문자열 리터럴 있음

      • 예) 34, 42.195, '%', true, "hello"

  • 정수 타입 리터럴

    • 10진수, 8진수, 16진수, 2진수 리터럴

      _images/java_literal.png
    • 모든 정수 리터럴은 int 형으로 컴파일

    • long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시

      • 예) 24L, 3578l

실수 리터럴

  • 소수점 형태나 지수 형태로 표현한 실수

    • 12. 12.0 .1234 0.1234 1234E-4

  • 실수 타입 리터럴은 double 타입으로 컴파일

    double d = 0.1234;
    double e = 1234E-4; // 1234E-4 = 1234x10-4이므로 0.1234와 동일
    
  • 숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 함

    float f = 0.1234f;
    double w = .1234D; // .1234D와 .1234는 동일
    

문자 리터럴

  • 단일 인용부호(' ')로 문자 표현

    • 'a', 'W', '가', '*', '3', '7'

  • \u 다음에 4자리 16진수로, 2 바이트의 유니코드(Unicode)

    • \u0041 -> 문자 ‘A’의 유니코드(0041)

    • \uae00 -> 한글문자 ‘글’의 유니코드(ae00)

  • 특수문자 리터럴은 백슬래시 \로 시작

_images/java_char_literal.png

논리 리터럴과 boolean 타입

  • 논리 리터럴은 2개뿐

    • true, false

    • boolean 타입 변수에 치환하거나 조건문에 이용

      boolean a = true;
      boolean b = 10 > 0; // 10>0가 참이므로 b 값은 true
      boolean c = 1; // 타입 불일치 오류. C/C++와 달리 자바에서 1,0을 참, 거짓으로 사용 불가
      
      while(true) { // 무한 루프. while(1)로 사용하면 안 됨
      ...
      }
      

Tip: 기본 타입 이외의 리터럴

  • null 리터럴

    • 레퍼런스에 대입 사용

      int n = null;     //오류: 기본 타입에 사용 불가
      String str = null;
      
  • 문자열 리터럴(스트링 리터럴)

    • 이중 인용부호로 묶어 표현

      • 예) "Good", "Morning", "자바", "3.19", "26", "a"

    • 문자열 리터럴은 String 객체로 자동 처리

      String str = "Good";
      

Tip. JDK7부터 숫자에 _ 허용, 가독성 높임

  • 숫자 리터럴의 아무 위치에나 언더스코어(_) 허용

    • 컴파일러는 리터럴에서 _를 빼고 처리

  • 사용 예

    int price = 20_100;                                 // 20100과 동일
    long cardNumber = 1234_5678_1357_9998L;     // 1234567813579998L와 같음
    long controlBits = 0b10110100_01011011_10110011_111110000;
    long maxLong = 0x7fff_ffff_ffff_ffffL;
    int age = 2______5;                                 // 25와 동일
    
  • 허용되지 않는 4가지 경우

    int x = 15_;                // 오류. 리터럴 끝에 사용할 수 없다.
    double pi = 3_.14;          // 오류. 소수점(.) 앞뒤에 사용할 수 없다.
    long idNum = 981231_1234567_L; // 오류. _L(_F) 앞에 사용할 수 없다.
    int y = 0_x15;              // 오류. 0x 중간이나 끝에 사용할 수 없다. 0x_15(오류)
    

상수

  • 상수 선언

    • final 키워드 사용

    • 선언 시 초기값 지정

    • 실행 중 값 변경 불가

      _images/java_final.png

예제 2-2 : 변수, 리터럴, 상수 활용

원의 면적을 구하는 프로그램을 작성해보자.

public class CircleArea {

  public static void main(String[] args) {
    final double PI = 3.14; // 원주율을 상수로 선언

    double radius = 10.0; // 원의 반지름
    double circleArea = radius*radius*PI; // 원의 면적 계산

  // 원의 면적을 화면에 출력한다.
    System.out.println("원의 면적 = " + circleArea);
  }
}
원의 면적 = 314.0

자동 타입 변환

  • 자동 타입 변환

    • 작은 타입은 큰 타입으로 자동 변환

      • 컴파일러에 의해 이루어짐

    • 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때

      long m = 25; // 25는 int 타입. 25가 long 타입으로 자동 변환되는 예
      
      double d = 3.14 * 10; // 실수 연산을 하기 위해 10이 10.0으로 자동 변환
                            // 다른 피연산자 3.14가 실수이기 때문
      
      _images/java_auto_type_conversion.png

강제 타입 변환

  • 자동 타입 변환이 안 되는 경우: 큰 타입이 작은타입으로 변환할 때

    int n = 300;
    byte b = n; // 컴파일 오류. int 타입이 byte로 자동 변환 안 됨
    
  • 강제 타입 변환

    • 개발자가 필요하여 강제로 타입 변환을 지시

      • () 안에 변환할 타입 지정

    • 강제 변환은 값 손실 우려

      byte b = (byte)n;  따른 손실
      
      double d = 1.9;
      int n = (int)d;  // n = 1. 강제 타입 변환으로 소숫점 이하 0.9 손실
      
      _images/java_type_conversion.png

예제 2-3 : 타입 변환

자동 타입 변환과 강제 타입 변환의 이해를 위한 예제이다. 다음 소스의 실행 결과는 무엇인가?

public class TypeConversion {
  public static void main(String[] args) {
    byte b = 127;
    int i = 100;

    System.out.println(b+i);
    System.out.println(10/4);
    System.out.println(10.0/4);
    System.out.println((char)0x12340041);
    System.out.println((byte)(b+i));
    System.out.println((int)2.9 + 1.8);
    System.out.println((int)(2.9 + 1.8));
    System.out.println((int)2.9 + (int)1.8);
  }
}
227
2
2.5
A
-29
3.8
4
3

자바에서 키 입력

  • System.in

    • 키보드로부터 직접 읽는 자바의 표준 입력 스트림

    • 키 값을 바이트(문자 아님)로 리턴

  • System.in을 사용할 때 문제점

    • 키 값을 바이트 데이터로 넘겨주므로 응용프로그램이 문자 정보로 변환해야 함

    _images/java_system_in.png

Scanner로 쉽게 키 입력

  • Scanner 클래스

    • System.in에게 키를 읽게 하고, 읽은 바이트를 문자, 정수, 실수, 불린, 문자열 등 다양한 타입으로 변환하여 리턴

      • java.util.Scanner 클래스

  • 객체 생성

    import java.util.Scanner; // import 문 필요
    ...
    Scanner a = new Scanner(System.in); // Scanner 객체 생성
    
    _images/java_scanner.png
    • System.in에게 키를 읽게 하고, 원하는 타입으로 변환하여 리턴

Scanner를 이용한 키 입력

  • Scanner에서 키 입력 받기

    • Scanner는 입력되는 키 값을 공백으로 구분되는 아이템 단위로 읽음

    • 공백 문자 : \t, \f, \r, ' ', \n

  • 개발자가 원하는 다양한 타입의 값으로 바꾸어 읽을 수 있음

    Scanner scanner = new Scanner(System.in);
    
    String name = scanner.next();       // "Kim"
    String city = scanner.next();       // "Seoul"
    int age = scanner.nextInt();        // 20
    double weight = scanner.nextDouble(); // 65.1
    boolean single = scanner.nextBoolean(); // true
    
    _images/java_scanner_input.png

Scanner 주요 메소드

_images/java_scanner_method.png

예제 2-4 : Scanner를 이용한 키 입력 연습

Scanner를 이용하여 이름, 도시, 나이, 체중, 독신 여부를 입력 받고 다시 출력하는 프로그램을 작성하라.

import java.util.Scanner;

public class ScannerEx {
  public static void main(String args[]) {
    System.out.println("이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리하여 입력하세요");
    Scanner scanner = new Scanner(System.in);

    String name = scanner.next(); // 문자열 읽기
    System.out.print("이름은 " + name + ", ");

    String city = scanner.next(); // 문자열 읽기
    System.out.print("도시는 " + city + ", ");

    int age = scanner.nextInt(); // 정수 읽기
    System.out.print("나이는 " + age + "살, ");

    double weight = scanner.nextDouble(); // 실수 읽기
    System.out.print("체중은 " + weight + "kg, ");

    boolean single = scanner.nextBoolean(); // 논리값 읽기
    System.out.println("독신 여부는 " + single + "입니다.");

    scanner.close(); // scanner 닫기
  }
}
이름, 도시, 나이, 체중, 독신 여부를 빈칸으로 분리하여 입력하세요.
Kim Seoul 20 65.1 true
이름은 Kim, 도시는 Seoul, 나이는 20, 체중은 65.1kg, 독신 여부는 true입니다.

식과 연산자

연산 : 주어진 식을 계산하여 결과를 얻어내는 과정

_images/java_expression.png _images/java_operators.png

연산자 우선순위

_images/java_ops_priority.png
  • 같은 우선순위의 연산자

    • 왼쪽에서 오른쪽으로 처리

    • 예외)오른쪽에서 왼쪽으로

      • 대입 연산자 =, --, ++, +, - (양수 음수 부호), ! 형 변환은 오른쪽에서 왼쪽으로 처리

  • 괄호는 최우선순위

    • 괄호가 다시 괄호를 포함한 경우는 가장 안쪽의 괄호부터 먼저 처리

산술 연산자

  • 산술 연산자

    • 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)

    • /% 응용

      • 10의 자리와 1의 자리 분리

        69 / 10 // 몫 6
        69 % 10 // 나머지 9
        
      • n이 홀수인지 판단

        int r = n % 2;  // r이 1이면 n은 홀수, 0이면 짝수
        
    _images/java_numeric_operators.png

예제 2-5 : /와 % 산술 연산

초 단위의 정수를 입력받고, 몇 시간, 몇 분, 몇 초인지 출력하는 프로그램을 작성하라.

import java.util.Scanner;

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

    System.out.print("정수를 입력하세요: ");
    int time = scanner.nextInt();             // 정수 입력
    int second = time % 60;                           // 60으로 나눈 나머지는 초
    int minute = (time / 60) % 60;    // 60으로 나눈 몫을 다시 60으로 나눈 나머지는 분
    int hour = (time / 60) / 60;              // 60으로 나눈 몫을 다시 60으로 나눈 몫은 시간

    System.out.print(time + "초는 ");
    System.out.print(hour + "시간, ");
    System.out.print(minute + "분, ");
    System.out.println(second + "초입니다.");

    scanner.close();
  }
}
정수를 입력하세요:5000
5000초는 1시간, 23분, 20초입니다.

증감 연산

  • 1 증가 혹은 감소 시키는 연산

    • ++, --

      _images/java_inc_dec_operators.png
    _images/java_inc_dec_operators_table.png

대입 연산

  • 연산의 오른쪽 결과는 왼쪽 변수에 대입

    int a = 1, b = 3;
    a = b;                              // b 값을 a에 대입하여 a=3
    a += b;                     // a = a + b의 연산이 이루어져, a=6. b는 3 그대로
    
    _images/java_substitution_op.png

예제 2-6 : 대입 연산자와 증감 연산자 사용

다음 코드의 실행 결과는 무엇인가?

public class AssignmentIncDecOperator {
  public static void main(String[] args) {
    int a=3, b=3, c=3;

    // 대입 연산자 사례
    a += 3;           // a=a+3 = 6
    b *= 3;           // b=b*3 = 9
    c %= 2;           // c=c%2 = 1
    System.out.println("a=" + a + ", b=" + b + ", c=" + c);

    int d=3;
    // 증감 연산자 사례
    a = d++;  // a=3, d=4
    System.out.println("a=" + a + ", d=" + d);
    a = ++d;  // d=5, a=5
    System.out.println("a=" + a + ", d=" + d);
    a = d--;          // a=5, d=4
    System.out.println("a=" + a + ", d=" + d);
    a = --d;          // d=3, a=3
    System.out.println("a=" + a + ", d=" + d);
  }
}
a=6, b=9, c=1
a=3, d=4
a=5, d=5
a=5, d=4
a=3, d=3

비교 연산과 논리 연산

  • 비교 연산

    • 두 피연산자를 비교하여 true 또는 false의 논리 값을 내는 연산

    _images/java_comparison_op.png
  • 논리 연산

    • 논리 값을 AND, OR, XOR, NOT 논리 연산, 논리 값을 내는 연산

    _images/java_logic_op.png

비교 연산과 논리 연산의 복합 예제

// 나이(int age)가 20대인 경우
(age >= 20) && (age < 30)

// 문자(char c)가 대문자인 경우
(c >= 'A') && (c <= 'Z')

// (x,y)가 (0,0)과 (50,50)의 사각형 내에 있음
(x>=0) && (y>=0) && (x<=50) && (y<=50)
20 <= age < 30        // 오류

예제 2-7 : 비교 연산자와 논리 연산자 사용하기

다음 소스의 실행 결과는 무엇인가?

public class LogicalOperator {
  public static void main (String[] args) {
    // 비교 연산
    System.out.println('a' > 'b');
    System.out.println(3 >= 2);
    System.out.println(-1 < 0);
    System.out.println(3.45 <= 2);
    System.out.println(3 == 2);
    System.out.println(3 != 2);
    System.out.println(!(3 != 2));

    // 비교 연산과 논리 연산 복합
    System.out.println((3 > 2) && (3 > 4));
    System.out.println((3 != 2) || (-1 > 0));
    System.out.println((3 != 2) ^ (-1 > 0));
  }
}
false
true
true
false
false
true
false
false
true
true

조건 연산자 ? :

  • condition ? opr2 : opr3

    • 세 개의 피연산자로 구성된 삼항(ternary) 연산자

      • condition이 true이면, 연산식의 결과는 opr2, false이면 opr3

    • if-else을 간결하게 표현할 수 있음

    _images/java_ternary_op.png

예제 2-8 : 조건 연산

다음은 조건 연산자의 사례이다. 실행 결과는 무엇인가?

public class TernaryOperator {
  public static void main (String[] args) {
    int a = 3, b = 5;

    System.out.println("두 수의 차는 " + ((a>b)?(a-b):(b-a)));
  }
}
 수의 차는 2

비트 연산

  • 비트 개념

    _images/java_bit_op.png
  • 비트 연산

    • 비트 논리 연산

      • 비트끼리 AND, OR, XOR, NOT 연산

    • 비트 시프트 연산

      • 비트를 오른쪽이나 왼쪽으로 이동

비트 논리 연산

  • 피 연산자의 각 비트들의 논리 연산

    _images/java_bit_operations.png _images/java_bit_op_table.png

비트 논리 연산 응용

냉장고에는 8개의 센서가 있고 이들은 flag 변수와 연결되어 있다고 할 때, 냉장고의 온도가 0도 이상으로 올라가면 비트 3이 1이 되고, 0도 이하이면 비트 3이 0을 유지한다.

_images/java_bit_op_app.png

문제) 현재 냉장고의 온도가 0도 이상인지 판단하는 코드를 작성하라.

byte flag = 0b00001010; // 각 비트는 8개의 센서 값을 가리킴
if(flag & 0b00001000 == 0)
  System.out.print("온도는 0도 이하");
else
  System.out.print("온도는 0도 이상");
온도는 0 이상
_images/java_bit_op_prob.png

시프트 연산자의 예제

피 연산자의 비트들을 이동 연산

_images/java_bit_op_ex.png _images/java_bit_shift.png

예제 2-9 : 비트 논리 연산과 비트 시프트 연산

다음 소스의 실행 결과는 무엇인가?

public class BitOperator {
  public static void main(String[] args) {
    short a = (short)0x55ff;
    short b = (short)0x00ff;

    // 비트 논리 연산
    System.out.println("[비트 연산 결과]");
    System.out.printf("%04x\n", (short)(a & b)); // 비트 AND
    System.out.printf("%04x\n", (short)(a | b)); // 비트 OR
    System.out.printf("%04x\n", (short)(a ^ b)); // 비트 XOR
    System.out.printf("%04x\n", (short)(~a)); // 비트 NOT

    byte c = 20; // 0x14
    byte d = -8; // 0xf8

    // 비트 시프트 연산
    System.out.println("[시프트 연산 결과]");
    System.out.println(c <<2); // c를 2비트 왼쪽 시프트
    System.out.println(c >>2); // c를 2비트 오른쪽 시프트. 0 삽입
    System.out.println(d >>2); // d를 2비트 오른쪽 시프트. 1 삽입
    System.out.printf("%x\n", (d >>>2)); // d를 2비트 오른쪽 시프트. 0 삽입
  }
}
[비트 연산 결과]
00ff
55ff
5500
aa00
[시프트 연산 결과]
80
5
-2
3ffffffe

단순 if문

  • 단순 if 문

    • if의 괄호 안에 조건식(논리형 변수나 논리 연산)

      • 실행문장이 단일 문장인 경우 둘러싸는 {, } 생략 가능

      _images/java_if_simple.png
      if(n%2 == 0) {
        System.out.println(n + "은 짝수입니다.");
      }
      

예제 2-10 : if문 사용하기

시험 점수가 80점이 이상이면 합격 판별을 하는 프로그램을 작성하시오.

import java.util.Scanner;

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

    System.out.print("점수를 입력하시오: ");
    int score = scanner.nextInt();
    if (score >= 80)
      System.out.println("축하합니다! 합격입니다.");

    scanner.close();
  }
}
점수를 입력하시오: 95
축하합니다! 합격입니다.

조건문 – if-else

  • if-else 문

    • 조건식이 true면 실행문장1 실행 후 if-else문을 벗어남

    • false인 경우에 실행문장2 실행후, if-else문을 벗어남

    _images/java_if_else.png

예제 2-11 : if-else 사용하기

입력된 수가 3의 배수인지 판별하는 프로그램을 작성하시오.

import java.util.Scanner;

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

    System.out.print("수를 입력하시오: ");
    int number = in.nextInt();

    if (number % 3 == 0)
      System.out.println("3의 배수입니다.");
    else
      System.out.println("3의 배수가 아닙니다.");

    scanner.close();
  }
}
수를 입력하시오: 129
3 배수입니다.

다중 if-else 문

  • 다중 if-else 문

    • if-else가 연속되는 모양

      • 조건문이 너무 많은 경우, switch 문 사용 권장

    _images/java_if_multiple.png

예제 2-12 : 다중 if-else로 학점 매기기

다중 if-else문을 이용하여 입력받은 성적에 대해 학점을 부여하는 프로그램을 작성해보자.

import java.util.Scanner;

public class Grading {
  public static void main(String[] args) {
    char grade;
    Scanner scanner = new Scanner(System.in);

    System.out.print("점수를 입력하세요(0~100): ");
    int score = scanner.nextInt(); // 점수 읽기
    if(score >= 90) // score가 90 이상
      grade = 'A';
    else if(score >= 80) // score가 80 이상 90 미만
      grade = 'B';
    else if(score >= 70) // score가 70 이상 80 이만
      grade = 'C';
    else if(score >= 60) // score가 60 이상 70 이만
      grade = 'D';
    else // score가 60 이만
      grade = 'F';
    System.out.println("학점은 "+ grade + "입니다.");

    scanner.close();
  }
}
점수를 입력하세요(0~100): 89
학점은 B입니다.

예제 2-13 : 중첩 if-else 문 예제

점수와 학년을 입력 받아 60점 이상이면 합격, 미만이면 불합격을 출력한다. 4학년의 경우 70점 이상이어야 합격이다.

import java.util.Scanner;

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

    System.out.print("점수를 입력하세요(0~100): ");
    int score = scanner.nextInt();

    System.out.print("학년을 입력하세요(1~4): ");
    int year = scanner.nextInt();

    if(score >= 60) { // 60점 이상
      if(year != 4)
        System.out.println("합격!"); // 4학년 아니면 합격
      else if(score >= 70)
        System.out.println("합격!"); // 4학년이 70점 이상이면 합격
    else
      System.out.println("불합격!"); // 4학년이 70점 미만이면 불합격
    }
    else // 60점 미만 불합격
      System.out.println("불합격!");

    scanner.close();
  }
}
점수를 입력하세요(0~100): 65
학년을 입력하세요(1~4): 4
불합격!

switch문

  • switch 문은 식과 case 문의 값과 비교

    • case 의 비교 값과 일치하면 해당 case의 실행문장 수행

      • break를 만나면 switch 문을 벗어남

    • case의 비교 값과 일치하는 것이 없으면 default 문 실행

  • default 문은 생략 가능

    _images/java_switch.png
  • switch식에 나올 수 있는 타입은 byte, short, char, int 및 Enum(이넘) 타입, String 클래스, 기본 타입의 래퍼 클래스인 Character, Byte, Short, Integer 등이 될 수 있습니다.

예제 2-14 switch 문으로 학점 매기기

  • 예제 2-12의 성적 매기는 코드를 switch 문으로 작성하라.

import java.util.Scanner;
public class GradingSwitch {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);

    char grade;
    System.out.print("점수를 입력하세요(0~100): ");
    int score = scanner.nextInt();
    switch (score/10) {
      case 10: // score = 100
      case 9: // score는 90~99
        grade = 'A';
        break;
      case 8: // score는 80~89
        grade = 'B';
        break;
      case 7: // score는 70~79
        grade = 'C';
        break;
      case 6: // score는 60~69
        grade = 'D';
        break;
      default: // score는 59 이하
        grade = 'F';
    }
    System.out.println("학점은 "+grade+"입니다");
    scanner.close();
  }
}
점수를 입력하세요(0~100): 89
학점은 B입니다.

switch문에서 벗어나기

  • switch 문 내의 break

    • break 문 만나면 switch 문 벗어남

    • case 문에 break 문이 없다면, 다음 case 문으로 실행 계속

      • 언젠가 break를 만날 때까지 계속 내려 가면서 실행

char grade='A';
switch (grade) {
  case 'A':
    System.out.println("90 ~ 100점입니다.");
    break;
  case 'B':
    System.out.println("80 ~ 89점입니다.");
    break;
  case 'C':
    System.out.println("70 ~ 79점입니다.");
    break;
}
90 ~ 100점입니다.
80 ~ 89점입니다.

case 문의 값

  • case 문의 값

    • 문자, 정수, 문자열 리터럴(JDK 1.7부터)만 허용

    • 실수 리터럴은 허용되지 않음

    int b;
    switch(b%2) {
      case 1 : ...; break;
      case 2 : ...; break;
    }
    
    char c;
    switch(c) {
      case '+' : ...; break;
      case '-' : ...; break;
    }
    
    String s = "예";
    switch(s) {
      case "예" : ...; break;
      case "아니요" : ...; break;
    }
    
  • 오류

    switch(a) {
      case a :                          // 오류. 변수 사용 안됨
      case a > 3 :              // 오류. 수식 안됨
      case a == 1 :     // 오류. 수식 안됨
    }
    

예제 2-15 : switch 문 활용

switch 문을 이용하여 커피 메뉴의 가격을 알려주는 프로그램을 작성하라. 에스프레소, 카푸치노, 카페라떼는 3500원이고, 아메리카노는 2000원이다.

import java.util.Scanner;
public class CoffeePrice {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("무슨 커피 드릴까요? ");
    String order = scanner.next();
    int price=0;
    switch (order) {
      case "에스프레소":
      case "카푸치노":
      case "카페라떼":
        price = 3500;
        break;
      case "아메리카노" :
        price = 2000;
        break;
      default:
        System.out.println("메뉴에 없습니다!");
    }
    if(price != 0)
      System.out.print(order + "는 " + price + "원입니다");
    scanner.close();
  }
}
무슨 커피 드릴까요? 에스프레소
에스프레소는 3500원입니다