JAVA SPRING/java

JAVA_005) 객체지향개념_2 개념적인 메소드 설계&실행

오동순이 2023. 3. 16. 13:12

*중요 오버로딩 과 오버라이딩 잊어먹지 마세요

오버로딩 과
메서드 한개의 이름으로 여러개의 매서드 형태가 들어올수있는것
파라미터가 다른 메서드를 여러개만드는것

오버라이딩의 차이가 뭐예요? (기능재정의)
기존의 기능을 바꿔버리는 것
상위클래스에서 만들어져있던 메서드의 기능을 (하위클래스에서) 재정의(바꾼다)


개념적인 메소드 설계 해보기 (영화)

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+"원");
    };
    
  } 
}