2022.11.09.WED

ronglong·2022년 11월 9일
0

코드스테이츠 Day15

<객체 지향 프로그래밍 심화 - 버거퀸 주문 프로그램 만들기 실습>

  1. 프로젝트 개요 짜기
  • 요구 사항, 만들어야 하는 것 확인하며 대략적으로 설계.
  1. 프로젝트 생성
  • src 디렉토리 내 main 메서드를 가진 Main 클래스가 기본으로 생성됨.
    여기서 프로그램 돌림(run).
  1. 상품 객체 및 설계 생성
  • 객체들의 공통점과 차이점을 파악하여 추상, 상속 구조 결정 및 클래스 만들기.
  • 상품 정보를 저장할 저장소 클래스 만들기.
  • 다형성(Polymorphism)을 이용하여 각각의 상품들을 하나의 배열로 모아서 관리.
  1. 프로그램 주요 흐름 파악
  • 요구 사항 분석하여 프로그램의 주요 흐름을 파악하고 슈도코드 적어보기.
  • Main 클래스의 main 메서드는 static, 즉 정적 클래스 메서드로 인스턴스 변수를 참조할 수 없다. 따라서, 로직은 다른 클래스에서 만들어야함.
  • 각각의 기능에 따라 다른 클래스로 기능 분산 시키기.
  1. 메뉴 기능 구현
  • 필드 정의
    - 다른 클래스에서 정보를 끌어올 때, 캡슐화를 하여 getter로 가져옴.
  • 메서드 정의
    • 메서드 시그니처 구상(반환 타입, 입력할 매개 변수 유무)
    • for문으로 배열 내 요소들을 반복 순회할 때, instanceof 연산자를 이용하여, 각 요소의 클래스 구분 가능.
    • 메서드 추출을 통한 리팩토링 : cmd+opt+m, 중복되는 코드를 정리하여 코드를 개선하는 작업을 리팩토링이라고 함.
  1. 장바구니 기능 구현
  • 필드 정의
    - 장바구니에 담긴 객체를 담을 배열 변수 선언.
  • 메서드 정의
    • 메서드의 역할을 생각하며 메서드 시그니처 작성.
    • 슈도코드 작성.
    • 필요한 경우, 다운캐스팅 형변환을 활용하여 변수가 하위클래스의 메서드까지 사용할 수 있도록 만들기.
    • 매개변수 추가와 조건문을 통해 기존의 메서드를 조건에 따른 2가지 출력으로 분기할 수 있음.
  1. 복사 생성자 적용을 통한 문제 해결
  • 새로운 객체를 만들지 않고, 기존 참조값에 덮어쓰기하는 경우 문제 발생.
  • 깊은 복사를 통해 해결.
  • 얕은 복사 : 할당, 같은 메모리 주소
  • 깊은 복사 : 내용은 동일하나 new 연산자를 통해 참조 값, 즉 메모리 주소가 다른 새로운 객체 생성
  • 깊은 복사를 해서 생성자가 없다고 오류 뜨면, 해당 클래스 가서 생성자 필요한 구성으로 만들어서 오버로딩 하면 됨.
  1. 주문 기능 구현
  • 필드 정의
  • 메서드 정의
    - 장바구니에 있는 거 가져다 쓰기.
  1. 할인 기능 구현
  • 요구 사항 확인하여 할인 조건, 할인 정책 등 분리하여 설계.
  • 내용이 자주 변한다 ---> 수정 많으니까 공통점 묶어서 인터페이스 써라.
  1. 객체지향 원리 적용
  • 인터페이스
    • 구현하는 클래스들에게 추상 메서드 오버라이딩 강제.
    • 공통점(역할)을 토대로 구현 클래스와의 직접 연결을 막음으로써 느슨하게 연결.
  • 객체 지향
    • 변화와 확장에 유연.
    • 변화가 생겼을 때, 최대한 효율적으로 최소한의 수정만 하는 것.
    • 객체 간 결합도가 낮을수록, 객체의 자율성이 높을수록 객체 지향적.
    • 하나의 클래스가 맡은 일은 하나의 클래스에서 다 끝내야 함. 역할 수행.
    • 캡슐화를 통해 내부의 세부적인 동작을 감추어 객체 간의 결합도를 낮춤(private).
    • 다른 클래스에서 호출해야해서 public 해야하는 것 말고는 일단 private으로 두고, 필요하면 protected로 바꾸는 게 편한 듯.
    • 구체적인 클래스(구현 클래스)에 의존하지 말 것. 인터페이스(역할) 활용!
    • 수정하지 말아야할 기본 로직에서는 객체 생성도 하지 말고 의존성 주입(DI)하는 게 좋음.
  • 따로 객체 생성용 클래스(Configurer) 만들어서 객체 생성 시 주의할 점 : 싱클톤 패턴
    • 중복 호출될 경우, 프로그램이 동작하면서 데이터가 변하면 중복된 객체 중 하나에만 그 값이 저장될 수 있음.
      https://twinparadox.tistory.com/616
    • AppConfigurer 타입 객체를 생성 및 함수 호출을 통해, 새로운 객체를 기본 로직에서 이용 가능. 기본 로직에서 직접 객체를 만들지 않는다.

<기타 정리한 것>

  • 클래스 간의 포함 관계 : 클래스의 멤버로 다른 클래스 타입의 참조변수 선언
  • getter/setter 로 private 접근. 캡슐화.
  • 생성자를 통한 인스턴스 변수 초기화.
  • 패키지를 따로 생성해줘야하는 이유 : 기본 패키지는 default로, import가 불가능함. 따라서, 패키지 정리가 필요하다.
  • 프로그램 흐름 구현 담당(OrderApp)과 실행 구역(Main) 분리.
  • cmd + , : IntelliJ settings
  • cmd + p : 파라미터 힌트 보기.
  • cmd + n : 클래스, 인터페이스, 패키지, 생성자 등 만들 때.
  • 접근 제어자 protected : 같은 패키지 ok.

<느낀 점>
와... 자정 좀 넘어서 끝내서, 지금 새벽 1시가 넘도록 벨로그에 정리했다.
얼른 자야지.
오픈북이라 친절하게 쓰인 내용을 따라가면서 공부하는 것이긴 했지만, 중간에 오류없이 순차적으로 프로그램이 잘 돌아가서 기분 좋았다. 가끔 오류 찾아서 해결하면 기분도 좋고...
약간 '백엔드 개발자가 어떤 일을 하겠구나~' 라는 걸 처음으로 조금 느낀 것 같다.

0개의 댓글