*중요 오버로딩 과 오버라이딩 잊어먹지 마세요
오버로딩 과
메서드 한개의 이름으로 여러개의 매서드 형태가 들어올수있는것
파라미터가 다른 메서드를 여러개만드는것
오버라이딩의 차이가 뭐예요? (기능재정의)
기존의 기능을 바꿔버리는 것
상위클래스에서 만들어져있던 메서드의 기능을 (하위클래스에서) 재정의(바꾼다)
개념적인 메소드 설계 해보기 (영화)
1. 객체를 만들중비 파일 제공자와 기능제공 MovieBasicInfo 클래스
import java.util.Date;
//1
public class MovieBasicInfo {
//2
String title_kor; // 한글제목,
String title_eng; // 영어제목,
int status; // 상영상태 : 0-개봉예정, 1-상영중, 2-상영종료, 3-재개봉, 4-VOD
double audience_score; // 관람객평점,
double netizen_score; // 네티즌평점,
double critic_score; // 기자평론가평점
String genre; // 장르,
String country; // 국가,
int running_time; // 상영시간,
Date opening_dt; // 개봉일
String director; // 감독,
String main_actor; // 주연배우,
String sub_actor; // 조연배우
int viewing_age; // 관람등급,
int acc_audience; // 누적관객,
String poster_img; // 포스터이미지파일
//3
void showInfo() {
System.out.println(title_kor+"("+title_eng+")"+"["+status_list[status]+"]");
System.out.printf("관람객평점 : .2f / 네티즌평점 : .2f / 기자평론가평점 : .2f \n",audience_score, netizen_score, critic_score);
//.2f는 소수점 둘째자리까지 0.00
System.out.println("장르 : "+genre+" / 국가 : "+country+" / 상영시간 : "+running_time+"분");
System.out.println("개봉일 : "+opening_dt+" / 감독 : "+director+" / 주연 : "+main_actor+" / 조연 : "+sub_actor);
System.out.println();
String str_viewing_age = "";
if(viewing_age == 0) str_viewing_age = "전체관람가";
else{
str_viewing_age = viewing_age+"세 이상 관람가";
}
System.out.println("관람등급 : "+str_viewing_age+" / 누적관객 수 :"+acc_audience+"명 / 포스터 : "+poster_img);
}
//4
void chagngeMovieStatus(int status){
if(status < 0 || status >= status_list.length){
System.out.println("상태 변경 실패 (0~4 중 입력)");
return; //메서드 종료
}
System.out.println("상태 변경 : "+status_list[this.status]+" -> "+ status_list[status]);
this.status = status; // ^^ 이 파라미터를 뜻 함 싫으면 바꾸셈
//this.^ 멤버변수, ^^ 는 파라미터
//5
void changeAudienceScore(double score){
System.out.println("관람객 평점 변경 : "+audience_score+"->"+score);
audience_score = score;
}
void changeNetizenScore(double score){
System.out.println("네티즌 평점 변경 : "+netizen_score+"->"+score);
netizen_score = score;
}
void changeCriticScore(double score){
System.out.println("기자,평론가 평점 변경 : "+critic_score+"->"+score);
critic_score = score;
}
//6
void addAudienceCount(int count){
System.out.println("누적 관객 수 : "+acc_audience+"->"+(acc_audience+count));
acc_audience += count;
}
}
2. 실행해보기 파일 소비자 기능이용 MovieTest 클래스
import java.util.Date;
public class MovieTest { //실행되는 곳!
public static void main(String[] args) {
MovieBasicInfo movie = new MovieBasicInfo();
movie.title_kor = "블랙 아담";
movie.title_eng = "Black Adam";
movie.status = 1;
movie.audience_score = 7.60;
movie.netizen_score = 7.70;
movie.critic_score = 5.67;
movie.genre = "액션, 모험, SF";
movie.country = "미국";
movie.running_time = 125;
// 연도는 현재연도에서 1900 뺀다
// 월은 현재 월에서 1 뺀다
movie.opening_dt = new Date(122, 9, 19); // 취소선은 권장안함
movie.director = "자움 콜렛 세라";
movie.main_actor = "드웨인 존슨";
movie.sub_actor = "노아 센티네오, 피어스 프로스넌";
movie.viewing_age = 12;
movie.acc_audience = 531013;
movie.poster_img = "poster.img";
//3 <-번 실행
movie.showInfo();
//4 번 실행
movie.chagngeMovieStatus(0);
movie.chagngeMovieStatus(1);
movie.chagngeMovieStatus(2);
movie.chagngeMovieStatus(3);
movie.chagngeMovieStatus(4);
movie.chagngeMovieStatus(5);
movie.showInfo();
//5.6번
System.out.println();
movie.changeAudienceScore(8.8);
movie.changeNetizenScore(7.7);
movie.changeCriticScore(6.8);
movie.addAudienceCount(555555);
movie.showInfo();
}
}
개념적인 메소드 설계 해보기 (컬리)
객체를 구분지어서 만들어 보기
(1번객체-보여지는 정보)
배송
제품이미지
제조사정보/제품이름
부제목
가격
할인율
적립율
판매자
포자타입
판매단위
중량용량
안내사항
(필요한메서드무엇이있을까?)
public class Kurly2Product {
final String[] delivery = {"일반택배","샛별배송","낮배송"};
String prod_img; // 상품 이미지 파일
String prod_manufacturer; // 상품 제조사
String prod_title; // 상품 명
String prod_sub_title; // 상품 부제목
private int prod_price; // 상품가격
private double prod_discount_rate;// 상품할인율
private double prod_point_rate; // 상품적립율
private int prod_delivery_type; // 배송타입 0-일반택배/1-샛별배송/2-낮배송
String prod_seller; // 상품 판매자
String prod_unit; // 상품 판매단위
String prod_quantity; // 상품 용량
String prod_notice; // 상품 안내사항
private int prod_stock; // 상품 재고
//private는 직접접근금지! public 공용의! (여기서는 구매자가 가격을 설정할수없게! private)
//로그인을 했을때와 안했을때
void printProductInfo(boolean login){
System.out.println("제품 이미지 : "+prod_img);
System.out.println(delivery[prod_delivery_type]);
System.out.println("["+prod_manufacturer+"]"+prod_title);
System.out.println(prod_sub_title);
if(login) {
System.out.println("할인율 : "+(int)(prod_discount_rate*100)+"%");
System.out.println("할인 적용 가 : "+getDiscountedPrice(login)+"원");
System.out.println("적립율 : "+(int)(prod_point_rate*100)+"%");
System.out.println("적립 포인트 : "+getSavingPoint(login)+"점"); //할인적용가에서 적립포인트!
System.out.println("제품 원가 : "+prod_price+"원");
}
else {
System.out.println("제품 가격 : "+prod_price+"원");
}
System.out.println("판매자 : "+prod_seller);
System.out.println("판매단위 : "+prod_unit);
System.out.println("제품용량 : "+prod_quantity);
System.out.println("제품안내사항 : "+prod_notice);
}
//할인 적립 율 등
int getDiscountedPrice(boolean login){
if(login)
return (int)(prod_price*(1-prod_discount_rate));
return prod_price;
}
int getSavingPoint(boolean login){
if(login)
return (int)(getDiscountedPrice(login)*prod_point_rate);
return 0;
}
boolean isOrderAvailable(){
return prod_stock > 0;
}
//주문제품개수표시
boolean productOrder(int stock){
if(prod_stock - stock >= 0){
System.out.println("제품을 "+stock+"개 주문했습니다.");
prod_stock -= stock;
return true;
}
// else { //여기서 else는 있어도 되고 없어도 됨!
System.out.println("제품의 재고가 부족합니다. (재고수량 : "+prod_stock+")");
return false;
// }
}
//값을 설정하는 메서드
void setProdoctPrice(int price){
if(price < 0){
prod_price = 0;
}
else {
prod_price = price;
}
}
void setProdoctDiscountRate(double discount_rate){
if(discount_rate >= 1){
prod_discount_rate = 1;
}
else{
prod_discount_rate = discount_rate;
}
}
void setProdoctPointRate(double point_rate){
if(point_rate < 0){
prod_point_rate = 0;
}
else if(point_rate >= 1){
prod_point_rate = 1;
}
else{
prod_point_rate = point_rate;
}
}
void setProdoctDeliveryType(int delivery_type){
if(delivery_type >= 0 && delivery_type < delivery.length){
prod_delivery_type = delivery_type;
}
else{
prod_delivery_type = 0;
}
}
void setProdoctStock(int stock){
if(stock < 0){
stock = 0;
}
else{
prod_stock = stock;
}
}
}
(2번객체따로임- 주문사항)
상품선택 (재고가 숨어있음)
private - setter /getter method (상호 불가침!)
public class Kurly2Main {
public static void main(String[] args) {
Kurly2Product prod1 = new Kurly2Product();
prod1.prod_img = "product.jpg";
prod1.prod_manufacturer = "루메나";
prod1.prod_title = "루메나 FAN STAND 3X 무선 써큘레이너 3종";
prod1.prod_sub_title = "감성 캠핑의 완성";
prod1.prod_seller = "컬리";
prod1.prod_unit = "1개";
prod1.prod_quantity = "-";
prod1.prod_notice = "-";
// setter method (속성이 private인 멤버변수의 값을 설정하는 용도)
prod1.setProdoctPrice(39900); // <- private 로 얘만 쓸수잇게 강제됨 2.
prod1.setProdoctDiscountRate(0.1253);
prod1.setProdoctPointRate(0.05);
prod1.setProdoctDeliveryType(2);
prod1.setProdoctStock(10);
// prod1.prod_price = -50000; <- private 걸리면 에러표시가 떠욧 1.
// System.out.println(prod1.prod_price);// <-private로 조회도 금지됨! 3.
boolean login= false; //로그인 기능을 넣어서 true false
prod1.printProductInfo(login);
int order = 8;
if(prod1.productOrder(order)) {
//값을 내어보내는 역할을 하는 메서드를 getter method
System.out.println("총 구매금액 : "+prod1.getDiscountedPrice(login)*order+"원");
};
order = 5;
if(prod1.productOrder(order)) {
System.out.println("총 구매금액 : "+prod1.getDiscountedPrice(login)*order+"원");
};
order = 2;
if(prod1.productOrder(order)) {
System.out.println("총 구매금액 : "+prod1.getDiscountedPrice(login)*order+"원");
};
}
}
'JAVA SPRING > java' 카테고리의 다른 글
JAVA_007) 컬렉션 프레임워크 - List, Map, Set (0) | 2023.04.03 |
---|---|
JAVA_006) 객체지향개념_3 개념적인 메소드 설계&실행2 (0) | 2023.03.16 |
JAVA_004) 객체지향개념 (0) | 2023.03.16 |
JAVA_003) 배열 (0) | 2023.01.26 |
JAVA_002) 연산자, 조건문, 반복문, break문 (0) | 2023.01.25 |