2023/11/14 📌 추상클래스/메서드/상속 과제
∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ♪
( ・ω・) ・ω・) ・ω・) ・ω・) ・ω・)
(っ )っ )っ )っ )っ )っ
( __フ( __フ( _フ( __フ( __フ
(_/彡 (_/彡 (_/彡 (_/彡 (_/彡
❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
수업에 시작하기 앞서
어제 정리했던 상속과 추상화에 대해서 몇 번을 읽어봤다.
오늘은 오전부터 has-a와 is-a의 관계를 정리하고 과제를 진행한다고 하셨다
그래서 어느 정도 혼자 스스로 정리하는 시간을 주셨다
한번 해보자! 가쟈!
Is - a , Has - a
Iis - A
is a relationship, inheritance
일반적인 개념 상속의 개념, 구체적인 개념의 관계
상속에 대한 내용이며 일반 클래스를 구체화하는 상황에서 상속을 사용한다
밀접한 관계
Has - A
has a relationship, association
느슨하게 결합하는 것
상속에 비해 명세 변경이 발생 시 구성요소를 쉽게 변경가능하다
(이 말은 코드 손상이 적거나 없다는 의미) 느슨한 결합, 소유하는 개념, 포괄개념
모듈의 독립성은 모듈의 결합도와 응집도로 측정한다
결론적으로 모듈의 독립성을 높이기 위해서는 모듈 간의 상호 의존 정도를 나타내는
결합도를 낮추고 모듈이 독립적으로 자체 기능만을 수행하도록 응집도를 높여야 한다
객체를 만들 대엔 쓸 사람을 정해 놓고 쓰는 건 안 좋은 것이다
객체를 만들 때엔 항상 독립적으로 만들어야 한다 ( = 결합도와 연관됨)
객체는 쓰는 사람들이 다 쓸 수 있도록 해야 한다
항상 데이터 클래스를 독립적으로 만들고 데이터 관리 클래스에서 관리한다
물건과 비교해 보기
가습기를 예를 들어보자
내가 쓰고 있는 가습기의 기능은
1. 물을 넣는다
2. 전원을 연결한다
3. 가습을 시작하는 버튼을 누른다
4. 물을 분사한다
5. 단계별 설정을 한다
6. LED불이 들어온다
7. 일정 시간이 되면 자동으로 끈다
여기서 필수 기능은 어떤 것일까?
내가 고민하여 나눈 필수기능과 선택 기능은
필수 기능 : 물을 넣는다 / 전원을 연결한다 / 가습을 시작하는 버튼을 누른다 / 물을 분사한다
선택 기능 : 단계별 설정을 한다 / led불이 들어온다 / 일정시간이 되면 자동으로 끈다
이렇게 정의를 해보았다
그럼 필수 기능은 is - a 관계이고 선택기능은 has-a 관계라고 생각된다
만약에 "가습기"라는 객체로 추상화를 한다고 했을 때 어떻게 정의하는 게 좋을까?
내가 생각해 본 추상클래스로 정의한 가습기 느낌은
멤버변수 : 물을 넣는다 / 물을 분사한다로 나누었고
추상 메서드 : 전원을 연결한다 (무선/유선) , 가습을 시작하는 버튼을 누른다 (버튼/다이얼),
일반 메서드 : 단계별 설정을 한다(1단, 2단, 3단 등등), led불이 들어온다(빨강, 노랑, 파랑 등등), 일정 시간이 되면 자동으로 끈다(3시간 6시간, 등등)
이렇게 나누어보았다.
추상 메서드는 Sub Class에서 재정의를 해줘야 하기 때문에 , 이왕 상속받는 메서드인데 아깝게 안 쓰지 말고 최대한 쓰는 방향으로
생각해야 할 것 같았다, 일반 메서드는 별도로 클래스를 빼서 해도 될 것 같다.
내일까지 할 미니 과제
자동차 렌트 프로그램
렌트 차랑을 개인이 등록하여 렌트를 하는 프로그램
메인메뉴는 렌트차량등록, 렌트차랑예약, 렌트계약완료보기 가 있다.
렌트차량 등록시에는 승용, SUV, 승합에 하나를 선택한다.
모든 차량은 차종, 제조자, 소유자이름, 전화번호, 1시간요금 정보, 연료타입을 저장한다.
24시간 요금은 프로그램에서 제시한 요금표에 따라며 승용 4만원, suv 6만원 ,승합은 10만원을 한다.
요금은 기본 24시간 요금을 적용하며 24시간이 초과되고 1시간 단위로 1만, 2만, 3만원의 추가 요금이
발생한다.
렌트차량예약시에는 자동차운전면허증 번호를 입력한다.
이때 승합은 11인승 이상이므로 1종보통인지 확인 후 예약이 진행된다.
대여시에는 대여자 이름, 나이, 전화번호, 대여시간, 비밀번호가 필요하며 승합은 1종 보통 이상인지
의 정보가 필요하다.
등록된 차량은 차량의 정보보기 기능을 제공한다.
차량의 정보와 요금안내의 정보를 포함한다.
렌트시 필요한 정보를 다 작성하면 요금을 미리 계산하여 계산할 금액을 출력한다.
렌트계약이 성립된 차량은 렌트계약완료보기에서 확인이 가능하며
차량번호 계약자 이름이 보여진다.
위 문제를 분석하여
추상화하여 has a / is a 관계를 고려하여 다음 기술을 이용하여 구축하시오
ppt는 없습니다
-- 고려해야 할 기술 stack List --
상속
추상메서드 & 추상클래스
static
final
접근제어자
싱글톤
메서드 오버라이드
코드재사용성
DAO DTO
DML - 조인
DDL
DCL
ERD
라이브러리 사용 능력
패키지 관리 능력
자바 I/O
예외처리
객체지향언어특징 : 추상화, 캡슐화, 상속, 다형성
스레드
객체
JVM
this, super 키워드
클래스 다이아 그램
플로우차트
요구 분석과 시나리오
다행히 ppt가 없어서 너무 좋았다
구현만 하면 된다라니!
점심시간이 지난 후 문제를 받고 요구 분석과 시나리오부터. 짜보았다
최대한 기술 스택에서 사용해보고 싶은걸 5가지 이상은 써보자는 마인드로 접근했다
❝ Oracle ❞
join , trigger , view
❝ Java ❞
상속/추상메서드/추상클래스/static/final/접근제어자/싱글톤/오버라이드/오버로드/DAO/DTO/캡슐화/다형성/this, super키워드
최대한 써보기로 하였다!
제출 기한이 얼마 되지 않아 시나리오는 이 정도로 뼈대만 잡고 Oracle부터 틀을 잡기로 했다
오라클 테이블 & 쿼리
----------------------------------------------------------------------------------------------------------
-- 테이블 생성
----------------------------------------------------------------------------------------------------------
CREATE TABLE Pay(
car_type varchar2(10) PRIMARY KEY,
day_price number(6) NOT NULL,
over_price number(5) NOT NULL
);
SELECT * FROM pay;
CREATE TABLE RentCar(
car_number varchar2(30) PRIMARY KEY,
owner_name varchar2(10) NOT NULL,
owner_phone varchar2(13) NOT NULL,
car_title varchar2(20) NOT NULL,
car_type varchar2(10 ) not null,
car_mnfct varchar2(10) NOT NULL,
car_fuel varchar2(10) NOT NULL,
car_status varchar2(1) check(car_Status in('Y','N')) NOT NULL
);
CREATE TABLE Lender(
lender_name varchar2(10) NOT NULL,
lender_age number(3) NOT NULL,
lender_phone varchar2(13) NOT NULL,
lender_start DATE NOT NULL ,
lender_time number(2) NOT NULL ,
lender_end DATE DEFAULT SYSDATE ,
lender_pass varchar2(10)NOT NULL,
lender_licenseType varchar2(20)NOT NULL,
car_number varchar2(30)NOT NULL,
lender_licenseNum varchar2(30) primary key,
total_price number(10) NOT NULL,
foreign key (car_number) REFERENCES RentCar(car_number) on delete CASCADE);
----------------------------------------------------------------------------------------------------------
-- 뷰 & 트리거
----------------------------------------------------------------------------------------------------------
1. 뷰
-- 승합이 아니며 대여가 가능한 차량 출력
-- 출력하는 내용 : 대여가능한 차 번호 / 차 이름 / 차 제조사 / 연료 타입 / 하루 렌트비 / 초과시 렌트비
CREATE OR REPLACE VIEW rPossible_NotVan
AS
SELECT R.car_number AS car_number , R.car_title AS car_title, R.car_mnfct AS car_mnfct, R.car_fuel AS car_fuel
, P.day_price AS day_price, P.over_price AS over_pirce
FROM Pay P
INNER JOIN RentCar R
ON R.car_type = P.car_type
WHERE R.car_type != '승합' AND R.car_status = 'N';
2. 뷰
-- 승합차이며 대여가 가능한 차량 출력
-- 뷰로 생성
-- 출력하는 내용 : 대여가능한 차 번호 / 차 이름 / 차 제조사 / 연료 타입 / 하루 렌트비 / 초과시 렌트비
CREATE OR REPLACE VIEW rPossible_Van
AS
SELECT R.car_number AS car_number , R.car_title AS car_title, R.car_mnfct AS car_mnfct, R.car_fuel AS car_fuel
, P.day_price AS day_price, P.over_price AS over_pirce
FROM Pay P
INNER JOIN RentCar R
ON R.car_type = P.car_type
WHERE R.car_status = 'N';
3. 트리거
-- Lende 테이블에 INSERT시 RentCar에 있는 해당 차량의 대여정보가 Y로 자동 변경되게 처리하는 트리거
CREATE OR REPLACE TRIGGER auto_Status_Change
AFTER INSERT ON Lender
FOR EACH ROW
DECLARE 오류로 구현 포기
v_lender_start DATE;
BEGIN
UPDATE RentCar
SET car_status = 'Y'
WHERE car_number = :NEW.car_number;
END;
4. 트리거
-- Lender 테이블에 INSERT 처리가 완료 되기 전에 입력한 대여시간만큼 자동 Lender_end에 입력되도록 하는트리거
CREATE OR REPLACE TRIGGER auto_lender_end
BEFORE INSERT ON Lender
FOR EACH ROW
BEGIN
:NEW.lender_end := :NEW.lender_start+INTERVAL '1' HOUR * :NEW.lender_time;
END;
5. 뷰 예약 완료건 출력 뷰
CREATE OR REPLACE VIEW Rental_Success
AS
SELECT r.CAR_NUMBER AS car_number , l.LENDER_NAME AS lender_name ,
to_char(l.LENDER_START,'yyyy-mm-dd hh24:mi') AS LENDER_START , to_char(l.LENDER_END,'yyyy-mm-dd hh24:mi') AS LENDER_END
FROM rentcar r
INNER JOIN lender l
ON r.CAR_NUMBER = l.CAR_NUMBER
WHERE car_status = 'Y';