본문 바로가기

[JAVA] 개발

Java Software Solution Ch7_PP8 ; Interface, Class, toString()

책 Java Software Solution 9th Edition 의 문제 Chapter7 PP8

 

Write a Java interface called Lockable that includes the following methods: setKey, lock, unlock, and locked. The setKey, lock, and unlock methods take an integer parameter that represents the key. The setKey method establishes the key. The lock and unlock methods lock and unlock the object, but only if the key passed in is correct. The locked method returns a boolean that indicates whether or not the object is locked. A Lockable object represents an object whose regular methods are protected: if the object is locked, the methods cannot be invoked; if it is unlocked, they can be invoked. Write a version of the Coin class from Chapter 5 so that it is Lockable.

 

먼저, Interface 작성. // Lockable.java

package ch5;

public interface Lockable {
	public void setKey(int keyValue);
	public boolean lock(int keyValue);
	public boolean unlock(int keyValue);
	public boolean locked();
}

 

그 다음으로, 클래스 작성. // pp7_8.java

package ch5;

public class pp7_8 implements Lockable{
	private int key;
	private boolean locked;
	private final int heads = 0;
	private final int tails = 1;
	private int face;
	
	public void setKey (int keyValue) { this.key = keyValue; }
	public boolean lock(int keyValue) { 
		if(keyValue == key) { this.locked = true; return true; }
		else { return false; }
	}
	public boolean unlock(int keyValue) {
		if (keyValue == key) { locked = false; return true; }
		else { return false; }
	}
	public boolean locked() { return locked; }

	public pp7_8() { flip(); } //동전 던지기
	public int flip() { face = (int) (Math.random() * 2); return face; }
	public boolean isHeads() { return (face == heads); }
	public String toString() {
		String faceName;
		if(face==heads) faceName="Heads";
		else faceName="Tails";
		return faceName;
	}
}

 

실행할 main클래스 작성. // CoinDriver.java

package ch5;

import java.util.Scanner;

public class CoinDriver {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		pp7_8 coin = new pp7_8();
		
		coin.setKey(1234); //잠금 비밀번호 1234로 설정
		Scanner scanner = new Scanner(System.in);
		System.out.println("Enter the key");
		int key = scanner.nextInt();
		
		boolean result = coin.unlock(key); // 비밀번호가 일치하는지 안 하는지 판단.
		if(result) { coin.flip(); //unlock. 풀려있어야지만 동전 던지기(flip) 가능.
			System.out.println(coin); //동전이 앞면(Heads)인지 뒷면(Tails)인지 랜덤하게 나온다.
		}
		else System.out.println("Coin is locked. Cannot flip."); //lock. 풀려있지 않다.
	}
}

 

< 실행 결과 >

비밀번호가 틀렸다. 동전 던지기(filp)는 할 수가 없다.
비밀번호가 맞았고, 동전 던지기(filp)의 결과는 랜덤하게 'Heads'가 도출되었다.
비밀번호가 맞았고, 동전 던지기(filp)의 결과는 랜덤하게 'Tails'가 도출되었다.

 

 


coin이 앞면인지 뒷면인지 알려주는 toString()메서드가 어떠한 원리로 실행되는지 궁금하여 'ChatGPT'로부터 답변을 얻어냈다.

일반적으로 System.out.println() 메서드가 호출되면, 해당 객체의 toString() 메서드가 내부적으로 호출됩니다. 이는 자바의 기본 동작입니다.
따라서 System.out.println(coin);이 실행될 때는 coin 객체의 toString() 메서드만 호출되고, 다른 메서드들은 실행되지 않습니다. toString() 메서드만 실행되는 이유는 System.out.println() 메서드가 객체를 문자열로 변환하여 출력하기 위해 toString() 메서드를 호출하기 때문입니다.
다시 말씀드리자면, System.out.println(coin); 코드가 실행될 때는 pp7_8 클래스의 toString() 메서드만 호출되고, 다른 메서드들은 실행되지 않습니다.