빅데이터 Java 개발자 교육 - 03일차 [서점, 수강신청 시스템 만들기]

Jun_Gyu·2023년 2월 25일

3일차의 아침이 밝았다!

위쪽이 Item 클래스, 아래쪽이 메인클래스

어제내용을 이용해 복습해서 만든 물품정렬 코드다.

​

​

​

​

​

오늘은 진짜 정신없이 진도를 나갔다..

수업 속도만 따라가기도 벅찰정도로 매우 빠르게 나간다 ㅠㅠ

쉬는시간도 너무 빨리 지나가서 중간중간 블로그 포스팅하기가 쪼금 힘들다

​

벗 암오케

​

​

​

​

오늘은 제목처럼 책을 관리할 수 있는

서점을 만들어 보았다.

먼저 들어가기 전,

​

클래스를 추가하는 코드에 대한 이야기인데,

어제까지 배운 내용에 따르면 클래스에서 불러온 객체명에

하나하나 세부내용을 추가해주어야 했지만,

​

오늘 학습을 통해서

​

이러한 식으로 한번에

​

간편하게 추가 할 수가 있겠다.

​

그렇다면 어떤 방식으로 추가가 되느냐?

​

들어가기에 앞서서 먼저

실행되지 않는 클래스를 만들어 public 함수를 생성하고,

넣고싶은 항목을 추가해준다.

​

​

우리는 짱짱멋진 서점을 만들 계획이기에

책번호나 책제목, 저자, 가격 등을 넣을 수 있게

해당되는 내용들을 야무지게 준비해둔다.

​

​

그리고 여기서 원래라면

클래스의 아무 공간에 우클릭 이후 위 경로로 들어가서

​

​

지정해준 함수들을 모두 체크가 되어있다면 해제해준뒤 Generate를 눌러주고,

비어있는 public Book()을 한개 생성한 이후

써서 넣을 항목을 다시 추가하여 public Book을

2개 만들어서 써야하는 번거로움이 있었다.

​

(원래는 이렇게 만들어야 한다. 위 사진에서는 내가 책 넘버랑 제목만 대입해본다고 중간에 대충 만들어둔것이다 ㅎㅎ)

너무 귀찮고~

​

​

이렇게 긴 코드 대신에

어제 쓴 @Getter @Setter와 같이 import 롬복으로 해결이 가능하다.

(헉)

​

​

​

그리하면

이런식으로 간단하게 내가 넣고싶은 내용만 () 안에 추가하면 되겠다.

​

​

이제 본격적으로 서점을 만들어 볼 차례이다!

​

먼저 책을 정리시켜 줄 클래스를 하나 만들어보자.

package cls;

import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor

/*(롬복)@getter @setter @to String 등등은 클래스 변수 지정 이후 마지막에 해야함! ctrl + space*/

public class Book {

// == private Integer no1 = 0;
	private int no = 0;           // 책번호no
	private String title = "";    // 책제목title
	                              /* null과 "" 는 서로 다른것임! */
	private String author = "";   // 저자 author
	private long price = 0;       // 가격 12000
	private char cate = 'A';      // 분류 cate'A','B','C'
	private Date date = null;     // 등록일자 date

}

위의 코드는 도서관에 들어오게 될 모든 책들의 정보들을 저장하도록 만들어진

'Book.java'클래스 이다.

책의 번호, 제목, 저자, 가격, 분류와 등록일자와 같은 세부내용을 받아들일 수 있는 틀이 되게 된다.

​

​

이제 새로 들어올 책들을 관리해 줄 도서관이 필요하다!

새로운 클래스를 만들어 보자.

package cls;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
 
public class BookStore {

	private String phone = "";       // 전화번호
	private String address = "";     // 주소
	private Book[] books = null;     // 보유한 책 권수 배열
	private int idx = 0; // 현재 배열에 추가되어있는 책의 위치

    /** 왜 private를 꼭 추가해야하는가? **/
    // private는 해당 클래스에서만,
    // public은 패키지 내의 모든 클래스에서 사용이 가능함.

	// 생성자 1번만 사용가능함. 반환값 없음, 클래스명과 정확하게 일치
	// 준비물이 없는 빈 생성자
	public BookStore() {
		this.books = new Book[100];
	}

	// 책 등록하는 메소드(함수) 필요
	public void InsertBook(Book book) { // 왜 Book book이지??
		if (idx >= 100) {    // 보관하는 책이 100권까지 도달할 경우
			System.out.println("책 추가 불가");  // 책추가불가 메세지 출력
		} else { // 그 이외의 경우에는
			this.books[idx] = book; 
			idx++;
			// 책이 100권이 될때까지 0번부터 시작해서 계속해서 값이 저장됨.
		}
	}

