본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 29~36일차 - 팀프로젝트 <로또 프로그램>

주제

 

📢 로또 시뮬레에션 프로젝트 주제 선정 이유

① 실제로 판매가 가능한 프로그램이 가능함. 상업성이 있다.

② 복잡한 자료 구조를 가지고 있다. → 자료를 다루는 연습을 하는 것.

③ 복잡한 자료를 GUI로 사용자가 편하게 사용할 수 있게 → GUI 다루는 연습 할 수 있음.

 

📢 로또 시뮬레에션 프로그램 목표

① 자바 환경이 실행 가능한 개인 PC에서, 가상의 로또 시뮬레이션을 수행하고자 한다.

② GUI로 구성하며 프로그램을 반복해서 사용 가능하도록 진행한다.

 

📢프로그램 구성 계획

1차 ) 번호 선택 방법을 자동/수동/반자동, 세 가지 방법으로 구성하며, 결과 확인 버튼을 눌러 그 즉시 당첨 결과를 확인할 수 있다.

2차 ) 첫 화면을 추가로 만들어, 그 화면에서 로또 금액을 설정할 수 있다. 

 

📢 로또 룰 조사

로또는 45개의 숫자 중, 맞춘 숫자의 개수로 등수를 정한다.

당첨 번호 6개, 그리고 보너스 번호 1개

1등 2등 3등 4등 5등
6개 5개 + 보너스 번호 5개 4개 3개 2개 이하

 

📢 조원

이은진, 김도연, 박가영, 정혜인

 

📢 1차 역할 분담.

개발 : 은진, 도연

퍼블리싱 : 가영, 혜인

 

📢 2차 역할 분담

기능 추가 및 GUI 연결

자동 -GUI 연결 : 은진, 가영

수동 -GUI 연결 : 도연, 혜인

 

📢 규칙

첫째, 팀원 별 역할과 과제 분담

둘째, 정기 회의를 통해 아이디어 공유 및 취합

셋째, 모든 내용은 기록하고 서로가 습득할 수 있도록 공유

 

 

협업과정

 

✅ 어플리케이션에서 다뤄야 할 데이터 파악

① 데이터 흐름 파악하기

② 데이터의 유효 기간(어느 데이터가 언제 생성되고 얼마만큼 지속되어야 하는지)

✅기능적 계획 / 기술적 계획

① 재사용이 필요한 부분 찾기

② 외부 자원(그림 파일 등)의 사용 - 만들어 쓸 것인지 / 있는 걸 가져다가 쓸 것인지

✅ 팀원과 협업 과정

✅ 팀원 책임 영역 결정

✅ 회의

  • 회의는 어떻게 어디서 언제
  • 조원별 분업은 어떻게
  • 오더 진행사항 확인은 어떻게

✅ 작업물을 검토할 수 있는 사람

  • 문제의 발견은 어떻게?
  • 팀원의 구현 과정이 진행되지 않는 경우는?
  • 조원 작업물 병합 방법은?
  • 문제(오류, 결함, 이슈, 새 요청사항 등) 발견시 관리는 어떤 방식으로수정/개선 작업은 누가 언제 어떻게
  • 대기시간이 생기는 경우는 어떻게
  • (작업/최종 마무리) 시간 배분은 어떻게

 

UI 구상

 

 

 

과정

 

1. GUI 화면 구현

WindowBuilder로 메인창과 결과창의 ui구현

 

2. 기능 구현

메인 기능 → 부가 기능 순서대로 기능 구현

(확인버튼 → 자동선택버튼 → 결과보기(결과창 연결) → 수정하기 → 초기화, 삭제, 닫기 등)

 

3. 오류 수정

예외적인 상황으로 인해 발생할 수 있는 오류 확인 및 수정 

 

4. 추가 기능

이전 회차 당첨 번호 보기, 이전 기록 보기 등 기능 추가

 

5. 리펙터링

코드 정리, 메소드로 변경 및 중복 제거

 

 

기능

 

[프로그램 기능]

로또번호를 선택(수동/반자동/자동) → 확인(수정 및 삭제하여 번호 변경가능)→ 결과보기(구매하기) → 당첨결과 확인

 

[추가 구현 기능]

이전 회차 당첨 번호 보기, 게임 회차별 기록 보기

 

 

 

