
스칼라(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