	// 현재까지 등록된 책 목록 출력
	public void selectBook() {
		int i = 0;
		for (i = 0; i < idx; i++) { // idx는 현재 책이 들어가 있는 숫자를 나타냄
			System.out.println(this.books[i].toString());
		}
	}

	// 마지막 등록한 책을 삭제하는 메소드
	public void deleteBook() { // 여기에는 왜 Book book이 안들어가는가
		if (idx > 0) {
			idx--;
		}
	}

	// 문제) 등록한 책의 가격을 전달받은 할인율 변경 메소드
	public float discountPrice( float per ) {
		for (int i= 0; i<idx; i++){
			long price = this.books[i].getPrice(); // 책의 값을 가져와야하기 떄문에 ".get"을 사용해야 함!!
			//실수형 => 정수 => 결과값에 대한 손실이 일어날 수 있다.  형 변환은 항상 고려할것!!
			//int에서 long으로의 변환은 괜찮지만, 반대로의 변환은 결과값에 손실이 발생할 수 있다.
			long price1 = (int) (price - (price * per));
			this.books[i].setPrice(price1); // ".set" 을 이용하여 books 배열의 가격들을 변경해야 한다.
			
		}
		return 1;
	}

	// 문제) 가격이 X원 이상인 책 수량을 반환하는 메소드
	public void pirceQuery(int x) {
		int priceOver =0; // 반환된 책 수를 나타낼 변수, 초기값은 0으로 지정
		for (int i= 0; i<idx; i++) { // 반복문 추가로 책 모두 소환
		if (this.books[i].getPrice()>= x); // 만약 책 가격이 x원 이상인 경우,
		priceOver++; // 카운트를 1씩 올리고,
		}
		System.out.println( x +"원 이상인 책 수량 : " + priceOver + "권"); // 카운트된만큼 값을 출력
		
	}

	// 문제) 분류 코드가 전달받은 값의 항목만 출력하는 메소드
	public void printCate(char cate) {
		for(int i=0; i< idx ; i++) { // 반복문 추가
			if(this.books[i].getCate() == cate) { //만약 책의 분류코드가 전달받은 값과 일치할때,
				System.out.println(this.books[i].toString()); //저장된 책 목록 반환 
			}
		}
		
	}
}

사용될 모든 메소드들을 넣어놨다.

​

그렇다면 이제 이 친구들을 가지고 실행을 시킬 메인 클래스 코드를 짜보자.

package main2;

import java.util.Date;

import cls.Book;
import cls.BookStore;

public class Main2 {

	public static void main(String[] args) {
		// 서점이 생성됨. 책을 100권 보관 할 수 있는 배열 생성
		BookStore bookStore = new BookStore();
		bookStore.setAddress("051-707-7070");
		bookStore.setPhone("부산 남구");
	
		// 추가하고자 하는 책을 생성
		Book book = new Book(100, "자바배우기", "김철수", 1500, 'B', new Date());		
		Book book1 = new Book(10, "파이썬배우기", "김영희", 1500, 'A', new Date());		
        // 서점에 랜덤의 두권 책 등록
		
		//서점에  책 등록
		bookStore.InsertBook(book);
		bookStore.InsertBook(book1);

		// 마지막으로 등록한 책을 삭제하는 메소드
		//bookStore.deleteBook();
		
		//문제1) 등록된 책들의 할인 10% 적용
		bookStore.discountPrice(0.1f);
		
		// 현재까지 등록된 책 조회
		bookStore.selectBook();
		
		// 값이 500원 이상인 책들 출력
		bookStore.pirceQuery(500);
		
		// 책 분류가 B인 책들 모두 출력
		bookStore.printCate('B');
}
}

대충 이런 식으로 상황을 구성 하였다.

​

코드를 실행할 시

이러한 결과가 나오게 된다.

(주석달면서 마구잡이로 짜다보니 결과가 뒤죽박죽으로 나온다ㅎㅎ)

​

​

​

좀 더 과정을 심화해서

이번에는 대학교 수강신청 학생정보 시스템을 구성해보려고 한다

​

흐름은 위와 비슷하다.

​

조금 더 복잡할뿐이지..

​

package cls;

//수강정보시스템 만들기

import java.util.Date;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

public class Student {

	private int no = 0; // 학번
	private String name = ""; // 이름
	private int grade = 0; // 학년
	private Date date = null; // 등록일자

