[Java] 클래스와 객체 - 예제2

나영원·2020년 8월 27일
0

Java_basic

목록 보기
30/60

Q1. 정보은닉

날짜의 유효성을 검증하는 프로그램을 구현해 보세요

다음과 같은 MyDate 클래스가 있습니다.

-day, month, year변수는 private으로 선언합니다.
-각 변수의 getter, setter를 public으로 구현합니다.
-MyDate(int day, int month, int year) 생성자를 만듭니다.
-public boolean isVaild() 메서드를 만들어 날짜가 유효한지 확인합니다.
-MyDateTest 클래스에서 생성한 MyDate 날짜가 유효한지 확인합니다.

public class MyDate {
	//1 번
	private int day;
	private int month;
	private int year;	
	private boolean isValid = true;
	//2번
	public MyDate(int day, int month, int year) {
		setYear(year);
		setMonth(month);
		setDay(day);						
	}	
	//3번
	public int getDay() {
		return day;
	}
    public void setDay(int day) {
		
		this.day = day;
		
		switch(month) {
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			if (day >31 || day < 0) {
				isValid = false;
			} 
			break;
		case 4: case 6: case 9: case 11:
			if (day > 30 || day < 0) {
				isValid = false;
			} 
			break;
		case 2:
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )//윤년여부
            {
				if (day <0 || day >29) {
					isValid = false;
				} 
			} else {
				if (day <0 || day >28) {
					isValid = false;
				} 
			}
			break;
			default : isValid = false;
		} 
		
	}
    //4번
    public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		this.month = month;	
		
		if(month > 12 || month < 1) {
			isValid = false;
		} 
	}
	//5번
    public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
		
		if( year < 1 ) {
			isValid = false;
		}
	}
	//6번
	public void isValid() {
	
		if(isValid) {
			System.out.println( "유효한 날짜입니다.");
		} else {
			System.out.println( "유효하지 않은 날짜입니다.");
		}		
	}
  • 1번 : MyDate 클래스를 만들고 day, month, year를 멤버 변수로 선언 해주고 유효성을 검사하는데 사용할 isVaild변수 또한 boolean형으로 선언해 줍니다.
  • 2번 : MyDate 생성자에 매개변수로 int day, int month, int year을 잡아주고 구현문에 뒤에 입력메서드로 만들 set(~)메서드를 넣어줍니다. 이 때 뒤에 조건문을 사용하기 위해 year - month - day 순으로 작성해주어야 합니다.
  • 3번 : day getter setter 문을 작성 해 줍니다. setDay 메서드에 switch-case문을 사용하여 각 월별 최대일수의 범위를 지정해주고 2월은 윤년여부를 체크하는 조건문을 하나 더 만들어서 넣어줍니다.
  • 4번 : month getter setter 문을 작성해 줍니다. setMonth 메서드에 조건문을 통해 month의 범위를 지정해줍니다.
  • 5번 : year getter setter 문을 작성해 줍니다. setYear 메서드에 조건문을 통해 year의 범위를 지정해줍니다.
  • 6번: isValid 메서드를 만들고 조건문을 작성하여 set(~)메서드에서 범위가 넘어간게 있다면 유효하지 않는 날짜입니다가 출력되도록 합니다.
public class MyDateTest {

	public static void main(String[] args) {

		
		MyDate date1 = new MyDate(29,2,2020);
		date1.isValid(); // 유효한 날짜입니다.
		
		MyDate date2 = new MyDate(29,2,2019);
		date2.isValid(); // 유효하지 않은 날짜입니다.
		
	}

}

테스트를 위해 MyDataTest 클래스를 만들고 date1과 date2 인스턴스를 만들어 1년차이나는 2월 29일을 입력했을 때 윤년여부에 따라 유효성 테스트가 되는 것을 확인할 수 있습니다.

Q2. 객체 간 협력

출근길 커피 사기

아침 출근길에 김 졸려씨는 4000원을 내고 별다방에서 아메리카노를 사 마셨습니다.
이 피곤 씨는 콩다방에서 4500원을 내고 라떼를 사 마셨습니다.
객체 간의 협력 강의를 참고하여 객체 지향 방법으로 구현해 보세요.

