기록

*18일차 실습 본문

학원/실습

*18일차 실습

pringspring 2022. 2. 16. 15:37

@실습문제: 포인트관리시스템

1. Member#getEjaPoint를 자식클래스에서 의무적으로 재작성할수 있도록 하세요.
2.각 등급별 물건구매시 차등할인율을 적용한 실제구매금액을 구하라.
구매할인율은 등급별 이자포인트율과 동일함.
* 인터페이스 Buyable
* 추상메소드 int buy(int price)
* 컨틀롤클래스 MemberManager
* 회원별구매내역출력메소드 void printBuyInfo(int price)출력 : Silver등급회원 홍길동는 10000원 상품을 9800원에 구매합니다.
Silver등급회원 고길동는 10000원 상품을 9800원에 구매합니다.
Silver등급회원 홍동민는 10000원 상품을 9800원에 구매합니다.
Gold등급회원 김회장는 10000원 상품을 9500원에 구매합니다.
Gold등급회원 이회장는 10000원 상품을 9500원에 구매합니다.
Gold등급회원 오회장는 10000원 상품을 9500원에 구매합니다.
Vip등급회원 이순신는 10000원 상품을 9000원에 구매합니다.
VVip등급회원 신사임당는 10000원 상품을 8500원에 구매합니다.@실습문제3 : 이자포인트율이 30%인 Ruby등급을 추가하고, 출력메소드에 함께 출력되게하세요.출력:
----------------------   정보출력   ------------------------
이름              등급              포인트             이자포인트
홍길동             Silver          1000            20.00
고길동             Silver          2000            40.00
홍동민             Silver          3000            60.00
김회장             Gold            1000            50.00
이회장             Gold            2000            100.00
오회장             Gold            3000            150.00
이순신             Vip             10000           1000.00
신사임당             VVip            100000          15000.00
세종             Ruby            500000          150000.00
-----------------------------------------------------------
Silver등급회원 홍길동는 10000원 상품을 9800원에 구매합니다.
Silver등급회원 고길동는 10000원 상품을 9800원에 구매합니다.
Silver등급회원 홍동민는 10000원 상품을 9800원에 구매합니다.
Gold등급회원 김회장는 10000원 상품을 9500원에 구매합니다.
Gold등급회원 이회장는 10000원 상품을 9500원에 구매합니다.
Gold등급회원 오회장는 10000원 상품을 9500원에 구매합니다.
Vip등급회원 이순신는 10000원 상품을 9000원에 구매합니다.
VVip등급회원 신사임당는 10000원 상품을 8500원에 구매합니다.
Ruby등급회원 세종는 10000원 상품을 7000원에 구매합니다.
-----------------------------------------------------------

 

 

package member.model.vo;

public class Silver extends Member {

	public Silver() {
	}

	public Silver(String name, String grade, int point) {
		super(name, grade, point);
	}

	@Override
	public double getEjapoint() {
		return super.getPoint() * 0.02;
	}

	@Override
	public int buy(int price) {
		return price - (int) (price * 0.02);
	}
}
------------------------------------------------
package member.model.vo;

public class Ruby extends Member {
	public Ruby() {
	}

	public Ruby(String name, String grade, int point) {
		super(name, grade, point);
	}

	@Override
	public double getEjapoint() {
		return super.getPoint() * 0.3;
	}

	@Override
	public int buy(int price) {
		return price - (int) (price * 0.3);
	}
}
--------------------------------------------------
package member.model.vo;

public class Gold extends Member {

	public Gold() {
	}

	public Gold(String name, String grade, int point) {
		super(name, grade, point);
	}

	@Override
	public double getEjapoint() {
		return super.getPoint() * 0.05;
	}

	@Override
	public int buy(int price) {
		return price - (int) (price * 0.05);
	}

}
----------------------------------------------------
package member.model.vo;

public class Vip extends Member {
	public Vip() {
	}

	public Vip(String name, String grade, int point) {
		super(name, grade, point);
	}

	@Override
	public double getEjapoint() {
		return super.getPoint() * 0.1;
	}

	@Override
	public int buy(int price) {
		return price - (int) (price * 0.1);
	}
}
-------------------------------------------------
package member.model.vo;

public class VVip extends Member {
	public VVip() {
	
	}

	public VVip(String name, String grade, int point) {
		super(name, grade, point);
	}

	@Override
	public double getEjapoint() {
		return super.getPoint() * 0.15;
	}

	@Override
	public int buy(int price) {
		return price - (int) (price * 0.15);
	}
}

 

package member.model.vo;

/**
 * 추상메소드와 상수필드로만 구성된 추상클래스의 변형체.
 * 
 * 추상메소드 : 클래스에 추상메소드를 추가
 * 인터페이스 : 메소드의 통일성을 부여하기 위해 추상메소드만 모음. 
 * 
 *
 */
public interface Buyable {
	int buy(int price);
}
----------------------------------------
package member.model.vo;

public abstract class Member implements Buyable{
	/*protected*/
	private String name;
	private String grade;
	private int point;
	
	public Member(){}
	
	public Member(String name, String grade, int point) {
		this.name = name;
		this.grade = grade;
		this.point = point;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	public int getPoint() {
		return point;
	}
	public void setPoint(int point) {
		this.point = point;
	}
	
	// 추상메소드를 통한 메소드 구현을 강제화
	public abstract double getEjapoint();
		
}

 

package member.controller;


import member.model.vo.Member;

public class MemberManager {
	public static final int MAX_MEMBER = 40;
	private Member[] memberArr = new Member[MAX_MEMBER];
	private int memberIndex = 0;
	
