Java 시간에 진행하였던 예제이다. BankAccount.java이며 내가 작성했던 코드와 답 코드를 맞추어보기로 한다.
내가 작성한 코드
class Customer extends Thread { //쓰레드 고객 클래스
String name;
int amount;
int balance;
Customer(String n, int a, int b) {
name = n;
amount = a;
balance = b;
}
public void run() {
BankBook.addMoney(String n,int a,int b);
BankBook.subMoney(String n,int a,int b);
}
}
class BankBook { //공유자원 통장 클래스
String name;
synchronized void addMoney(String n,int a,int b){
b=balance+amout;
System.out.println(name+"이"+a+"입금하여"+"잔액은"+b+"원");
}
synchronized void subMoney(String n,int a,int b){
b=balance-amount;
System.out.println(name+"이"+a+"출금하여"+"잔액은"+b+"원");
}
class BankAccount {
pubic static void main(String[] args){
Customer p1 = new Customer("첫번째 사람");
Customer p2 = new Customer("두번째 사람");
Customer p3 = new Cumstomer("세번째 사람");
p1.start();
p2.start();
p3.start();
}
답 코드
class Account {
private int total_money=0; // private가 아니라 클래스형 변수로 정의한다면?
synchronized void deposit(String name,int money) { // 입금하다
total_money+=money;
System.out.println(name+"이"+money+"입금하여 잔액은"+total_money+"원");
}
synchronized void withdrawal(String name,int money) { // 출금하다
total_money-=money;
System.out.println(name+"이"+money+"출금하여 잔액은"+total_money+"원");
}
}
class Man extends Thread {
Account account;
Man(Account act,String name){
super(name);
account=act;
}
public void run() {
for(int i=0;i<5;i++){
account.deposit(getName(),1000);
account.withdrawal(getName(),w100);
}
}
}
public class BankAccount2 {
public static void main(String[] args) {
Account tongjang = new Account();
Man m1 = new Man(tongjang,"첫번째 사람");
Man m2 = new Man(tongjang,"두번째 사람");
Man m3 = new Man(tongjang,"세번째 사람");
m1.start();
m2.start();
m3.start();
}
}
main 클래스부터 차근차근 보도록 하자.
(나)
class BankAccount {
_pubic _static void main(String[] args){
Customer p1 = new Customer(tongjang,"첫번째 사람");
Customer p2 = new Customer(tongjang,"두번째 사람");
Customer p3 = new Cumstomer(tongjang,"세번째 사람");
p1.start();
p2.start();
p3.start();
}
}
(수정)
public class BankAccount2 {
public static void main(String[] args) {
Account tongjang = new Account();
Man m1 = new Man(tongjang,"첫번째 사람");
Man m2 = new Man(tongjang,"두번째 사람");
Man m3 = new Man(tongjang,"세번째 사람");
m1.start();
m2.start();
m3.start();
}
}
지금 보니 내 코드에서 사람 객체 생성 시 cumstomer 라고 오답도 났다.
각 쓰레드 객체가 공유하는 공유자원인 tongjang에 대해서 매개변수 값으로 넣어주지도 않았다.
public을 pubic 이라고 썼다.
공유자원인 tongjang 객체 선언 생성도 해주지 않았다.
쓰레드 클래스 (나)
class Customer extends Thread { //쓰레드 고객 클래스
String name;
int amount;
int balance;
Customer(String n, int a, int b) {
name = n;
amount = a;
balance = b;
}
public void run() {
BankBook.addMoney(String n,int a,int b);
BankBook.subMoney(String n,int a,int b);
}
}
쓰레드 클래스(답)
class Man extends Thread {
Account account;
Man(Account act,String name){
super(name);
account=act;
}
public void run() {
for(int i=0;i<5;i++){
_account.deposit(getName(),1000); _
_ account.withdrawal(getName(),100); _
}
}
}
공유자원 클래스 (나)
class BankBook { //공유자원 통장 클래스
String name;
synchronized void addMoney(String n,int a,int b){
b=balance+_amout_;
System.out.println(name+"이"+a+"입금하여"+"잔액은"+b+"원");
}
synchronized void subMoney(String n,int a,int b){
b=balance-amount;
System.out.println(name+"이"+a+"출금하여"+"잔액은"+b+"원");
}
공유자원 클래스 (답)
class Account {
private int total_money=0; // private가 아니라 클래스형 변수로 정의한다면?
synchronized void deposit(String name,int money) { // 입금하다
total_money+=money;
System.out.println(name+"이"+money+"입금하여 잔액은"+total_money+"원");
}
synchronized void withdrawal(String name,int money) { // 출금하다
total_money-=money;
System.out.println(name+"이"+money+"출금하여 잔액은"+total_money+"원");
}
}
1. 괄호 닫아주는 것도 마지막에 } 를 해주지 않았다.
2. 잔액을 정의하는 변수는 공유자원 클래스에서 따로 정의를 해줬어야 한다. 그래야 잔액에서 입금,출금 메소드를 이용하여 잔액에서 돈을 더해나가거나 빼나가야 한다.
3. amount도 amout 라고 변수 오타가 났다.