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

Jun_Gyu·2023년 2월 25일
0

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개의 댓글