자바의 extends 와 implement
- extends는 미리 정의된 클래스를 상속 받을 때 사용한다.
- implement는 인터페이스를 상속받아 재정의 할 때 사용한다.
- 자바는 다중상속이 불가하여 extends가 하나의 클래스만 가능하다.
- 하지만 c++은 다중 상속 가능
- 다중 상속을 하고 싶다면 자바는 implement를 이용해야함.
- c++에서 자바 인터페이스 같은 상속을 하고 싶다면 해당 클래스의 모든 메소드에 virtual을 붙여줘야함.
싱글톤 패턴이란?
애플리케이션이 시작될 때 최초 한번만 메모리가 할당되고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴. staic이다.
생성자가 여러 차례 호출되더라도 실제로 반환되는 객체는 하나다. 싱글톤은 단 하나의 인스턴스를 사용하는 디자인패턴이다.
그렇다면 왜 쓰는지?
- 메모리 낭비 방지. 하나의 객체로 사용하기 때문이다.
- 데이터 공유가 쉬움. 전역 인스턴스이기때문.
다익스트라, A*, CCH
- 다익스트라 알고리즘은 출발지에서 목적지까지의 최단 거리를 구한다는 목적이 확실하다. 1:1 매핑
- 하지만 모든 방향에 대해서 탐색을 하기 때문에 성능이 좋지는 않다.
- 이러한 단점을 보완하기 위해 생성된게 A* 알고리즘이다.
- 휴리스틱 함수가 적용되기 때문에 잘못 설정하면 성능이 별로일 가능성이 존재함.
- 대체로 다익스트라보다 더 빠르고 탐색을 덜 시도해서 길을 찾는것이 가능함.
- 가장 최근 사용되는 알고리즘은 CCH(커스텀 가능한 지름길 찾기)
- 실시간 도로 교통상황이나 변수들에 대해 대응이 가능하다.
- 한번 생성된 지름길은 변수값이 변경되더라도 동일한 지름길이다.
- 실시간 데이터 반영이 가능하고 다른 알고리즘에 비해 성능이 매우 뛰어나다.
- 하지만 데이터 전처리 시간이 꽤 오래 걸리는 단점이 있긴 하다.
Map based ADAS
- 현재 경로탐색에는 전통적인 GPS 방식과 좀더 발전된 네비게이션맵 그리고 더 발전한 ADAS 맵입니다.
- ADAS 맵에는 기존 네비게이션맵에 도로의 곡률, 경사도, 표지판 레인 정보가 들어갑니다.
- 더욱 더 정확한 길 안내가 가능합니다.
- 곡률이 0이면 직선도로 양수면 오른쪽으로 굽은 도로 음수면 왼쪽으로 굽은 도로입니다.
어떻게 만들어지나요?
- 현장 조사, 데이터 보정인 데이터 수집이 먼저 이루어짐.
- 이러한 데이터에서 객체를 추출하는 편집 과정.
- 이를 데이터베이스에 매핑하는 매핑 과정.
- ADAS 데이터를 다시 AppDB에 적재하는 변환 과정.
추상클래스란?
추상클래스란 abstract 키워드를 사용해 생성한 클래스이다. 이 클래스를 상속하는 클래스가 반드시 해당 메소드를 구현하게끔 하려는게 목적이다. 추상클래스는 추상메소드가 포함될 가능성이 존재하여 객체생성이 불가능하다. 따라서 하위클래스는 일반클래스를 이용하여 추상 메소드를 반드시 재정의 해야한다.
오버로딩과 오버라이딩 차이는?
- 오버로딩은 재정의 하는 함수의 return 타입이 변경돼도 상관없다.
- 인자의 갯수, 타입등 다 달라도 됨. 함수 이름만 같으면 된다.
- 오버라이딩은 재정의 하는 함수의 인자의 갯수, 타입이 같아야 하고 return 타입도 같아야 한다.
자바 컬렉션이란
set, list, map등 자주 사용되는 자료구조를 제네릭 기법을 이용해 구현하여 컬렉션으로 만든게 자바 컬렉션 클래스다.
제너릭 타입이란 무엇인가요?
클래스를 정의할때 특정 타입에만 종속하는게 아닌 모든 타입에 대해 적용되게끔 구현한것이다. Stack 등등. c++에서는 템플릿이라고도 부름.
클라이언트 서버통신
- 클라가 서버에 요청을 보낸다.
- 서버는 해당 요청을 처리한다.
- 응답 데이터를 다시 클라이언트에 반환한다.
- 200번대 작업 성공
- 400번대 무언가 잘못됨.. 클라가 요청을 잘못했단 의미.
- 500번대 서버에 문제가 있을시 나타나는 코드.
카카오 CI API 사용하여 간편인증 구현.
- 해당 데이터는 민감 데이터라 바로 권한을 주지 않았음.
- 비즈니스 채널 등록하고 비즈니스앱으로 등록하여 심사후 권한 획득.
- 로그인 기능중 간편 로그인 추가하여 api 호출로 얻은 ci와 자사 db에 저장된 ci 값을 비교하여
기존 고객이라면 로그인 패스로 구현했음.
기존 크롤러 개선한 방법
- 기존 크롤러는 jsoup을 사용해 직접 방문후 각 태그에서 값을 추출해 크롤링을 진행했음.
- 하지만 만약 웹 사이트 구조가 바뀐다면? 별일 아닌걸로 유지보수를 해야함..
- 실제로 종종 플레이스토어 구조가 변경돼서 유지보수 종종 했다함.
- 이는 너무 비효율적이란 생각이 들었고 apple, google API 사용하기로 결정.
- google은 쉬운데 apple은 jwt를 인증 수단으로 사용해야 했음.
- json을 암호화해서 토큰으로 보내 유효한 사용자인지 체크하는 것임.
- 헤더에 보냈음.
- 해당 방식을 통해 더이상 구조가 변경돼도 수정할 일이 없어짐.
- 하지만 싱글 스레드라 속도가 너무 느리고 네이티브 쿼리 너무 별로임.
- 90개 동작 테스트 하는데 10분이나..?
- 이를 해결하기 위해 ThreadPoolTaskExecutor를 사용해 멀티스레드로 전환함.
- 네이티브 쿼리 반복 사용을 피하기 위해 JPA로 구현.
- 왜냐면 DB에서 마켓정보, 셋팅 정보를 가져와서 세팅에 정한 시간에 마켓정보를 가져와서 센드 DB에 넣고 다시 센드 DB 에서 보낼 리스트를 가져와서 이를 크롤링 하는 구조임.
- 그래서 쿼리가 필요함. 이를 JPA로 변경하여 네이티브 쿼리 없애고 객체지향적 구조로 변경함.
- 추출할 속성이 늘어도 쿼리 수정할 필요없음.
- 10분 걸리던 시간도 1분30초로 줄였음.
JAVA ArrayList vs LinkedList
- ArrayList는 다이나믹 배열 활용해 저장.
- LinkedList는 연결 리스트 방식임.
- ArrayList는 배열 기반이기 때문에 접근이 빈번하다면 사용하기 좋음. 하지만 삽입 삭제가 느림
- LinkedList는 삽입 삭제에 좋은 성능을 보인다.
- 접근이 빈번하다면 ArrayList
- 삽입 삭제가 빈번하다면 LinkedList 를 쓰자!
자바와 C++ 차이
- c++은 다중상속이 가능하고 자바는 단일 상속만 가능.
- c++은 friend 키워드를 통해 private도 접근 가능하지만 자바는 해당 키워드 자체가 없음.
- 자바는 인터페이스를 지원한다.
- 자바는 객체를 메모리의 heap영역에만 할당 가능. 하지만 c++은 heap, stack에 가능하다.
- 자바는 메모리 해제가 자동으로 되지만 c++은 개발자가 수동으로 해야함. 소멸자를 통해 메모리 해제가 가능.
- c++은 연산자 오버로딩이 가능하지만 자바는 할 수 없다.
- 자바는 가상 머신이 필요하지만 c++은 각 머신에 맞는 기계어로 컴파일한다.
- 자바는 객체가 레퍼런스로 전달되지만 c++은 기본적으로 값전달을 사용한다.
- 자바가 개발 속도가 더 빠르므로 기존에 작성한 c코드가 없다면 자바로 하는게 보편적.