본 문서는 Java를 이용한 클래스 구현 및 설계 연습을 다룹니다. 첫 번째 연습에서는 은행 계좌를 나타내는 Account 클래스를 완성하고, 두 번째 연습에서는 주민등록번호를 기반으로 생년월일과 나이를 계산하는 IdentityCard 클래스를 설계합니다.
연습 1: 은행 계좌 클래스 구현
1. Account 클래스 완성
Account.java 파일은 은행 계좌를 표현하는 클래스입니다. 다음 요구사항에 맞춰 클래스의 일부 메서드를 완성하세요. 이 연습에서는 프로그램 실행 및 테스트는 포함되지 않습니다.
toString()메서드: 계좌 소유주 이름, 계좌 번호, 잔액 정보를 포함하는 문자열을 반환하도록 구현합니다.chargeFee()메서드: 계좌에서 서비스 수수료를 차감하도록 구현합니다.chargeFee()메서드 수정: 서비스 수수료 차감 후 변경된 계좌 잔액을 반환하도록 수정합니다.changeName()메서드: 계좌 소유주의 이름을 변경하는 기능을 구현합니다. 이 메서드는 새로운 이름을 문자열 매개변수로 받습니다.
2. ManageAccounts 클래스 활용
ManageAccounts.java 파일은 Account 클래스를 사용하는 예제 프로그램입니다. 주석에 따라 코드를 완성하여 Account 클래스의 기능을 테스트하세요.
Account.java (완성된 코드)
package J08;
public class Account {
private double balance;
private String name;
private long acctNum;
public Account(double initBal, String owner, long number) {
balance = initBal;
name = owner;
acctNum = number;
}
public void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
} else {
System.out.println("잔액이 부족합니다.");
}
}
public void deposit(double amount) {
balance += amount;
}
public double getBalance() {
return balance;
}
public String toString() {
return "이름: " + name + ", 계좌 번호: " + acctNum + ", 잔액: " + balance;
}
public void chargeFee(double fee) {
balance -= fee;
}
public double chargeFeeAndReturnBalance(double fee) {
balance -= fee;
return balance;
}
public void changeName(String newName) {
name = newName;
}
}
ManageAccounts.java (완성된 코드)
package J08;
public class ManageAccounts {
public static void main(String[] args) {
Account acct1 = new Account(1000, "Sally", 1111);
Account acct2 = new Account(500, "Joe", 1112);
acct2.deposit(100);
System.out.println("Joe의 계좌 잔액: " + acct2.getBalance());
acct1.withdraw(50);
System.out.println("Sally의 계좌 잔액: " + acct1.getBalance());
acct1.chargeFee(15);
acct2.chargeFee(15);
System.out.println("Sally의 계좌 잔액 (수수료 차감 후): " + acct1.getBalance());
System.out.println("Joe의 계좌 잔액 (수수료 차감 후): " + acct2.getBalance());
acct2.changeName("Joseph");
System.out.println(acct2.toString());
System.out.println(acct1.toString());
}
}
연습 2: 신분증 정보 추출 설계
주어진 주민등록번호에서 생년월일과 나이를 추출하는 Java 프로그램을 작성합니다. ReadIdCard 클래스와 IdentityCard 클래스를 활용하며, 다음 요구사항을 만족하도록 코드를 완성해야 합니다.
- 주민등록번호의 6번째부터 14번째 자리까지는 생년월일을 나타냅니다.
IdentityCard.java (완성된 코드)
package J08;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class IdentityCard {
public static void main(String[] args) throws ParseException {
ReadIdCard idReader = new ReadIdCard();
String idNumber = idReader.getIdCard();
System.out.println("주민등록번호: " + idNumber);
String year = idNumber.substring(6, 10);
String month = idNumber.substring(10, 12);
String day = idNumber.substring(12, 14);
System.out.println("생년월일: " + year + "년 " + month + "월 " + day + "일");
int age = calculateAge(year, month, day);
System.out.println("나이: " + age);
}
public static int calculateAge(String birthYear, String birthMonth, String birthDay) {
Calendar today = Calendar.getInstance();
Calendar birthDate = Calendar.getInstance();
birthDate.set(Integer.parseInt(birthYear),
Integer.parseInt(birthMonth) - 1, // 월은 0부터 시작
Integer.parseInt(birthDay));
int age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);
// 생일이 지나지 않았으면 나이에서 1을 뺌
if (today.get(Calendar.DAY_OF_YEAR) < birthDate.get(Calendar.DAY_OF_YEAR)) {
age--;
}
return age;
}
}
ReadIdCard.java (완성된 코드)
package J08;
import java.util.Scanner;
public class ReadIdCard {
private String idCardNumber;
public String getIdCard() {
Scanner scanner = new Scanner(System.in);
System.out.print("주민등록번호를 입력하세요: ");
this.idCardNumber = scanner.nextLine();
// TODO: 입력된 주민등록번호의 유효성 검사 로직 추가 (선택 사항)
return this.idCardNumber;
}
}