JAVA/Do it! 자바 프로그래밍 입문

[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2 연습문제

yun.data 2023. 3. 25. 09:44

 

Q1. 클래스 내부에서 자신의 주소를 가리키는 예약어를 this라고 합니다.

 

Q2. 클래스에 여러 생성자가 오버로드 되어 있을 경우에 하나의 생성자에서 다른 생성자를 호출할 때 this를 사용합니다.

 

Q3. 클래스 내부에 선언하는 static 변수는 생성되는 인스턴스마다 만들어지는 것이 아닌 여러 인스턴스가 공유하는 변수입니다. 따라서 클래스에 기반한 유일한 변수라는 의미로 클래스 변수라고도 합니다.

 

Q4. 지역 변수는 함수나 메서드 내부에서만 사용할 수 있고 스택 메모리에 생성됩니다. 멤버 변수 중 static 예약어를 사용하는 static 변수는 데이터 영역 메모리에 생성됩니다.

 

 

 

 

 

Q5. 아침 출근길에 김 씨는 4,000원을 내고 별다방에서 아메리카노를 사 마셨습니다. 이 씨는 콩다방에서 4,500원을 내고 라떼를 사 마셨습니다. 이 과정을 객체 지향으로 프로그래밍해 보세요.

 

[Person.java]

public class Person {
	
	public String personName;
	public int money;
	
	public Person(String personName, int money) {
		this.personName = personName;
		this.money = money;
	}
	
	public void buyStar(StarCoffee sCoffee, String menu) {
		System.out.print(this.personName + " 님");
		this.money -= sCoffee.takeStarCoffee(menu);
		System.out.println("현재 보유 금액: " + this.money);
	}
	
	public void buyBean(BeanCoffee bCoffee, String menu) {
		System.out.print(this.personName + " 님");
		this.money -= bCoffee.takeBeanCoffee(menu);
		System.out.println("현재 보유 금액: " + this.money);
	}
}

 

[StarCoffee.java]

public class StarCoffee {
	
	public int takeStarCoffee(String menu) {
		if(menu == "Americano") {
			System.out.println(" 별다방 아메리카노 결제 -4,000원");
			return 4000;
		} else if(menu == "Latte") {
			System.out.println(" 별다방 아메리카노 결제 -4,500원");
			return 4500;
		} else {
			System.out.println(" 잘못된 입력입니다.");
			return 0;
		}
	}
}

 

[BeanCoffee.java]

public class BeanCoffee {

	public int takeBeanCoffee(String menu) {
		if(menu == "Americano") {
			System.out.println(" 콩다방 아메리카노 결제 -4,000원");
			return 4000;
		} else if(menu == "Latte") {
			System.out.println(" 콩다방 아메리카노 결제 -4,500원");
			return 4500;
		} else {
			System.out.println(" 잘못된 입력입니다.");
			return 0;
		}
	}
}

 

[CoffeeTest.java]

public class CoffeeTest {

	public static void main(String[] args) {
		
		StarCoffee sCoffee = new StarCoffee();
		BeanCoffee bCoffee = new BeanCoffee();
		
		Person kim = new Person("Kim", 10000);
		Person lee = new Person("Lee", 10000);
		
		kim.buyStar(sCoffee, "Americano");
		lee.buyBean(bCoffee, "Latte");
	}
}

 

[실행 결과]

Kim 님 별다방 아메리카노 결제 -4,000원
현재 보유 금액: 6000
Lee 님 콩다방 아메리카노 결제 -4,500원
현재 보유 금액: 5500

 

 

 

 

 

Q6. 카드 회사에서 카드를 발급할 때마다 카드 고유 번호를 부여해 줍니다. 카드가 생성될 때마다 카드 번호가 자동으로 증가할 수 있도록 카드 클래스를 만들고 생성해보세요.

 

[Card.java]

public class Card {
	
	private int userCardNumber;
	private static int cardNumber = 0;
	
	public Card() {
		cardNumber++;
		userCardNumber = cardNumber;
	}
	
	public int getCardNumber() {
		return userCardNumber;
	}
}

 

 

[CardTest.java]

public class CardTest {
	
	public static void main(String[] args) {
		Card kim = new Card();
		Card lee = new Card();
		
		System.out.println("kim’s Card Number: " + kim.getCardNumber());
		System.out.println("lee’s Card Number: " + lee.getCardNumber());
	}
}

 

[실행 결과]

kim’s Card Number: 1
lee’s Card Number: 2

 

 

 

 

 

Q7. Q6에 구현한 내용에 카드 회사 클래스 CardCompany를 싱글톤 패턴을 사용하여 구현해 보세요.

 

[CardCompany.java]

public class CardCompany {
	
	private static CardCompany instance = new CardCompany();
	private CardCompany() {}
	
	public static CardCompany getInstance() {
		if(instance == null) {
			instance = new CardCompany();
		}
		return instance;
	}
	
	public Card createCard() {
		Card card = new Card();
		return card;
	}
}

 

 

[CardTest.java]

public class CardTest {
	public static void main(String[] args) {
		CardCompany cardCompany = CardCompany.getInstance();
		
		Card choi = cardCompany.createCard();
		Card park = cardCompany.createCard();
		
		System.out.println("choi’s Card Number: " + choi.getCardNumber());
		System.out.println("park’s Card Number: " + park.getCardNumber());
	}
}