:: 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();
UI(User-Interface)
- 위키 정의
- 사람(사용자)과 컴퓨터시스템 사이의 의사소통 매개를 의미한다. 이 의사소통은 해당 기기에 대해 효율적인 작동과 사용자의 제어를 보장하는 것을 목표로 한다. 주변의 터치스크린, 마우스 등은 UI를 물리적으로 볼 수 있는 좋은 예시이다.
- 일반적인 웹 또는 앱 서비스
- 브라우저
- Chrome, Safari, Firefox, Explorer, Whale, Edge
- 앱
- 안드로이드 앱
- IOS 앱
카페 시스템 중에서 메뉴 목록을 저장하고, 보여주는 부분을 생각해보자.
Presentation Tier(UI)
- 브라우저
- 메뉴 목록 조회 요청을 한다.
- 주문 가능한 메뉴 목록이 노출 된다.
- 메뉴를 저장한다.
- 자바 콘솔
- 메뉴 목록 조회 요청을 입력 받는다.
- 주문 가능한 메뉴 목록이 노출 된다.
- 메뉴를 저장한다.
Application Tier
- pring
- 메뉴 목록 조회
- Data Tier에 저장 되어 있는 메뉴 목록을 조회 한다.
- 조회 한 메뉴 목록을 네트워크를 통하여, Presentation Tier로 전달한다.
- Network
- 자바
- 메뉴 목록 조회
- Data Tier에 저장 되어 있는 메뉴 목록을 조회 한다.
- 조회 한 메뉴를 Presentation Tier로 전달한다.
- 그냥 값 전달
- 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 ) 시스템 종료 ===============");
}
}