스칼라(Scala) : 하나의 크기
벡터(Vector) : 하나의 타입이 연속적으로 이루어진 것
object : 여러가지 정보를 필요로 함
상태가 하나여도 행위가 있음
기본 자료형으로 표현 가능한 것
1. 요객의 요구사항에 맞는 오브젝트 설정
고객이 계좌이체를 할 수 있는 서비스 만들기
계좌 : 은행, 계좌번호, …
돈 : 돈
계좌번호 : 계좌번호
고객 : 이름, 나이, 성별, …
신용 : 이름, 등급, …
은행 : 은행 이름, 위치, 규모, 직원, …
은행원 : 이름, 나이, 직급, …
고객의 요구 사항에 맞게 만들기
유지 보수하기 쉬운 코드를 만들어야 함
계획과 설계는 처음부터 완벽할 수 없음
요구사항에 맞게 작게 설정해서 피드백 받아가면서 수정, 디버깅 해나가야 함(중간 중간 실행하는 습관도 중요함)
2. 트랜잭션 작성하기
트랜잭션 : 일의 최소 단위
하나의 트랜잭션 안에 여러개의 작업이 있음
상대적인 것 : 정의되는 일을 다 수행해야 완료
하나라도 실패하면 종료
object = 모델
따로 분리해놔야 관리가 편함
고유 번호를 가지면 좋음
고유 번호가 필요한 이유 ?
heap에 여러 개가 뜰 수 있어 구분이 필요함
final : new가 될 때 반드시 초기화 되어야 함
안그럼 오류남
디폴트 접근 제어자 : 앞에 아무것도 없는 것
같은 패키지에서만 접근 가능함
양쪽에 다 연결되는 것은 변수로 관리해야 오류가 안 남
return; : main에 있는 큐의 프로그램 강제 종료
메서드 종료
조건문을 쓸 때 ?
필터링하듯이 걸러내야함
비정상적인 것을 넣어서 짜야 코드가 깔끔
기븐 : 주어지는 데이터 / 고객에게 받는 것
생성자 : 추후에 변경될 가능성이 있으면 메서드가 필요함
상태를 변경하는 메서드는 상태가 바뀌는 애가 만들어야함
메서드는 하나의 책임(일)만 가짐
3. 서비스 작성하기
이체는 출금과 입금이 동시에 일어나기에 오류가 날 수 있음
한번에 관리하기 위해서 트랜잭션으로 만들어야 함
객체는 자기의 상태를 변경하는 메서드만 있으면 됨
서비스의 역할 : 실제 서비스 명
긍정으로 물어보는게 좋음
BankApp 코드
package ex04.example; import ex04.example.model.Account; import ex04.example.model.User; public class BankApp { public static void main(String[] args) { // 1. 고객 2명 만들기 User ssar = new User(1, "ssar", "ssar@nate.com"); User cos = new User(2, "cos", "cos@nate.com"); User love = new User(3, "love", "love@nate.com"); // 2. 계좌 2개 만들기 Account ssarAccount = new Account(1111, 1000L, 1); Account cosAccount = new Account(2222, 1000L, 2); Account loveAccount = new Account(3333, 1000L, 3); // 3. 고객에게 정보를 받기 (amount) long amount = 100L; // 4. 이체 (ssar -> cos 100원) BankService.transfer(ssarAccount, cosAccount, amount); // 5. 이체 (ssar -> love 100원) BankService.transfer(ssarAccount, loveAccount, amount); // 6. 이체 (cos -> love 100원) BankService.transfer(cosAccount, loveAccount, amount); // 7. 객체 상태 확인 System.out.println(ssarAccount); System.out.println(cosAccount); System.out.println(loveAccount); } }
package ex04.example; import ex04.example.model.Account; // 트랜잭션 관리 public class BankService { public static void transfer(Account senderAccount, Account receiverAccount, long amount) { //상태 확인도, 변경도 아님 if (amount <= 0) { System.out.println("0원 이하 금액을 이체할 수 없습니다."); return; } // 이체 트랜잭션 if(senderAccount.잔액부족하니(amount)) { System.out.println("잔액이 부족합니다"); return; } senderAccount.withdrawal (amount); receiverAccount.deposit (amount); } }
package ex04.example.model; public class User { private final int id; private String name; private String email; public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } // 추후에 변경될 가능성이 있으면 메서드가 필요함 @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } }
package ex04.example.model; // 객체의 상태를 변경, 객체의 상태를 확인(private이기 때문) public class Account { private final int id; private long balance; private int userId; // 잔액 확인(상태 확인) public boolean 잔액부족하니(long amount) { if(balance < amount){ return true; } return false; } // 메서드는 하나의 책임만 가짐 public void withdrawal(long amount) { // 객체의 상태 변경 this.balance = this.balance - amount; } public void deposit(long amount) { this.balance = this.balance + amount; } public Account(int id, long balance, int userId) { this.id = id; this.balance = balance; this.userId = userId; } @Override public String toString() { return "Account{" + "id=" + id + ", balance=" + balance + ", userId=" + userId + '}'; } }
출금 항목 추가
package ex04.example.model; // 객체의 상태를 변경, 객체의 상태를 확인(private이기 때문) public class Account { private final int id; private long balance; private int userId; // 잔액 확인(상태 확인) public boolean isBalanceInsufficient(long amount) { if(balance < amount){ return true; } return false; } // 메서드는 하나의 책임만 가짐 public void withdrawal(long amount) { // 객체의 상태 변경 this.balance = this.balance - amount; } public void deposit(long amount) { this.balance = this.balance + amount; } public Account(int id, long balance, int userId) { this.id = id; this.balance = balance; this.userId = userId; } @Override public String toString() { return "Account{" + "id=" + id + ", balance=" + balance + ", userId=" + userId + '}'; } }
package ex04.example; import ex04.example.model.Account; // 트랜잭션 관리 public class BankService { public static void withdrawal(Account withdrawalAccount, long amount){ if (amount <= 0) { System.out.println("0원 이하 금액을 출금할 수 없습니다."); return; } if(withdrawalAccount.isBalanceInsufficient(amount)) { System.out.println("잔액이 부족합니다"); return; } withdrawalAccount.withdrawal(amount); } public static void transfer(Account withdrawalAccount, Account depositAccount, long amount) { //상태 확인도, 변경도 아님 if (amount <= 0) { System.out.println("0원 이하 금액을 이체할 수 없습니다."); return; } // 이체 트랜잭션 if(withdrawalAccount.isBalanceInsufficient(amount)) { System.out.println("잔액이 부족합니다"); return; } withdrawalAccount.withdrawal (amount); depositAccount.deposit (amount); } }
Share article