생성자 , getter/setter 말고도 객체의 내용을 출력하는 메서드인 toString도 자동생성 가능
@Override : 어노테이션(에너테이션) => 작은 기능이 있는 정의어
override(오버라이드) : 부모의 메서드를 자식이 가져와서 재정의 하는 기능
오버라이딩 : 부모클래스의 메서드를 재정의하여 사용하는 것
- 부모클래스의 메서드와 선언부가 일치해야함. { 구현만 재정의 가능. }
- 접근제한자는 더 넓은 범위만 가능, 축소는 안됨.
Student 클래스를 만들어서 사용해보자
조건
- 학생 정보를 관리하기 위한 클래스
- 학생 기본정보 : 이름, 생년월일, 전화번호, 나이
- 학원 정보 : 학원명 = "EZEN" (final static), 지점
- 수강 정보 : 수강과목, 기간
=> 여러과목을 들을 수 있음. (여러과목을 수강하기 위해서는 배열로 처리 5과목까지 가능)
ex) 홍길동(010101) 010-1111-1111 / 25 -> 학생정보
EZEN(인천) -> 학원정보
자바 6개월, 파이썬1개월 , SQLD 1개월 -> 수강정보
* 기능(메서드)
- 학생의 기본정보를 출력하는 기능
- 학원 정보를 출력하는 기능
- 수강정보를 출력하는 기능
- 학생이 수강정보를 추가하는 기능
public class Student {
private String name;
private String btday;
private String tel;
private int age;
private static final String BRAND = "EZEN";
private String gigum;
private String[] program = new String[5];
private String[] date = new String[5];
private int cnt;
public Student() {
}
public Student(String name, String btday, String tel, int age) {
this.name = name;
this.btday = btday;
this.tel = tel;
this.age = age;
}
public Student(String name, String btday, String tel, int age, String gigum) {
this(name, btday, tel, age);
this.gigum = gigum;
}
public Student(String name, String btday, String tel, int age, String gigum, String[] program, String[] date) {
this(name, btday, tel, age, gigum);
this.program = program;
this.date = date;
}
public void stPrint() {
System.out.println(name + "(" + btday + ") " + tel + " / " + age);
}
public void ePrint() {
System.out.println(BRAND + "(" + gigum + ")");
}
public void infoPrint() {
for (String ptmp : program) {
System.out.print(ptmp + " ");
}
System.out.println();
for (String dtmp : date) {
System.out.print(dtmp + " ");
}
System.out.println();
}
public void infoPrint2() {
if( program.length == 0 || cnt ==0) {
System.out.println("수강과목이 없습니다.");
return;
}
for(int i=0; i<cnt; i++) {
System.out.print(program[i] + "(" + date[i] +") ");
}
System.out.println();
}
public void addProgram(String program, String date) {
for (int i = 0; i < this.program.length; i++) {
if (this.program[i] == null) {
this.program[i] = program;
this.date[i] = date;
return;
}
}
System.out.println("5개이상의 강의를 들을 수 없습니다.");
}
public void addProgram2(String program, String date) {
// cnt 가 0인 상황 ( 하나도 추가되지 않은 상황 )
if( cnt >= 5 ) {
System.out.println("더이상 수강하실 수 없습니다.");
// 배열을 늘려서 더 많은 수강을 받을 수도 있음. (배열복사)
return;
}
this.program[cnt] = program;
this.date[cnt] = date;
cnt++;
}
여기다가 getter/setter
상속(Inheritance) : 부모 클래스의 멤버 요소를 자식이 돌려받는 것.
멤버요소 : 멤버변수, 메서드 사용가능.
private 상속 안됨.상속받는 부모클래스가 다른 패키지에 있다면 default도 상속대상이 안됨.
public / protected 접근제한자만 가능
상속 키워드 : extends
상속은 1개만 가능. 다중 상속을 허용하지 않음.
class 자식 class extends 부모 class명 extends명 {
본인의 멤버변수와 메서드 구현 가능.
본인멤버변수 + 본인메서드 + 부모멤버변수 + 부모메서드
}
추상클래스 : 미완성 클래스, 추상메서드를 포함하는 클래스
추상클래스 요소 : 멤버변수 + 상수(final) + 일반메서드 + 추상메서드
추상클래스 : 객체를 생성할 수 없다. 반드시 추상메서드를 구현하여 완성해야 객체를 생성
추상메서드 : 메서드의 선언부만 있고, 구현이 없는 메서드
추상 키워드 : abstract
abstract class Animal{}
abstract public void howl(매개변수); // 추상메서드
- 추상클래스에 abstract 키워드는 반드시 포함해야 함.
- 인터페이스는 추상메서드를 포함해도 abstract 키워드가 생략가능.
- 추상클래스는 상속을 하기위한 부모클래스를 생성 할 때 사용
- 상속받은 클래스에 추상메서드가 있다면 반드시 구현
Product 클래스를 만들어서
controller에서 구현하고
main에서 실행 할 수 있도록 만들어보기.
getter / setter 는 길어서 생략. 들어가있음.
public class Product {
private String name;
private String price;
private int num;
public Product() {
}
public Product(String name, String price) {
this.name = name;
this.price = price;
}
public void insertProduct(String name, String price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return name + ":" + price + "원" ;
}
상품의 이름, 가격을 설정해주고 생성자와 상품 추가 메서드까지만 구현
num는 상품의 고유번호로 넘버링해서 상품을 찾을 때 사용 할 예정.
public class ProductController {
// Product 배열생성
// 추가 , 삭제 , 수정 , 리스트보기
private Product[] menu = new Product[10];
private int cnt = 0;
public void printProduct() {
if (cnt == 0) {
System.out.println("상품이 없습니다. 추가해주세요");
} else {
for (int i = 0; i < cnt; i++) {
System.out.println(menu[i] + " 상품번호: " + menu[i].getNum());
}
}
}
public void insertProduct(Scanner scan) {
// 배열이 다 찼다면... 배열 늘려주기.
// 배열은 길이를 한번 정하면
// 배열은 길이를 한번 정하면 변경 불가능.
// 더 긴 길이의 배열을 생성하여 배열 복사 후 배열 교체
if (cnt == menu.length) {
// 5개 더 많은 길이의 배열을 생성
Product[] tmp = new Product[menu.length + 5];
// 배열 복사 기존배열의 0 번지부터 새배열으ㅏ 0번지부터 복사 cnt 개수만큼
System.arraycopy(menu, 0, tmp, 0, cnt);
menu = tmp;
}
System.out.println("상품명과 가격을 입력해주세요");
String name = scan.next();
String price = scan.next();
Product p = new Product();
p.insertProduct(name, price);
p.setNum(cnt + 1);
menu[cnt] = p;
cnt++;
}
public void deleteProdcut(Scanner scan) {
System.out.println("삭제할 상품번호를 입력해주세요.");
int delNum = scan.nextInt();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (menu[i].getNum() == delNum) {
for (int j = i; j < cnt - 1; j++) {
menu[j] = menu[j + 1];
menu[j].setNum(j + 1);
}
menu[cnt - 1] = null;
cnt--;
found = true;
break;
}
}
if (!found) {
System.out.println("해당 상품이 목록에 없습니다.");
}
printProduct();
}
public void modifyProduct(Scanner scan) {
System.out.println("수정할 상품번호를 입력해주세요");
int modifyNum = scan.nextInt();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (menu[i].getNum() == modifyNum) {
System.out.println("바꿀 상품을 입력해주세요");
String name = scan.next();
String price = scan.next();
menu[i].insertProduct(name, price);
found = true;
break;
}
}
if (!found) {
System.out.println("해당 상품이 목록에 없습니다.");
}
}
상품 리스트 출력 / 추가 / 삭제 / 수정이 가능하도록 구현
입력해둔 num를 통해 상품마다 고유 넘버를 만들어주고 getNum으로 가져와 찾아가지고
원하는 상품을 추가 / 삭제 / 수정하도록함.
삭제 시 번호가 삭제되므로 번호를 재정렬 할 수 있도록 해줌.
public class ProductMain {
public static void main(String[] args) {
// 키오스크 생성
// 1. 전체 상품리스트 | 2. 상품등록 | 3. 상품삭제 | 4. 상품수정 | 5. 종료
ProductController productController = new ProductController();
Scanner scan = new Scanner(System.in);
int menu = 0;
do {
// 메뉴를 받을 때 필요, 상품을 받을 때 필요
// 스캐너를 매개변수로 전달
System.out.println("메뉴를 선택해주세요 1.전체상품리스트 | 2.상품등록 | 3.상품삭제 | 4.상품수정 | 5.종료");
System.out.println("menu >> ");
menu = scan.nextInt();
switch(menu) {
case 1 : productController.printProduct(); break;
case 2 : productController.insertProduct(scan); break;
case 3 : productController.deleteProdcut(scan); break;
case 4 : productController.modifyProduct(scan); break;
case 5 : System.out.println("키오스크 종료!!"); break;
default : System.out.println("잘못된 메뉴입니다.");
}
} while(menu != 5);
}
}
'자바 수업 정리' 카테고리의 다른 글
수업정리 11일차. (0) | 2024.10.04 |
---|---|
수업정리 10일차. (1) | 2024.10.02 |
자바 설정 관련 (1) | 2024.09.25 |
수업정리 8일차. (3) | 2024.07.24 |
수업정리 7일차. (2) | 2024.07.23 |