📜 Java

:: ✍ 실시간 강의 | 객체지향 프로그래밍

:: Q & A

  • 정처기는 취업에 도움이 되는가

    • 회사마다 다름
    • 네카라쿠배 같은 곳은 정처기 노필요
    • 그냥 물어볼거니까 자격증 필요없음
    • IT대기업, 삼성 SDS 등은 자격증 도움이 됨 (SI쪽)
    • SI쪽은 자격증이 필요하다



  • JAVA로 코테는?

  • 자바코드 보고 싶은 곳은 과제 줄 가능성 높음



  • PYTHON 코테는?

    • 왜 PYTHON으로 풀었냐할 때 대답
      • 라인을 조금 덜 칠 수 있으므로 시간 확보 가능
    LIVE 코딩이 아닌이상 안 물어볼 가능성이 크지만
    PYTHON과 JAVA 본인이 생각하는 차이점을 기반으로 이야기하는 것이 젤 좋음



  • 상속, 인터페이스, 추상 클래스를 각각 어떤 상황에서 사용해야하는지 잘 와닿지 않습니다. 특히 인터페이스는 자바에만 있는 기능인 것으로 압니다.

    • 추상클래스, 상속, 인터페이스 헷갈릴 것

    • 추상이나 상속은 분모의 확장의 기준으로 뭘 만든다고 생각해야함

    • 인터페이스는 기능을 추가하는 개념으로 생각해야함

    • 실질적으로는 손으로 직접 많이 해봐야 는다.

    • 실제 프로그래밍 할 때는 Animal 클래스와 같이 명확한 상황이 거의 없는데 어떻게 적용해야할지 너무 모호합니다.

    • 추상클래스, ⇒ 템플릿메소드 패턴

    • event-us?? ⇒ 참가자(참가코드, 인증방식). ⇒ 비회원참가자(이메일, 닉네임, 핸드폰), 회원참가자(이메일)

    • 보다시피 참자가가 비회원, 회원 이런식으로 점점 확장



  • 캐스팅할때 정확히 어떤차이인지 알고싶습니다.
    Animal animal = new Animal과 Cat animal = new Animal과 Animal animal = new Cat의 차이와 업케스팅 사용시 반드시 업케스팅을 써야만 하는 상황에 대해 적절한 예시가 있을까요?

    • 캐스팅 == 형변환
    • 업캐스팅(올라가는거)
      • (Parent) Child c;
    • 다운캐스팅
      • (Child) Parent p;
      • Parent p = new Child();
      • (Child) p;
    • 예를들어 Animal animal = new Cat() 등으로 선언할때 animal을 new Animal() 로 선언해서는 절대 안되고 반드시 new cat()을 사용해야한다던가 하는 확실한 상황등이 있나요?
    • 참가자 ⇒ 회원참가자, 비회원참가자
      • Participant
        • MemberParticipant
          • B
        • NonMemberParticipant
          • A
      • Participant p ??? 참가자? 회원참가자? 비회원참가자?
        • 비회원참가자의 A라는 기능을 쓰고싶어
          • (NonMemberParticipant) p.A();

:: 3-Tier Architecture

Presentation Tier

  • 프리젠테이션 계층은 일반 사용자가 애플리케이션과 상호작용하는 애플리케이션의 사용자 인터페이스 및 통신 계층
  • 주요 목적은 정보를 표시하고 사용자로부터 정보를 수집하는 것
  • 이 최상위 레벨 계층은 예를 들어 웹 브라우저, 데스크탑 애플리케이션 또는 그래픽 사용자 인터페이스(GUI)에서 실행될 수 있음
  • 웹 프리젠테이션 계층은 일반적으로 HTML, CSS 및 JavaScript를 사용하여 개발
  • 데스크탑 애플리케이션은 플랫폼에 따라 다양한 언어로 작성될 수 있음

UI(User-Interface)

  • 위키 정의
    • 사람(사용자)과 컴퓨터시스템 사이의 의사소통 매개를 의미한다. 이 의사소통은 해당 기기에 대해 효율적인 작동과 사용자의 제어를 보장하는 것을 목표로 한다. 주변의 터치스크린, 마우스 등은 UI를 물리적으로 볼 수 있는 좋은 예시이다.

  • 일반적인 웹 또는 앱 서비스
    • 브라우저
      • Chrome, Safari, Firefox, Explorer, Whale, Edge
      • 안드로이드 앱
      • IOS 앱

Application Tier

  • 논리 계층 또는 중간 계층이라고도 하는 애플리케이션 계층은 애플리케이션의 핵심
  • 이 계층에서 프레젠테이션 계층에서 수집된 정보는 특정 비즈니스 규칙 집합인 비즈니스 로직을 사용하여 데이터 계층의 다른 정보와 비교하여 처리
  • 애플리케이션 계층은 데이터 계층의 데이터를 추가, 삭제 또는 수정할 수도 있음
  • 애플리케이션 계층은 일반적으로 Python, Java, Perl, PHP 또는 Ruby를 사용하여 개발되며 API 호출을 사용하여 데이터 계층과 통신