	// 생성자
	public Student() {
		super();
	}

	// 생성자
	public Student(int no, String name, int grade, Date date) {
		super();
		this.no = no;
		this.name = name;
		this.grade = grade;
		this.date = date;
	}
	
	// 학년을 1씩 증가시키기 ( 4학년까지만 )
	// 학년을 1씩 증가시키는 메소드
	public void plusGrade () {
		this.grade++; // 1 증가시키기
		if(this.grade>4) { // 만약 값이 4보다 크면
			this.grade = 4; // 학년값을 4학년으로 만들기
		}
	}

}

학교니까 학생이 있어야하는 법이다.

먼저 학생들을 관리할 클래스를 만들고..

(생성자는 원래 import로 처리하려했으나, 이해를 하기위해 일부로 썻다.)


다음으로는 수강 과목.

package cls;

//수강과목
import java.util.Date;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Course {

	private long code = 100000; // 과목코드
	private String name = null; // 과목명
	private int credit = 0; // 학점
	private Professor professor = null; // 강의교수
	private Date date = null; // 제이터베이스에 자료가 저장되는 시점 기록

	public Course() {
		super();
	}

	public Course(long code, String name, int credit, Professor professor, Date date) {
		super();
		this.code = code;
		this.name = name;
		this.credit = credit;
		this.professor = professor;
		this.date = date;
	}

}

그다음으로는 수강과목 저장 클래스

package cls;
// 등록된 교과목 목록을 저장하는 클래스


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class CourseList {

	// 10개를 보관할 수 있는 배열
	// 배열은 반드시 개수가 필요함.
	private Course[] courseArray = new Course[10];
	private int idx = 0; // 배열 내부의 개수를 저장하는 변수

	// 등록된 교과목의 교수정보 중에서 교수명과 교수방을 출력하는 메소드
	public void printProfessorNameAndRoom() {
		for (int i = 0; i < idx; i++) { // 등록되어있는 교과목 배열 가져오기
			Professor professor = this.courseArray[i].getProfessor(); 
         // Professor 클래스 들고오기

			System.out.println("교수명 : " + professor.getName());
			System.out.println("교수방 : " + professor.getRoom());
		}

	}

	// 등록된 교과목의 교수정보를 출력
	public void printProfessor() {
		for (int i = 0; i < idx; i++) { // 등록되어있는 교과목 배열 가져오기
			Professor professor = this.courseArray[i].getProfessor(); 
         // Professor 클래스 들고오기

			System.out.println(professor.toString());
		}
	}
	// 과목을 한개씩 등록 할 수 있는 메소드

	public void insertCourse(Course course) {
		if (this.idx < this.courseArray.length) {
			// idx는 현재 추가된 갯수 < 배열 전체의 갯수
			this.courseArray[idx] = course; // 배열 0부터 순차적으로 과목을 등록 (10개뿐임)
			this.idx++;
		} else {
			System.out.println("등록 불가");// 배열 최대치 10을 넘어갈 경우 등록불가 표출.
		}
	}

	// 추가된 과목 전체 내용 출력
	public void printCourse() {
		for (int i = 0; i < idx; i++) {
			System.out.println(this.courseArray[i].toString());
		}
	}

	// 마지막에 추가한 과목 삭제하는 메소드
	public void deleteCourse() {
		if (idx == this.courseArray.length) { // if idx값이 최대치 일때,
			idx--; // 마지막 내용 삭제

		}
	}

	// 과목중에서 전달받는 학점에 해당하는 과목 조회
	// ex) 3을 전달하면 3학점에 해당하는 과목만
	public void findCourse(Course credit) {

		for (int i = 0; i < idx; i++) {
			if (this.courseArray[i] == credit) {
				System.out.println(this.courseArray[i].toString());
			}

		}
	}
}

다음으로는 교수 등록 정보에 관한 내용이다.

package cls;

// 교수 관리 시스템
import java.util.Date;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Professor {
	private int code = 0; //교수코드
	private String name = null; // 교수이름
	private String room = null; // 교수실 (303호)
	private Date date = null; // 등록일자
	
	
	public Professor() {
		super();
	}


	public Professor(int code, String name, String room, Date date) {
		super();
		this.code = code;
		this.name = name;
		this.room = room;
		this.date = date;
	}

}

그리고 마지막으로 위의 클래스들을 이용해서 수강신청 클래스를 만들어 준다.

package cls;

import java.util.Date;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

// 수강신청
public class Register {