1. 45개의 숫자 버튼 

사용자의 클릭으로 선택 받고 확인할 수 있도록 토글 버튼 사용

 

2. 자동 선택 버튼

(1) 토글 숫자 버튼을 랜덤으로 선택될 수 있도록 함.

(2) 자동 선택 버튼 연속 사용 가능 선택된 숫자가 이미 6개이지만(사용자의 선택 or 자동 선택 버튼) 자동 선택 버튼을 다시 눌렀을 때 다시 랜덤 값을 뽑기 위해 45개의 버튼을 모두 초기화후 랜덤 뽑기 다시 진행.

 

3. 확인 버튼

(1) 선택한 숫자를 이중 배열에 저장, 화면에 출력

(2) 공 색깔 정해주기 A~E (로또공 Label 이중 배열)에 저장한 숫자를 범위에 해당하는 색의 공 이미지와 출력함. 

(3) 사용자의 선택 완료 시(총 5번의 기회) 추가 선택 불가

(4) 사용자가 계산해야 하는 총 가격 계산 각 행의 첫 번째 열의 값 존재 유무를 확인하여 가격 계산함

(5) 사용자의 선택 값의 타입 정하기 (수동, 자동, 반자동) 확인 버튼 누르기전 마지막으로 누른 버튼 찾기 getWhen() 메소드를 사용해서 시간을 구하고 대소 비교함. →사용자의 선택과 그 선택의 취소, 다시 선택 등의 반복으로 여러 경우 고려함.

(6) 수정 중인 상태에서 확인 버튼을 눌렀을 때 타입 정하기 숫자 변경 없음 - 저장된 기존 타입 출력 자동 선택 버튼 - 자동/ 숫자버튼 0~5개 - 반자동/ 숫자버튼 6개 - 자동

 

4. 결과 보기 버튼

(1) 결과를 볼 수 있는 창을 생성, 저장된 결과를 화면에 출력

(2) 사용자의 당첨 여부, 등수, 금액 출력 미리 저장되어 있는 당첨번호와 사용자의 선택을 비교하여 당첨 여부, 등수, 금액을 출력함. 

(3) 화면 포커스 변경

 

5. 회차별 당첨번호 보기

최근 회차의 당첨 번호를 확인할 수 있음.

콤보박스를 활용하여 사용자의 선택을 통해 해당 회차 이미지 출력

 

6. 게임 회차별 기록 보기

이전 기록 볼 수 있는 창을 생성, 게임 회차별로 선택한 숫자를 저장하여 화면에 출력.

 

 

결과

 

 

02)_로또_시뮬레이션.pdf
1.87MB

 

최종 발표 자료.pdf
6.85MB

 

3조.jar
0.09MB

 

 

 

피드백

 

1. 정보 흐름 복잡

GUI와 정보를 따로 분리해서 만들지 않고, GUI에 정보를 바로 담아서 코드가 복잡해졌으며, 정보를 정보로써 다루기 힘들다.

ex) int 타입으로 정보를 가지고 있으면 좋을 정보들의 값을 따로 저장하지않고, label에 값을 바로 넣음 → 정보가 필요할때마다 label에서 getText()로 값을 얻고 Integer로 변환하여 값을 비교하는 과정이 매우 비효율적

 

2. 중복되는 컴포넌트를 배열로 만들 때 순서 유의

배열 생성 → 배열의 인덱스로 접근하여 컴포넌트를 생성하여 참조 및 설정 (X)

컴포넌트를 생성 및 설정 → 배열의 인덱스값에 참조 (O)

 

3. 클래스마다 중복돼서 사용되는 정보는 클래스로 따로 만든 후 참조하여 사용

이미지와 같이 클래스마다 중복돼서 사용되는 정보는 클래스를 생성하여 필요한 정보들을 필드로 만든 후 클래스를 참조하여 사용하기

public class MyImage {
	ClassLoader classLoader = getClass().getClassLoader();
	Toolkit kit = Toolkit.getDefaultToolkit();
	private Image img = kit.getImage(classLoader.getResource("test.png"));
    public Image getImg() {
    	return img;
    }
}
public class Exe {
	public static void main(String[] args) {
		JLabel lblNewLabel = new JLabel();
		lblNewLabel.setIcon(new ImageIcon(myImage.getImg()));
	}
}