홍순구 튜터님의 달리기 강의를 따라가면서 공부하고 있다.
step2에 캡슐화 단계 문제가 있어 부족한 부분이니 풀기로 했다.
[난이도: 하] 🧑🎓 안전한 학생 정보 클래스
Student 클래스를 만드세요.name(이름)과 score(점수)를 모두 private 으로 선언하세요.getName(): 이름을 반환하는 게터.getScore(): 점수를 반환하는 게터.setScore(int score): 점수를 설정하는 세터. 단, 점수는 0점 이상 100점 이하일 경우에만 설정되도록 유효성 검사 로직을 추가하세요.main 메서드에서 학생 객체를 만들고, setScore()를 통해 올바른 점수와 잘못된 점수(예: 101점)를 모두 넣어보며 테스트해보세요.package kr.spartaclub.running.day01.chapter16;
public class Student {
private String name;
private int score;
public Student(String name) {
this.name = name;
this.score = 0;
}
public String getName() {return name;}
public int getScore() {return score;}
public void setScore(int score) {
if (score < 0 || score > 100) {
throw new IllegalArgumentException("점수는 0~100 사이만 가능합니다.");
}
this.score = score;
}
public static void main(String[] args) {
Student sd = new Student("길중");
sd.setScore(89);
System.out.println("점수: " + sd.getScore());
try {
sd.setScore(-1);
System.out.println("점수: " + sd.getScore());
}catch (RuntimeException e){
System.out.println(e.getMessage());
}
sd.setScore(100);
System.out.println("점수: " + sd.getScore());
}
}
[난이도: 중] 🏦 철통보안 은행 계좌
SecureAccount 클래스를 만드세요.accountNumber(계좌번호), owner(예금주), balance(잔액), password(비밀번호)를 모두 private 으로 선언하세요.deposit(int amount): 입금 메서드. (입금액은 0보다 커야 함)withdraw(int amount, String inputPassword): 출금 메서드. 비밀번호가 일치하고, 잔액이 충분할 때만 출금이 성공해야 합니다.getBalance(String inputPassword): 잔액 조회 메서드. 비밀번호가 일치할 때만 잔액을 return 하고, 틀리면 -1을 return 하세요.main 메서드에서 계좌를 만들고, 비밀번호를 맞게/틀리게 입력하며 입금, 출금, 잔액 조회를 모두 테스트해보세요.package kr.spartaclub.running.day01.chapter17;
public class SecureAccount {
private String accountNumber; // 계좌번호
private String owner; // 예금주
private int balance; // 잔액
private String password; // 비밀번호
public SecureAccount(String accountNumber, String owner, int balance, String password) {
this.accountNumber = accountNumber;
this.owner = owner;
this.balance = balance;
this.password = password;
}
// 입금
public void deposit(int amount) {
if (amount > 0) {
System.out.println("입금: "+amount);
balance += amount;
}
else {System.out.println("입금액은 0보다 커야 합니다.");}
}
//출금
public boolean withdraw(int amount, String inputPassword) {
if (!password.equals(inputPassword)) {
System.out.println("비밀번호가 일치하지 않습니다.");
return false;
}
if (amount <= 0) {
System.out.println("출금액은 0보다 커야 합니다.");
return false;
}
if (balance < amount) {
System.out.println("잔액이 부족합니다.");
return false;
}
System.out.println("출금: "+amount);
balance -= amount;
return true;
}
// 잔액 조회
public int getBalance(String inputPassword){
if(password.equals(inputPassword)){
System.out.println("잔액: "+balance);
return balance;
}else {
return -1;
}
}
public static void main(String[] args) {
SecureAccount secureAccount = new SecureAccount("97369822852","최길중",0,"456123");
secureAccount.deposit(90000); // 입금
secureAccount.withdraw(9000,"456123"); // 출금
secureAccount.getBalance("456123"); // 잔액 조회
}
}
[난이도: 상] 🎬 영화 예매 시스템
Movie 클래스를 만드세요.title(제목-public), totalSeats(총 좌석 수-private), bookedSeats(예약된 좌석 수-private).bookSeat(): 좌석을 예매하는 public 메서드. 이 메서드 내부에서는 isBookable() 이라는 private 메서드를 호출해서 예매 가능한지 먼저 확인해야 합니다. 예매에 성공하면 bookedSeats를 1 증가시키고 "예매 성공!"을 출력하세요.isBookable(): 남은 좌석이 있는지 확인하는 private 메서드. (totalSeats > bookedSeats)getAvailableSeats(): 현재 예매 가능한 좌석 수를 계산해서 반환하는 public 메서드.main 메서드에서 총 10석짜리 영화를 만들고, 11번 예매를 시도해보며 캡슐화된 로직이 잘 동작하는지 확인해보세요.package kr.spartaclub.running.day01.chapter18;
public class Movie {
public String title;
private int totalSeats; // 총 좌석 수
private int bookedSeats; // 예약된 좌석 수
private Movie(String title, int totalSeats){
this.title=title;
this.totalSeats=totalSeats;
}
// 좌석 예매
public void bookSeat(){
if (isBookable()==true){
System.out.println("예매 성공!!");
bookedSeats++;
}
else{
System.out.println("자리가 부족합니다.");
}
}
// 예매 가능 여부
private boolean isBookable(){
if(totalSeats>bookedSeats){
return true;
}else {
return false;
}
}
public int getAvailableSeats(){
return totalSeats-bookedSeats;
}
public static void main(String[] args) {
Movie movie = new Movie("아바타",10);
for(int i=1; i<=11; i++){
System.out.println(i + "번째 예매 시도");
movie.bookSeat();
System.out.println("남은 좌석: " + movie.getAvailableSeats());
}
}
}
이번 자바 발제를 풀면서 “개념을 제대로 잡고, 문제를 많이 풀어봐야 실력이 는다”는 확신이 생겼다. 다들 어려워하는 람다, 스트림, 제네릭은 물론이고, 그 외에도 아직 부족한 부분이 많다. 강의도 아마 6~7번은 반복해서 본 것 같은데, 그래도 완전히 이해했다고 말하긴 어렵다.
그래서 이제는 강의만 보는 데서 멈추지 않고, 문제를 계속 풀면서 감을 잡아보려고 한다. 수학도 결국 같은 메커니즘이다. 근의 공식을 아무리 외워도 문제에 적용해봐야 내 것이 되고, 미적분이나 기하,벡터 도 결국 반복해서 풀어봐야 실력이 오른다.
계산기를 한 번 더 풀어보려고 했으나 해설 강의가 있으니 보고 익히고 다른 발제를 풀어보고 싶은 궁금증도 있어 커머스 과제로 갔습니다.
이번엔 진짜 칼 갈아서 발제 완벽하게 끝낼 겁니다.