	private int code = 0; // 과목코드
	private Course course = null; // 신청과목
	private Student student = null; // 신청학생
	private Date date = new Date();

	public Register() {
		super();
	}

	public Register(int code, Course course, Student student, Date date) {
		super();
		this.code = code;
		this.course = course;
		this.student = student;
		this.date = date;
	}

}

이렇게 수강신청에 필요한 클래스들은 만들어주었고,

​

​

이제 한번 이를 토대로 메인클래스를 만들어보겠다.

package main2;

import java.util.Date;

import cls.Course;
import cls.CourseList;
import cls.Professor;

public class Main3 {

	public static void main(String[] args) {

		// 1. 교수 생성
		Professor professor = new Professor(3000, "신용권", "303호", new Date());

		// 2. 과목 생성
		Course course = new Course();
		course.setCode(4000);
		course.setCredit(3);
		course.setName("java배우기");
		course.setDate(new Date());
		course.setProfessor(professor);

		// 3. 과목 등록
		CourseList courseList = new CourseList();
		courseList.insertCourse(course);

		// 4. 과목 조회
		courseList.printCourse();

		// 5. 등록한 과목의 교수정보를 조회(출력)
		courseList.printProfessorNameAndRoom();
	}

}

위의 메인 코드 실행 결과는

​

Course(code=4000, name=java배우기, credit=3, professor=Professor(code=3000, name=신용권, room=303호, date=Wed Feb 01 16:57:36 KST 2023), date=Wed Feb 01 16:57:36 KST 2023)
교수명 : 신용권
교수방 : 303호

다음으로는

package main2;

import java.util.Date;

import cls.Course;
import cls.Professor;
import cls.Register;
import cls.Student;

public class Main4 {

	public static void main(String[] args) {

		// 1. 학생등록
		Student student = new Student(1952312, "박준규", 4, new Date());
		
		// 2. 교수등록
		Professor professor = new Professor(10100, "신용권", "R-303호", new Date());
		
		// 3. 과목등록
		Course course = new Course();
		course.setCode(3333);
		course.setCredit(3);
		course.setName("박준규");
		course.setDate(new Date());
		course.setProfessor(professor);

		// 4. 수강신청(1개만)
		Register register = new Register();
		register.setCode(1952312);
		register.setCourse(course);
		register.setStudent(student);
		register.setDate(new Date());
		System.out.println();

		// 5. 수강신청 내역 출력(1개만)
		System.out.println(register.toString());
	}

}

로 구성하였다.

​

이후 수강신청 한 내역을 하나만 출력하게 된다면,

Register(code=1952312, course=Course(code=3333, name=박준규, credit=3, professor=Professor(code=10100, name=신용권, room=R-303호, date=Wed Feb 01 17:03:08 KST 2023), date=Wed Feb 01 17:03:08 KST 2023), student=Student(no=1952312, name=박준규, grade=4, date=Wed Feb 01 17:03:08 KST 2023), date=Wed Feb 01 17:03:08 KST 2023)

너무 길어서 가독성이 조금 떨어지기는 하지만

학생정보, 강의명, 교수정보 , 등록시간 등 여러 정보들이 나오고 있는 모습이다.
​

​

이렇게 코드로만 만들어지고 사용된다면 분명히 가독성이 떨어질 것이다.

그래서

실제로 이러한 페이지를 제작하여 만들 수 있도록

​

창 형태로 직접 제작을 할 것이다.

​

자세한 세부내용은 내일 자세하게 진도를 나갈 예정이지만

​

간단하게 나타낸다면,


먼저 frame 이라는 새로운 패키지를 생성하고,


MainFrame.java라는 클래스를 생성한다

(실행클래스가 아니라 말 그대로 프레임을 만들기 위한 클래스이다.)

이후 MainFrame extends JFrame을 추가하고,

우클릭을 하여 해당 경로로 들어간다.

이렇게 되면 소스코드 창 하단에

디자인이라는 버튼이 생기는데, 누르게 되면

딱 봐도 창을 만들게 해줄것같은 창이 뜬다 ㅎㅎ

먼저 Absolute layout을 선택하고

창에다가 가져다가 놓으면 이렇게 초록색 테두리가 생성된다.

이후 항목에 있는 여러가지 툴을 사용하여

창을 사용하기 좋게 꾸밀 수 있게 된다.

위에 '학생용'과 '교수용' 과 같은 경우에는

Menu항목에 있는 JMenubar를 추가하여

JMenu를 붙이고, 세부항목에 JMeenuItem을 이용하여 만들었다.

​

오늘 수업은 여기까지!

profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글