1. 학습 주제: 객체지향적 사고로 JAVA 프로그래밍하기
✔️역할을 기준으로 객체를 분류한다.
✔️ 객체는 단일책임원칙을 지켜야한다.
✔️ 데이터 정보를 외부에서 다른 객체가 획득하지 못하도록 한다.
(외부 객체가 획득하게 되면 변화에 민감해짐. 유지보수 비용 높아짐)
✔️ 객체가 가지고 있는 메소드는 외부 객체가 이용할 기능을 제공한다.
(재사용이 높을 수록 메소드를 정의할 필요성이 높아짐)
✔️ 메소드를 언제 쓸지 모르고 객체에 메소드를 많이 정의하는 경우, 객체가 무거워진다.
✔️ 메소드를 전부 정의할 수는 없음. 설계단계에서 적당한 선을 고민해봐야함.
✔️클래스는 최소한으로 설계하되, 최대한 재사용하도록 한다.
2. 과제
1) 구매횟수에 따라 누적 포인트 점수 계산하기.
- 3회 미만 : 구매횟수*20점
- 3회 이상: 구매횟수*30점
- 5회 이상: 구매횟수*50점
- 10회 이상: 구매횟수*100점
2) 회원등급은 누적포인트 점수에 따라 부여하기.
- 누적포인트 100점 이하: "Family"
- 100점 ~ 299점 : "Gold"
- 300점 ~ 500점 미만 : "VIP"
- 그 이상: "VVIP"
3) 이달의 최고 회원에게는 추가 포인트 10000점 추가 적립하기.
3. 해결 과정
저는 원래 코딩을 하기 전에 생각나는 대로 메모장에 어떻게 기능을 구현할지 계획을 세우고
자연어를 코드로 바꿔가는 과정을 통해 개발을 해왔는데요.
객체지향적 사고로 몇 개의 클래스를 만들지, Main에서 어떤 클래스에 접근하게 만들어야하는지는
카카오클라우드스쿨에서 처음 배웠습니다.
객체지향적으로 클래스 다이어그램을 먼저 설계하니
객체지향적 언어인 JAVA를 이제야 제대로 활용하게 되는 것 같더라고요👍
✔️클래스 다이어그램 설계
어떤 클래스를 만들지, 어떤 변수를 사용할지 구상을 합니다.
Main에서 Member클래스에 직접 접근하지 않고 중간에 MemberManager 클래스를 추가하여
간접 접근을 하도록합니다.
⭐Main에서 직접 접근을 하면, 객체지향 프로그래밍의 핵심 원칙 중 하나인 "책임 분리"에 어긋납니다.
- Main에서 Member를 생성하고 관리하게 되면 Main은 너무 많은 책임을 갖게됩니다.
⭐Main에서 MemberManager 객체를 통해 Member 객체에 간접접근을 하면,
- Member는 자신의 데이터와 동작을 캡슐화하고, Main 클래스와의 직접적인 의존성을 최소화합니다.
4. 결과
(※제 코드가 답은 아닙니다..고칠 부분이 있다면 댓글 부탁드립니다.)
Main
package Day05;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
//MemberManager 객체생성
//이달의 최고회원을 뽑는 메서드: calcBestMember()
//출력 메서드: showMember()
//메서드들을 관리한다.
MemberManager manager = new MemberManager();
//Member 인스턴스들 생성
manager.createMembers();
//이달의 최고회원을 뽑는 메서드
manager.calcBestMember();
//출력메서드
manager.showMember();
}
}
Manager
package Day05;
import java.util.ArrayList;
import java.util.List;
public class Member {
private String mid;//회원아이디
private String mname;//회원명
private String registerDay;//가입일
//Date타입을 사용해야하지만, 아직 안배움!
private int buyCnt;//구매횟수
private int accumPoint;//누적포인트
private String mclass;//회원등급
private boolean bestMem;//이달의최고회원
//모든 클래스는 초기화를 담당하는 '생성자'를 무조건 포함해야한다.
public Member(String id,String name,String day,int cnt) {
this.mid = id;
this.mname = name;
this.registerDay = day;
this.buyCnt = cnt;
this.accumPoint = 0;
this.mclass = null;
//메소드를 호출한다.
calcPoint();//누적포인트 계산하기
memberClass();//회원등급 부여하기
}
//이달의최고회원을 판단하기 위해 필요하다.
public int getCnt() {
return buyCnt;
}
//누적포인트를 계산후, 인스턴스에 결과를 set해준다.
public void setAccumPoint(int accumPoint) {
this.accumPoint = accumPoint;
}
//회원등급을 구분하고, 인스턴스에 결과를 set해준다.
public void setClass(String c) {
this.mclass = c;
}
//이달의 최고회원인지 아닌지, true,false로 구분한다.
public void setBest(boolean b) {
this.bestMem = b;
}
//누적포인트구하기
public int calcPoint() {
//값 초기화
int accumPoint = 0;
int cnt = this.buyCnt;
if(cnt < 3) {
accumPoint = cnt*20;
} else if (cnt < 5) {
accumPoint = cnt*30;
} else if (cnt < 10) {
accumPoint = cnt*50;
} else {
accumPoint = cnt*100;
}
this.setAccumPoint(accumPoint);
return accumPoint;
}
//회원등급 정하기
public String memberClass() {
int point = this.accumPoint;
if(point < 100) {
mclass = "Family";
} else if(point < 300) {
mclass = "Gold";
} else if(point < 500) {
mclass = "VIP";
} else {
mclass = "VVIP";
}
this.setClass(mclass);
return mclass;
}
//최대구매횟수 구하기(클래스변수 사용)
public static int maxCount(List<Member>member) {//멤버를 List에 담고 반복문을 돌렸다.
int maxCnt = 0; //값 초기화
for(Member m:member) {
if(m.getCnt() > maxCnt) { //구매횟수가 maxCnt보다 크면 maxCnt을 다시 정의(?)해준다.
maxCnt = m.getCnt();
}
}
return maxCnt;
}
//이달의 최고회원에게 포인트 추가하기
public void addPoints(int addNum) {//문제에선 10000점을 추가하지만, 추가점수가 바뀔 경우를 고려하여 인수를 따로 받았다.
this.accumPoint += addNum;
}
//출력한다.
public void display() {
System.out.println("회원아이디:"+mid+" 이름:"+mname+" 가입일:"+registerDay+" 구매횟수:"+buyCnt+" 누적포인트점수:"+accumPoint+" 회원등급:"+mclass);
}
}
MemberManager
package Day05;
import java.util.ArrayList;
import java.util.List;
public class MemberManager {
private List<Member> members;//Member클래스의 인스턴스들을 members변수에 담는다.
//생성자
public MemberManager(){
members = new ArrayList<>();
}
//Member객체에 member를 추가해준다.
public void addMember(Member member){
members.add(member);
}
//이달의 최고회원을 구한다.
public void calcBestMember(){
int maxCnt = Member.maxCount(members); //Member객체에 있는 메서드를 이용한다.
for(Member member : members){ //리스트를 순회하며 구매횟수가 maxCnt와 같으면 bestMem을 true로.
if (member.getCnt() == maxCnt) {
member.setBest(true);
member.addPoints(10000); //추가누적점수 10000점!
}
}
}
public void showMember() { //출력메서드. Member객체에 있는 display와 헷갈릴까봐 show로 명명했다.
for(Member member:members){
member.display();
}
}
public void createMembers(){
//Member객체의 인스턴스들을 생성해준다.
Member mobj1 = new Member("1","홍길동","20120212",3);
Member mobj2 = new Member("2","김길동","20120812",2);
Member mobj3 = new Member("3","이길동","20130112",10);
Member mobj4 = new Member("4","박길동","20110912",11);
Member mobj5 = new Member("5","최길동","20100712",6);
Member mobj6 = new Member("6","한길동","20120112",8);
//member를 추가해준다.
//MemberManager객체에서 여러 메서드들을 이용하려면 members변수에 담겨야하기 때문이다.
addMember(mobj1);
addMember(mobj2);
addMember(mobj3);
addMember(mobj4);
addMember(mobj5);
addMember(mobj6);
}
}
5. 오늘의 회고
"나를 믿자"
각자 속도가 다를 수도 있고 나는 나를 믿기 때문에 이대로 천천히 끈기있게 한다면
오래 걸려도 성장할 수있다.
작년 4월에 HTML을 처음 배웠는데 이 정도면 아주 잘하고 있는게 분명하다!
나 화이팅! 모두 화이팅!
'프로그래밍 언어 > Java' 카테고리의 다른 글
[과제] UML에 맞게 싱글톤 패턴 적용하기 (0) | 2023.12.18 |
---|---|
[Java] 싱글톤 패턴 개념 및 구현방법 (0) | 2023.12.18 |
[Java] 업캐스팅(Upcasting)과 다운캐스팅(Downcasting) (0) | 2023.12.18 |
[Java] StringBuilder 사용 이유 & 주요 메서드 (0) | 2023.12.17 |
[과제] 상속, 오버라이딩 (1) | 2023.12.16 |