public class BeanCoffee {
	//1
	public int price;
	public int income;
	//2
	public BeanCoffee() {
				}
	//3
	public String sellBeanCoffee(int price) {
		income+=(price);
				
		if (price == 4200) {
		   return "콩 다방 아메리카노를 구입했습니다.";
		} else if (price == 4500) {
			return  "콩 다방 라떼를 구입했습니다.";
		} else {
		return null;
		}
		
	}
}
  • 1번 : BeanCoffee 클래스를 만들고 필요한 멤버변수를 선언해 줍니다.
  • 2번 : BeanCoffee 생성자를 만드는데 내용이 빈 기본생성자이니 생략해도 됩니다.
  • 3번 : BeanCoffee 를 팔때 해줘야 할 작업들을 sellBeanCoffee 메서드를 작성합니다. inome을 price만큼 중가시켜주고 가격에 따라 아메리카노 혹은 라떼를 구입했다는 String 값을 return합니다.
public class StarCoffee {
	
	public String shopName;	
	public int price;
	public int income;
	
	public StarCoffee() {
	
		shopName = "별 다방";
	}
	
	public String sellStarCoffee(int price) {
		income+=(price);
				
		if (price == 4000) {
		   return "별 다방 아메리카노를 구입했습니다.";
		} else if (price == 4300) {
			return  "별 다방 라떼를 구입했습니다.";
		} else {
		return null;
		}
		
	}
  • StarCoffe 클래스를 만들고 BeanCoffee와 동일한 역할을 하는 변수와 메서드를 작성해줍니다.
public class Person {
	//1번
	public String name;
	public int money;
	//2번
	public Person(String name) {
		this.name = name;
		money = 10000;
	}
    //3번	
	public void buyStarCoffee(StarCoffee starcoffee, int price) {
		String message = starcoffee.sellStarCoffee(price);
		if(message != null) {
			money -= price;
			System.out.println(name+" 님이 "+price+"으로 " + message );
		}
	}
	//4번	
	public void buyBeanCoffee(BeanCoffee beancoffee, int price) {
		String message = beancoffee.sellBeanCoffee(price);
		if(message != null) {
			money -= price;
			System.out.println(name+" 님이 "+price+"으로 " + message );
		}
	}
  • 1번 : 커피를 살 사람을 대표하는 Person 클래스를 만들고 멤버 변수로 name과 money를 선언합니다
  • 2번 : Person 생성자를 만드는데 name을 입력하게 하고 money는 동일하게 10000원씩 동일하게 소지함으로 입력받지 않고 바로 값을 대입해줍니다.
  • 3번 : buyStarCoffee 메서드를 만들고 매개변수로 starcoffee와 price를 잡아줍니다. 그후 sellStarCoffee메서드를 사용해 price에 따라 나오는 return값을 String message에 대입해주고 조건문을 통하여 message가 null이 아닌경우 money에서 price만큼 가격이 빠져나가고 상황에 맞는 메세지가 출력되도록 합니다.
public class CoffeTest {

	public static void main(String[] args) {
		//1번
		Person Lee = new Person("Lee");
		Person Kim = new Person("Kim");
		//2번
		StarCoffee starcoffee = new StarCoffee();
		BeanCoffee beancoffee = new BeanCoffee();
		//3번
		Lee.buyStarCoffee(starcoffee, 4000);
		//Lee 님이 4000으로 별 다방 아메리카노를 구입했습니다.
		Kim.buyBeanCoffee(beancoffee, 4500);
		//Kim 님이 4500으로 콩 다방 라떼를 구입했습니다.
	}
  • 1번 : CoffeeTest 클래스를 만들고 Person 인스턴스를 2개 만들어 줍니다.
  • 2번 : 각각 커피의 메서드를 사용하기 위해 Coffee 인스턴스도 각각 만들어 줍니다.
  • 3번 : person 클래스의 buyCoffee 를 사용하고 매개변수로 각coffee와 가격을 넣어주면 결과값이 나오는 것을 확인할 수 있습니다.
profile
배우는 개발 일기

0개의 댓글