티스토리 뷰

저번 시간에 학습한 Thread를 활용하여 ATM 기기 예제를 학습했다.

물론 Thread만을 학습하기 위해서 예제를 활용한 것은 아니구, Synchronization(동기화)를 학습하기 위해서 ATM기기 예제를 학습했다.

여러개의 은행카드(스레드)는 하나의 계좌(공용변수)에 입출금 할 수 있습니다. 동기화 처리를 하지 않는다면 스레드가 무분별하게 사용되어 원하는 값을 정확하게 추출하지 못하므로, 동기화 처리를 해서 한 시점에서 한 하나의 스레드만 공유된 값을 변경시킬 수 있도록 처리를 해야합니다.

 

 

class ATM_2{
	
	int total;
	
	public ATM_2(int total) {
		
		this.total = total;
	}
	
	synchronized void deposit(int amount, String name) {
		
		total += amount;
		System.out.println(name + " 님이 입금하신 금액은" + amount + " 입니다.");
	}
	
	synchronized void withdraw(int amount, String name) {
		
		if(total - amount > 0) {
			total -= amount;
			System.out.println(name + " 님이 출금하신 금액은" + amount + " 입니다.");
		}else {
			System.out.println("계좌에 돈이 부족하여 출금하실 수 없습니다.");
		}
	}
	
	void getTotal() {
		System.out.println("현재 계좌의 총 금액은 " + total);
	}
}


class ATM_USER_2 extends Thread{
	
	boolean flag = false;
	
	ATM_2 atm;
	
	public ATM_USER_2(ATM_2 atm, String name) {	
		super(name);
		this.atm = atm;
	}
	
	@Override
	public void run() {
		for(int i = 0;i < 5; i++) {
			try {
				sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			
			if(flag) {
				atm.deposit((int)(Math.random() * 10000), getName());
				atm.getTotal();
			}else {
				atm.withdraw((int)(Math.random() * 10000), getName());
				atm.getTotal();
			}
			
			flag =! flag;
		}
	}
}
	
public class MyATM_2{
	public static void main(String[] args) {
		
		
		ATM_2 atm = new ATM_2(10000);
		
		ATM_USER_2 obj = new ATM_USER_2(atm, "전민우");
		
		obj.start();
	}
}

 

메서드를 선언하기 전에 synchronized를 간단하게 붙혀 사용해서 동기화 처리를 해줄 수 있다. 

 

 

import java.util.Date;

public class Date_1 {
	public static void main(String[] args) {
		
		Date date = new Date();
		
		int h = date.getHours();
		int m = date.getMinutes();
		int s = date.getSeconds();
		
		System.out.println(" 현재 시간은 : " + h + " 시 " + m + " 분 " + s);
		
		if(h>12) {
			System.out.println(" 현재 시간은 오후 : " +(h - 12) + " 시 " + m + " 분 " + s + " 초 ");
		}else {
			System.out.println(" 현재 시간은 오전 : " +h + " 시 " + m + " 분 " + s + " 초 ");
		}
	}
}

그 밖에도 java.util.Date를 import해서 date 객체 속 getHours(), getMinutes(), getSeconds() 메서드로 현재 시간의 시, 분, 초를 출력할 수 있다.

 

class Queen{
	int number;
	
	public Queen(int num) {
		
		number = num;
	}
}

// ==는 주소 비교다.
// equals 내용 비교다.


public class Equals_1 {
	public static void main(String[] args) {
		
		Queen obj_1 = new Queen(27);
		Queen obj_2 = new Queen(27);
		
		if(obj_1.equals(obj_2)) {
			System.out.println("obj_1 과 obj_2는 같다");
		}else {
			System.out.println("obj_1과 obj_2는 다다다르르다다다");
			
			System.out.println("obj_1 : " + obj_1.getClass().hashCode());
			System.out.println("obj_2 : " + obj_2.getClass().hashCode() + "\n");
		}
		
		if(obj_1 == obj_2) {
			System.out.println("obj_1 과 obj_2는 같다");
		}else {
			
			System.out.println("obj_1과 obj_2는 다다다르르다다다");
			System.out.println("obj_1 : " + obj_1.hashCode());
			System.out.println("obj_2 : " + obj_2.hashCode()+ "\n");
		}
		
		obj_2 = obj_1;
		
		if(obj_1.equals(obj_2)) {
			System.out.println("obj_1 과 obj_2는 같다");
		}else {
			System.out.println("obj_1과 obj_2는 다다다르르다다다");
			
			System.out.println("obj_1 : " + obj_1.hashCode());
			System.out.println("obj_2 : " + obj_2.hashCode()+ "\n");
		}
		
		if(obj_1 == obj_2) {
			System.out.println("obj_1 과 obj_2는 같다");
		}else {
			
			System.out.println("obj_1과 obj_2는 다다다르르다다다");
			System.out.println("obj_1 : " + obj_1.hashCode());
			System.out.println("obj_2 : " + obj_2.hashCode());
		}

	}

}

기본적으로 Java에선 ==와 equals는 양쪽값의 비교를 통해 출력된 결과값을 boolean형태로 출력한다는 공통점이 있다.

하지만 equals()는 메서드이고, ==은 비교 연산자이기 때문에 분명한 차이점이 존재한다. 

 

1. equals()는 대상 자체를 비교하지만, == 비교 연산자는 대상의 주소값을 비교한다는 차이점이 있다.

 

public class Practice_1 {
	public static void main(String[] args) {
		
		
		String a = "aa";
		String b = a;
		String c = new String("aa");
		
		System.out.println(a == b); // true 같은 주소값을 가지고 있기 때문에.
		System.out.println(a.equals(b)); // true 같은 주소값을 가지고 있고, 변수 속에 저장되어 있는 값도 똑같기 때문에.
		System.out.println(a.equals(c)); // true 다른 주소값을 가지고 있더라도, 변수 속에 저장되어 있는 값이 같기 때문에.
		System.out.println(a == c); // false 다른 주소값을 가지고 있기 때문에.

	}
}

코드를 보면 바로 이해가 될 것이다 !!

'back > Java' 카테고리의 다른 글

KH 19일차(String 객체, Sorting, substring, indexOf, charAt)  (0) 2022.07.26
KH 18일차(Wrapper class)  (0) 2022.07.25
KH 16일차 (Thread, Runnable)  (0) 2022.07.21
KH 15일차 (Exception,Thread)  (0) 2022.07.20
KH 14일차  (0) 2022.07.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크