	//다형성 
	public void insertMember(Member m){
		this.memberArr[memberIndex++] = m;
	}
	
	public void printData() {
		System.out.println("-----------정보출력-------------");
		System.out.printf("%-15s %-15s %-15s %-15s\n", "이름","등급","포인트","이자포인트");
		for(int i = 0; i < memberIndex; i++){
			Member m = memberArr[i];
			System.out.printf("%-15s %-15s %-15d %-15.2f\n", 
							  m.getName(), 
							  m.getGrade(), 
							  m.getPoint(), 
							  m.getEjapoint());
		}
	}
	
	//인터페이스: 
	//Member타입이 Buyable인터페이스를 구현하고 있으므로, 별도의 형변환 없이 buy메소드 사용가능
	public void printBuyInfo(int price) {
		for(int i = 0; i < memberIndex; i++)
			System.out.printf("%s등급회원 %s는 %d원 상품을 %d원에 구매합니다.\n", 
							  memberArr[i].getGrade(), 
							  memberArr[i].getName(), 
							  price, 
							  memberArr[i].buy(price)
							);
	}
}
-----------------------------------------------------------------
package member.run;

import member.controller.MemberManager;
import member.model.vo.Gold;
import member.model.vo.Ruby;
import member.model.vo.Silver;
import member.model.vo.VVip;
import member.model.vo.Vip;

public class Run {
	public static void main(String[] args){
		MemberManager m = new MemberManager();
//		m.silverInsert(new Silver("홍길동", "Silver",1000));
//		m.silverInsert(new Silver("고길동", "Silver",2000));
//		m.silverInsert(new Silver("홍동민", "Silver",3000));
//		m.goldInsert(new Gold("김회장", "Gold",1000));
//		m.goldInsert(new Gold("이회장", "Gold",2000));
//		m.goldInsert(new Gold("오회장", "Gold",3000));
//		m.vipInsert(new Vip("최순실", "Vip",10000));
//		m.vvipInsert(new VVip("박근혜", "VVip",100000));

		m.insertMember(new Silver("홍길동", "Silver",1000));
		m.insertMember(new Silver("고길동", "Silver",2000));
		m.insertMember(new Silver("홍동민", "Silver",3000));
		m.insertMember(new Gold("김회장", "Gold",1000));
		m.insertMember(new Gold("이회장", "Gold",2000));
		m.insertMember(new Gold("오회장", "Gold",3000));
		m.insertMember(new Vip("최순실", "Vip",10000));
		m.insertMember(new VVip("박근혜", "VVip",100000));
		
		//@실습문제3 : Ruby등급추가 
		m.insertMember(new Ruby("문재인", "Ruby", 500000));
		
		m.printData();
		
		//[[4]] 물건구매시 할인된 가격출력
		m.printBuyInfo(10000);
		
		
		
	}
}

 

 

 


#다형성 실습문제2
@실습문제 1


패키지명 : com.oop.shape.model
부모 클래스명 : Shape  --------------------------------------
추상메서드 :
public abstract double area(); //면적 계산 리턴용
public abstract double perimeter(); //둘레 계산 리턴용

파생클래스 1 : Rectangle  -----------------------------------
Field : double width, height;
Method : getter/setter 작성
생성자 작성 : default, 가로,세로 값 초기화 생성자

파생클래스 2 : Circle  -----------------------------------------
Field : 원주율은 Math.PI 사용
double radius;
Method : getter/setter 작성
생성자 작성 : default, 반지름값 초기화 생성자

패키지명 : com.oop.shape.controller
테스트 클래스 : TestShape  ---------------------------------
메인에서 다형성 사용 원객체와 사각형객체 생성하고,
면적과 둘레 출력
{
Shape s;
s = new Circle(15.5);
System.out.println("원면적 : " + s.area());
System.out.println("원둘레 : " + s.perimeter());

s = new Rectangle(34.5, 42.7);
System.out.println("사각형면적 : " + s.area());
System.out.println("사각형둘레 : " + s.perimeter());
}

 

package com.oop.shape.model;
import java.math.*;

public class Circle extends Shape{
	private double radius; //반지름
	
	public Circle(double radius) {
		this.radius=radius;
	}
	

	public double getRadius() {
		return radius;
	}

	public void setRadius(double radius) {
		this.radius = radius;
	}

/**
 * 원 넓이
 * 반지름*반지름*PI
 */

	@Override
	public double area() {
		return Math.PI*Math.pow(radius,2);
	}
/**
 * 지름*PI
 */
	@Override
	public double perimeter() {
		return ((2*Math.PI)*radius);
	}

}
----------------------------------------------
package com.oop.shape.model;

public class Rectangle extends Shape{
	private double width;
	private double height;

	
	public Rectangle(double width, double height) {
		super();
		this.width = width;
		this.height = height;
	}
	public double getWidth() {
		return width;
	}
	public void setWidth(double width) {
		this.width = width;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}

	
	@Override
	public double area() {
		return (width * height);
	}
	
	
	@Override
	public double perimeter() {
		return 2*(width+height);
	}
	
	
}
------------------------------------------------
package com.oop.shape.model;

public abstract class Shape { //추상클래스 
	
	public abstract double area(); //면적 계산 리턴용
	public abstract double perimeter(); //둘레 계산 리턴용

}

 

'학원 > 실습' 카테고리의 다른 글

*20일차 실습  (0) 2022.02.21
*19일차 실습  (0) 2022.02.17
*17일차 실습  (0) 2022.02.15
*16일차 실습  (0) 2022.02.14
*15일차 실습 (객체배열 실습문제)  (0) 2022.02.11