wiki:IXJavaStudy/9th

P.I.JA 9회

  • (2차) 2012년 4월 17일 화요일 오후 10시 ~ 11시 반
  • (1차) 2010년 5월 3일 월요일 오후 1시 ~ 2시 반

내용

입출력

  • Console
    System.out.println("표준 출력");
    
    System.err.println("오류 출력");
    
    System.out.println("글자 입력: ");
    int c = System.in.read();
    System.out.println("읽은 글자: " + c);
    
    • 표준 출력: System.out
    • 오류 출력: System.err
    • 표준 입력: System.in
    • 특별한 작업을 하지 않아도 기본적으로 사용할 수 있음
  • 간단한 출력과 형식화된 출력
    • attachment:OutputTest.java
    • print: 내용만 출력
    • println: 내용을 출력하고 줄을 바꿈
    • printf: 지정한 서식으로 내용을 출력함
    • 서식 기호
      • 해당 자리에 값들을 지정한 서식으로 채워 줌
      • %라는 특수 기호로 시작
      • 자료형 표시: d - 정수, f - 실수, s - 문자열
      • %와 자료형 사이의 숫자: 확보할 공간 수. 출력할 내용이 숫자이고 앞에 0이 붙을 경우 0으로 공간을 채운다.
      • , (쉼표): (세 자리마다) 쉼표를 찍어준다.
      • 날짜나 시간도 서식 지정하여 출력할 수 있음
    • 특수 문자
      • \n: 줄 바꿈 (new line - 정확히는 아래줄로 내림)
      • \r: 줄 바꿈 (return - 정확히는 줄 처음으로 돌아감)
      • \t: Tab 출력
      • OS 별로 줄 바꿈 문자가 다름
  • 간단한 입력과 형식화된 입력
    • 출력 만큼 쉬운 입력 방법은 없음
    • Reader 시리즈 사용
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      
      System.out.print("이름을 입력하세요: ");
      String name = br.readLine();
      System.out.println(name);
      
      • InputStreamReader: 입력 Stream으로부터 글자를 읽어 옴. 글자 단위로 읽는 기능만 제공
      • BufferedReader: 버퍼라는 공간에 입력된 글자들을 가지고 있음. readLine의 경우 버퍼에서 Enter를 만날 때 까지 읽어오는 것.
      • 여러 줄 읽기: 한 줄 읽기를 반복. 빈 줄을 입력할 때까지 계속 입력을 받는 예제
        String sLine;
        do {
            System.out.print("문장을 입력하세요: ");
            sLine = br.readLine();
            System.out.println(sLine);
        } while (!sLine.isEmpty());
        
      • 숫자 입력 받기: 문자열을 숫자로 바꿔주어야 함.
        System.out.print("나이를 입력하세요: ");
        String sNumber = br.readLine();
        System.out.println(Integer.parseInt(sNumber) * 2);
        
    • Scanner
      • 내부적으로 정규표현식을 이용
      • 기초 자료형들을 바로 읽을 수 있음
      • 여러 항목을 읽을 경우, 기본적으로 공백이나 줄바꿈으로 항목을 구분함. useDelimiter method를 통해 구분자를 변경할 수 있다.
      • 좀 더 간결하게 사용할 수 있으나, 동작이 까다로운 편
        • 항상 끝에 구분자가 나타나야 함 1
    • 예제 1: 두 숫자를 입력받아 더하기
      • attachment:Adder.java
      • String.split이나 Scanner.useDelimiter를 통해 구분자를 지정한다. 이 예제에서는 쉼표를 사용하였다.
      • 구분자가 일반 문자열이 아니라, 정규표현식 Pattern이기 때문에, 특정한 기호는 사용할 수 없다. (정규표현식에서 다룸)
    • 예제 2: 이름이 몇이요? (sic)
      • attachment:InputTest.java
      • 문자열(이름)과 숫자(나이)를 입력받는다. 각 항목은 줄바꿈으로 구분하였다.
      • 다른 Class들을 사용했지만 원리는 같기 때문에, 기대한 자료형이 입력되지 않으면 마찬가지로 오류가 발생한다.

과제

  • 마트 계산대 만들기
  • 다음 조건을 만족하도록 프로그램을 작성하세요.
    • 각 물품에 대해 물품명과 수량, 단가(금액이 아님)를 입력받습니다. 항목의 값은 Entry 라는 Class에 저장합니다.
    • 구매한 물품의 금액 총계를 계산합니다.
    • 받은 금액을 입력받습니다.
    • 영수증을 출력합니다. 이때 반드시 형식화된 출력을 사용해야 합니다. (%d, %s 등)
    • 영수증을 출력하면 다음과 같이 나와야 합니다. 다음과 같이 줄이 맞아야 합니다. (예제 출력)
      YT 마트
                          대표자: YT
      ------------------------------
      품목          	수량	  금액
      ------------------------------
      생수          	  10	 5,000
      음료          	   1	   900
      육류          	   1	15,280
      김           	   1	 7,950
      라면          	   2	 6,700
      봉투          	   1	    50
      ------------------------------
      받을 금액      	  	35,880
      받은 금액      	  	40,000
      거스름돈       	  	 4,120
      
    • 환경보호를 위해 장바구니를 들고 다닙시다.;;
  • 글자 위치 맞추기
    • 서식 문자열에 숫자를 지정하면 (예: %40s) 해당 길이의 문자열 안에서 내용이 정렬됩니다. 기본적으로 오른쪽 정렬이며, 왼쪽 정렬로 만들고 싶으면 %-40s와 같이 사용합니다.
    • Eclipse에서 실행한 결과는 위의 방법으로 너비를 맞춰 주어도 세로 위치가 맞지 않습니다.
      • 변동폭 글꼴(글자별로 너비가 다름)을 사용하고 있기 때문
      • 고정폭 글꼴(굴림체 등)을 사용해서 확인해야 합니다.
    • 글꼴을 맞춰 주어도, 한글은 영숫자에 비해 너비가 2배 정도이므로 맞지 않습니다.
      • 정확하게 맞출 수도 있지만, 어려워 지므로 위 예제 출력에 있는 값으로만 확인해 봅니다.
  • 최대한 오류에 대처할 수 있도록 주의 깊게 작성해 주세요.
    • 필수 항목이 입력되지 않을 경우
    • 입출력 오류
    • 숫자를 입력하는 상황에서 숫자가 아닌 것이 입력될 경우
    • 받은 금액이 물건 값보다 적을 경우
  • 과제는 2인 1조로 진행합니다.
  • 난이도
    • 상: 전체 작성
    • 중: 첨부 파일에서 Entry Class 사용
    • 하: Entry Class를 사용하고, CashRegister Template Class를 변경합니다.
      • 기본적인 동작이 모두 구현되어 있음. 코드를 읽어 보세요.
      • TODO로 표시한 부분(Formatting 지정)을 완성하세요. 참조
    • attachment:CashRegister.zip
  • 9회와 10회 공통 과제입니다.


  1. 1. 이 문제 때문에, 예제 1에서 두 번째 숫자 뒤에도 쉼표를 찍어야 한다.

Add comment

Last modified 5 years ago Last modified on Dec 15, 2012, 11:47:15 AM

Attachments (4)

Download all attachments as: .zip