BankAccount.java

smkim·2021년 10월 10일
0
post-custom-banner

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();
}
}

  1. 지금 보니 내 코드에서 사람 객체 생성 시 cumstomer 라고 오답도 났다.

  2. 각 쓰레드 객체가 공유하는 공유자원인 tongjang에 대해서 매개변수 값으로 넣어주지도 않았다.

  3. public을 pubic 이라고 썼다.

  4. 공유자원인 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); _
	}
} 
}
  1. main 클래스에서 객체 생성시에 넘어오는 tongjang 객체와 name을 받아올 변수만 따로 생성자에 정의를 해주면 되는데
    여기서 이름,잔액,입출금액 변수를 따로 정의하였다.
  2. 쓰레드 run() 메소드 안에서는 각 쓰레드가 작업할 내용을 적어주면 되는데 쓰레드가 동작하는 deposit,withdrawal 메소드가 5번씩 일하면 되므로 for문이 들어갔어야 한다. (메소드 정의가 아니라)
  3. 쓰레드가 일을 하면서 getName()을 통해 객체 생성 시에 넘겨온
    이름을 저장한다. 1000원(입금), 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 라고 변수 오타가 났다. 



profile
컴퓨터공학과 학생 brandy 입니다. 개발+기획에 관심이 있지만, 개발 실력이 뛰어나진 않지만 성장하고자 하기 위해 벨로그를 작성합니다.
post-custom-banner

0개의 댓글