Data Tier

  • 데이터베이스 계층, 데이터 액세스 계층 또는 백엔드라고도 하는 데이터 계층은 애플리케이션에서 처리하는 정보가 저장되고 관리되는 곳
  • 이는 PostgreSQL , MySQL, MariaDB, Oracle, DB2, Informix 또는 Microsoft SQL Server 와 같은 관계형 데이터베이스 관리 시스템 이거나 Cassandra, CouchDB 또는 MongoDB 와 같은 NoSQL 데이터베이스 서버일 수 있음

Scanner사용법

:: JAVA로 서비스를 만든다면?

Layered-Architecture → Clean Architecture(Hexagonal Architecture)

  • 소프트웨어 개발에서 가장 일반적으로 널리 사용되는 아키텍처

카페 시스템 중에서 메뉴 목록을 저장하고, 보여주는 부분을 생각해보자.


  1. Presentation Tier(UI)

    • 브라우저
      • 메뉴 목록 조회 요청을 한다.
        • 주문 가능한 메뉴 목록이 노출 된다.
      • 메뉴를 저장한다.
    • 자바 콘솔
      - 메뉴 목록 조회 요청을 입력 받는다.
      - 주문 가능한 메뉴 목록이 노출 된다.
      - 메뉴를 저장한다.

  2. Application Tier

  • pring
    • 메뉴 목록 조회
      • Data Tier에 저장 되어 있는 메뉴 목록을 조회 한다.
      • 조회 한 메뉴 목록을 네트워크를 통하여, Presentation Tier로 전달한다.
        • Network
  • 자바
    - 메뉴 목록 조회
    - Data Tier에 저장 되어 있는 메뉴 목록을 조회 한다.
    - 조회 한 메뉴를 Presentation Tier로 전달한다.
    - 그냥 값 전달

  1. Data Tier
  • Spring
    • DB에 저장 되어 있는 메뉴 목록을 Query를 통하여 조회 한다.
      • RepositoryInterface → SpringMysqlDB
    • 조회 한 정보들을 Application Tier로 전달한다.
  • 자바
    • 메모리에 저장(Java의 기능.. List, HashMap) 되어 있는 메뉴 목록을 조회 한다.
      • RepositoryInterface
        • DefaultMemoryDB → 배열에서 값을 꺼내와
      • 조회 한 정보들을 Application Tier로 전달한다.
import cafe.menu.JavaMenuService;
import cafe.menu.Menu;
import cafe.menu.MenuItem;
import cafe.menu.MenuService;
import cafe.presentation.MenuInterFace;
import cafe.presentation.UserInterFace;

import java.util.Scanner;

public class CafeJavaApplication {

    public static void main(String[] args) {
        UserInterFace UI = new UserInterFace();
        UI.run(); // web-browser

//        System.out.println("=============== 입력 ( 1번 ) 메뉴 생성 ===============");
//        System.out.println("============= 입력 ( 2번 ) 메뉴 목록 조회 =============");
//        System.out.println("=============== 입력 ( q ) 시스템 종료 ===============");
//         여기다가 No No!!


        // application-tier
        MenuService menuService = new JavaMenuService();

        // 1 누르고 꺼져서 while문 안에 넣음
        while (true) {
            Scanner input = new Scanner(System.in);
            String fristInput = input.nextLine(); // next는 스페이스 치면 끊어버리고, nextLine은 엔터치면 끊어버림
            if (fristInput.equals("1")) {
                menuService.createMenu();
            } else if (fristInput.equals("2")) {
                Menu menu = menuService.getMenu(1);
                new MenuInterFace(menu);
                Scanner menuNameInput = new Scanner(System.in);
                String menuName = menuNameInput.nextLine();

                System.out.println("입력 받은 메뉴 이름 : " + menuName);
                MenuItem menuItem = menuService.getMenuItem(1, menuName);
                System.out.println("메뉴 이름 : " + menuItem.getName());

            } else if (fristInput.equals("q")) {
                System.out.println("시스템 종료");
                System.exit(0);
            }
        }

//        Menu menu = new Menu(); // 메뉴 만들어진다.
//        MenuItem menuItem = menu.getMenuItem("아메리카노");
//        MenuRepository menuRepository = new JavaMenuRepository();

//        JavaMenuRepository menuRepository = new JavaMenuRepository(); 잘 만들어 놓고 앞에 JavaMenuRepository 붙이게되면 new JavaMenuRepository(); 자리에 new SpringMenuRepository(); 못들어감

//        menuRepository.saveMenu(menu);
//        menuRepository.saveMenu(menu);
//        menuRepository.saveMenu(menu);
//        System.out.println(menuRepository.getMenu(1).getMenuItem("아메리카노").getName());

    }
}

---

package cafe.menu;

import java.util.ArrayList;
import java.util.List;

public class Menu {
    private final List<MenuItem> menuItemsList = new ArrayList<>();

