1주차 과제를 진행하면서 많은 친구들이 한글 인코딩 문제로 어려움을 겪었던 것으로 알고 있습니다. 2주차 과제를 시작하기 전에 아래 글을 먼저 읽어보기 바랍니다.
컴퓨터의 문자 인코딩에 대해서
컴퓨터는 모든 데이터를 숫자로 표현한다. 컴퓨터는 글자(character)를 표현하기 위해 각 글자마다 숫자를 대응시킨다. 이렇게 글자와 숫자를 대응시키는 일을 글자부호화(character encoding)일고 부른다. 영어 알파벳의 글자부호화 방식은 한가지로 통일되어 있다. 영어 알파벳에 대한 글자-숫자 대응 표를 ASCII(아스키)부호표라고 부른다. 한글의 글자부호화 대응표에는 크게 두 가지가 있다. 한글코드와 유니코드(Unicode)이다.
- 유니코드는 전세계 수많은 글자들을 숫자 1부터 10FFFF(16진법)까지의 숫자에 대응시켜 표로 만들어 놓은 것이다. 글자 종류가 워낙 많으므로 표가 매우 매우 크다. 한글의 모든 글자도 이 표에 들어 있다. 글자를 컴퓨터 메모리에 저장할 때 그 글자에 대응되는 숫자를 코드표에서 찾아 메모리에 적어주는데 이 숫자를 메모리에 적는 방법이 utf-8, utf-16, utf-32 등 여러 가지가 있다.
- 한글코드는 영어 알파벳과 한글의 모든 글자를 1부터 차례로 숫자에 대응시켜 표로 만들어 놓은 것이다. 쉼표 등 구두점과 줄바꿈문자 등 특수문자도 포함되어 있다. 한글코드표가 있듯이 일본어코드표가 있고, 중국어 코드표도 있다. 각 코드표는 이름으로 구분한다. 한글코드표에는 euc-kr (ks x 1001 + ks x 1003)과 cp949 (ms949, windows-949)가 있다. euc-kr은 2,350개, ms949는 11,172개의 글자를 표현한다. 윈도컴퓨터에서 인코딩 방식으로 ANSI를 선택하면 ms949 코드표에 따라 인코딩된다. 윈도컴퓨터의 메모장은 줄곧 ms949코드를 사용해 왔으니 최근 utf-8 코드를 사용하는 쪽으로 변경되었다.
윈도컴퓨터의 자바컴파일러는 기본적으로 자바프로그램에 있는 글자들을 ms949 코드표에 따라 해독한다. 자바 프로그램을 ms949코드로 파일에 저장했다면 컴파일할 때 단순히 javac 파일이름.java의 명령으로 컴파일하면 된다. 만약 프로그램을 utf-8 코드로 파일에 저장했다면, 컴파일할 때 javac -encoding utf-8 파일이름.java라고 적음으로써 utf-8 코드를 사용했음을 컴파일러에게 명시적으로 알려주어야 한다. 여러 가지 종류가 컴퓨터들이 서로 통신하는 인터넷에서는 utf-8을 가장 많이 사용한다.
조건문과 반복문
프로그램을 작성할 때는 2주차 강의자료 31쪽에 있는 규칙과 관례를 지켜야 합니다.
2주차 강의자료 22-24쪽에 있는 것처럼 논리적 들여쓰기(indentation)을 해야 합니다.
위 두 가지를 지키지 않으면 과제물 채점에서 1점 감점합니다.
C: 드라이브 아래에 자기 이름의 폴더를 하나 만들고, 그 아래에 week2라는 폴더를 만드시오. 그리고 그 아래에 실습과제 프로그램 파일을 저장합니다.
과제를 모두 푼 후에는 week2 폴더를 압축하여 이루리 시스템에 제출하세요.
2주차 프로그래밍 실습과제
P1 (키보드 입력, 모니터 출력, 정수 덧셈)
키보드로부터 정수 두 개를 입력 받아 두 수의 합을 출력하는 프로그램을 작성하시오. 클래스 이름은 Adder로 지으시오. 실행 화면은 아래와 같습니다. 10, +, 25, =, 35 사이에 빈칸이 한 개씩 들어 있게 하시오.
힌트 :
import java.util.Scanner;
public class Adder {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("정수 두 개 입력하시오: ");
int i = // 이 다음을 채워주세요
int j = // 이 다음을 채워주세요
System.out.println(i + " + " + j + " = " + (i+j));
input.close();
}
}
P2 (키보드 입력, 모니터 출력, 문자열 연결)
키보드로부터 단어 두 개를 입력 받아 두 단어를 연결한 문자열을 출력하는 프로그램을 작성하시오. 클래스 이름은 StringAdder로 지으시오. 실행화면은 아래와 같습니다.
P3 (키보드 입력, 모니터 출력, 실수 사칙연산)
키보드로부터 소수 두 개를 입력 받아 두 수의 덧셈, 뺄셈, 곱셈, 나눗셈을 하여 결과를 출력하는 프로그램을 작성하시오. 클래스 이름은 BinaryOperations로 지으시오.
실행화면은 아래와 같습니다. 24.5, 연산자, 10.0, =, 결과 사이에 빈칸이 한 개씩 들어 있게 하시오.
P4 (반복문)
1부터 100까지의 자연수의 합을 계산하여 출력하는 프로그램을 작성하시오. 우선 for 문장을 이용하여 계산하고 다음으로 while 문장을 이용하여 계산하시오. 클래스 이름은 Summation으로 지으시오. 실행화면은 아래와 같습니다.
힌트 :
public class Summation {
public static void main(String[] args) {
int sum = 0;
int i;
// for 문장을 이용하여 다음을 채워주세요.
System.out.println("for 이용 : 1부터 100까지의 자연수의 합 = " + sum);
sum = 0; // 변수를 0으로 초기화
i = 1; // 변수를 1로 초기화
// while 문장을 이용하여 다음을 채워주세요.
System.out.println("while 이용 : 1부터 100까지의 자연수의 합 = " + sum);
}
}
P5 (반복문, 자판 입력)
사용자에게 1부터 얼마까지의 자연수를 더할 것인지 물어보고, 그 만큼의 자연수의 합을 계산하여 출력하는 프로그램을 작성하시오. 클래스 이름은 Summation2로 지으시오. 실행화면은 아래와 같습니다.
P6 (반복문, 자판 입력)
사용자에게 몇 개의 정수를 입력할 것인지 물어보고, 그 갯수만큼의 정수들을 차례로 읽어 들이면서 읽어 들인 정수들을 차례로 더하는 프로그램을 작성하시오. 정수 입력이 끝나면 더한 결과를 화면에 출력합니다. 클래스 이름은 MultipleAdder로 지으시오. 실행화면은 아래와 같습니다.
힌트 : 아래 두 번째 네모에는 자판으로부터 정수 하나를 읽어 들이는 문장이 들어 가야 합니다.
import java.util.Scanner;
public class MultipleAdder {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("정수를 몇 개 더하시겠습니까?");
int n = input.nextInt();
// + 앞을 채워주세요.
System.out.print( + "개의 정수를 차례로 입력하시오: ");
int i;
int sum = 0;
for (i=0; i<n; i++)
sum = sum + // 이 부분을 채워주세요.
System.out.println("정수의 합 = " + sum);
input.close();
}
}
P7 (if 조건문, 정수 크기 비교)
사용자에게 두 개의 정수를 입력하도록 한 후 입력된 두 수 중 더 큰 수를 출력하는 프로그램을 작성하시오. 두 수가 같으면 같다고 출력해야 합니다. 클래스 이름은 LargerNumber로 지으시오. 실행화면은 아래와 같습니다. 아래 화면은 프로그램을 세 번 실행한 결과를 보이고 있습니다.
힌트 :
if(i > j)
System.out.println(); // ()안을 채워주세요.
else if(i < j)
System.out.println(); // ()안을 채워주세요.
else
System.out.println(); // ()안을 채워주세요.
P8 (if 조건문)
사용자에게 점수를 물어보고 그 점수에 해당하는 등급을 출력하는 프로그램을 작성하시오. 클래스 이름은 Grader로 하시오. 등급별 점수는 아래와 같습니다. A: 90점 이상 B: 80점 이상 C: 70점 이상 D: 60점 이상 F: 60점 미만
실행화면은 아래와 같습니다.
P9 (반복문, 조건문)
사용자로부터 자연수 하나를 받은 후, 1부터 그 수까지의 자연수 중에서 짝수들의 합을 구해 출력하는 프로그램을 작성하시오. 클래스 이름은 Summation3으로 지으시오. 아래 두 가지 방법으로 각각 계산하시오.
-
for 반복문을 사용한다. 인덱스 i를 2부터 2만큼씩 증가시키면서 i를 누적함으로써 짝수의 합을 구한다.
-
for 반복문을 사용한다. 인덱스 i를 1부터 1만큼씩 증가시키면서 i가 짝수일 때만 i를 누적함으로써 짝수의 합을 구한다. i가 짝수인지 판별하려면 if 문장을 사용하여 i를 2로 나눈 나머지가 0인지 살펴본다.
실행 예는 아래 그림과 같습니다. 1 미만의 수는 입력하지 않는다고 가정합니다.
힌트 :
import java.util.Scanner;
public class MultipleAdder
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.print("1부터 얼마까지의 짝수를 더하시겠습니까?");
int n = input.nextInt();
int i;
int sum = 0;
/* for 문장을 이용하여 i를 2만큼씩 증가하도록 합니다.
이곳에 작성
*/
System.out.println("첫 방법: 1부터" + n + "까지의 짝수의 합 = " + sum);
/* for 문장을 이용하여 i를 1만큼씩 증가시키면서 i가 짝수일 때만 더해주도록 합니다.
이곳에 작성
*/
System.out.println("첫 방법: 1부터" + n + "까지의 짝수의 합 = " + sum);
input.close();
}
}
P10 (표준입력, 표준출력 전환)
메모장으로 177을 입력한 후 in.txt라는 이름의 파일로 저장하시오.
Summation3를 실행하되, 입력을 in.txt로부터 받고 출력을 out.txt 파일로 내보내도록 하시오. (Summation3.java 소스코드를 수정할 필요는 없습니다. 명령어창에서 프로그램을 실행시킬 때 input redirection과 output redirection을 설정해 주면 됩니다.)
실행 결과 out.txt 파일이 프로그램에 의해 새로 만들어졌는지 확인하시오. (dir 명령어 이용)
또 out.txt에 올바른 출력이 적혔는지 확인하시오. out.txt 파일의 내용을 보려면 명령어창에서 “type out.txt”라는 명령을 내립니다.
out.txt 파일의 내용을 보면 입력프롬프트, 즉 “1부터 얼마까지의 짝수를 더하시겠습니까?”라는 부분이 있어 어색합니다. 입력 프롬프트라는 것이 원래 키보드와 콘솔(모니터)을 이용하여 사용자와 대화형으로 작동할 때 필요한 것이므로, 입력과 출력을 파일로 전환(redirection)한 경우에는 입력 프롬프트를 내보내는 것이 부자연스럽습니다.
Summation3 프로그램에서 입력 프롬프트를 출력하는 문장(위 프로그램 코드의 9번 줄 ‘System.out.print(“1부터 얼마까지의 짝수를 더하시겠습니까?”);’)을 삭제하고 Summation4로 클래스 이름을 바꾸고 Summation4.java 파일에 저장하시오.
Summation4를 실행하되, 입력을 in.txt로부터 받고 출력을 out.txt 파일로 내보내도록 하시오. out.txt 파일에 올바른 출력이 적혔는지 확인하시오.