    public Menu() {
        this.menuItemsList.add(new MenuItem("아메리카노", 1000));
        this.menuItemsList.add(new MenuItem("라떼", 2000));
        this.menuItemsList.add(new MenuItem("오렌지쥬스", 3000));
        this.menuItemsList.add(new MenuItem("밀크셰이크", 4000));
        this.menuItemsList.add(new MenuItem("프라푸치노", 6000));
        this.menuItemsList.add(new MenuItem("버블티", 8000));
    }
    public MenuItem getMenuItem(String menuName) {
        for (MenuItem menuItem : this.menuItemsList) {
            if (menuItem.getName().equals(menuName)) {
                return menuItem;
            }
        }
        throw new IllegalArgumentException("존재하지 않는 메뉴입니다.");
    }
    public List<MenuItem> getMenuItemsList() {
        return menuItemsList;
    }
}

---

package cafe.menu;

public class MenuItem {
    private final String name;
    private int price;

    public MenuItem(String name, int price) {
        this.name = name;
        this.price = price;
    }
    public String getName() {
        return name;
    }
    public int getPrice() {
        return price;
    }
}

---

package cafe.menu;

public interface MenuService {
    void  createMenu();
    MenuItem getMenuItem(int id, String menuName);
    Menu getMenu(int id);
}

---

package cafe.menu;

import cafe.menu.repository.JavaMenuRepository;
import cafe.menu.repository.MenuRepository;

public class JavaMenuService implements MenuService{
    private final MenuRepository menuRepository = new JavaMenuRepository();
    @Override
    public void createMenu() {
        // 코드가 들어갈 수도 있음
        menuRepository.saveMenu(new Menu());
    }

    @Override
    public MenuItem getMenuItem(int id, String menuName) {
        return menuRepository.getMenuItem(id, menuName);
    }

    @Override
    public Menu getMenu(int id) {
        return menuRepository.getMenu(id);
    }
}

---

package cafe.menu.repository;

import cafe.menu.Menu;
import cafe.menu.MenuItem;

import java.util.HashMap;

public class JavaMenuRepository implements MenuRepository {
    // java를 이용한 데이터베이스(db코드짜는것)

// 1번 방법
//    private List<Menu> menuDB = new ArrayList<>();
//    @Override
//    public void saveMenu(Menu menu) {
//        menuDB.add(menu);
//    }

    private HashMap menuDB = new HashMap();

    // Menu -> CafeMenu, DesertMenu ... 스벅메뉴(1), 투썸메뉴(2)..
    // 위와 같이 메뉴가 많아질 경우 id 부여해야 하므로 HashMap으로 함
    // list도 가능은 함
    @Override
    public void saveMenu(Menu menu) {
        int id = this.menuDB.size() + 1;
        System.out.println("ID : " + id);
        this.menuDB.put(id, menu);
    }

    @Override
    public MenuItem getMenuItem(int menuid, String menuName) {
        Menu menu = (Menu) this.menuDB.get(menuid); // 캐스팅(형변환)을 통해서 Menu임을 알려주는 것
        if (menu == null) throw new IllegalArgumentException("존재하지 않는 메뉴입니다.");
        return menu.getMenuItem(menuName);
    }

    @Override
    public Menu getMenu(int id) {
        Menu menu = (Menu) this.menuDB.get(id);
        if (menu == null) throw new IllegalArgumentException("존재하지 않는 메뉴입니다. 메뉴를 등록하여주세요.");
        return (Menu) this.menuDB.get(id); // id넣어주고 캐스팅해주면 menu 나오는 것
    }
}

---

package cafe.menu.repository;

import cafe.menu.Menu;
import cafe.menu.MenuItem;

public interface MenuRepository {
    void saveMenu(Menu menu);
    MenuItem getMenuItem(int menuid, String menuName);
    // getmenuitem 하나하나가 id가 있을 수 있으니까 menuid로
    // 명시적으로 MenuItem을 품고 있기 때문에 의도 전달을 잘 하기 위해 menuid로
    Menu getMenu(int id); // getmenu니까 id
}

---

package cafe.menu.repository;

import cafe.menu.Menu;
import cafe.menu.MenuItem;

public class SpringMenuRepository implements MenuRepository{
    // Mysql에 넣었다 뻈다.
    @Override
    public void saveMenu(Menu menu) {

    }

    @Override
    public MenuItem getMenuItem(int id, String menuName) {
        return null;
    }

    @Override
    public Menu getMenu(int id) {
        return null;
    }
}

---

package cafe.presentation;

import cafe.menu.Menu;
import cafe.menu.MenuItem;

// UI
public class MenuInterFace {
    public MenuInterFace(Menu menu) {
        System.out.println("=============== 메뉴 목록 ===============");
        for (MenuItem menuItem : menu.getMenuItemsList()) {
            System.out.println("메뉴 이름 : " + menuItem.getName() + ", 가격 : " + menuItem.getPrice());
        }
    }
}

---

package cafe.presentation;

public class UserInterFace {
    // 그리는 것
    public void run() {
        System.out.println("=============== 입력 ( 1번 ) 메뉴 생성 ===============");
        System.out.println("============= 입력 ( 2번 ) 메뉴 목록 조회 =============");
        System.out.println("=============== 입력 ( q ) 시스템 종료 ===============");
    }

}

0개의 댓글

Powered by GraphCDN, the GraphQL CDN