전체 글 109

[실시간 위치인식 시스템] 기존 시스템의 문제점 파악 및 개선, 시각화 소스코드 구현

1. 전체 시스템 아키텍쳐 전체 시스템의 구조는 위 그림과 같습니다. 3개의 고정되어 있는 앵커와 1개의 고정되어 있는 태그 그리고 게이트웨이로 구성되어 있습니다. 2. 기존 시스템의 문제점 파악 및 해결 방안 탐색 시스템 동작원리는 크게 세 부분으로 구성됩니다. 1. 앵커와 태그 사이의 거리 측정 및 태그의 좌표 값 계산(Trilateration), 2. 태그의 좌표값을 게이트 웨이에게 전송, 3. 게이트웨이가 수신한 태그의 좌표값을 PC에 구성 된 UDP 서버로 전송 하지만 이 부분에서 치명적인 단점이 있었습니다. 3개의 앵커와 태그 사이에서 총 3개의 거리 값을 측정하고, 이를 기반으로 Trilateration 방식으로 태그의 좌표를 계산할 때, 앵커의 좌표가 필요합니다. Trilateration을..

위치인식 연구 2023.08.11

[Spring] Bean의 개념과 동작원리, Annotation

자바에서 유지보수하기 편리한 소스코드는 분리가 잘 되어 있어야 한다. 1. 관심사의 분리 2. 변하는 것과 변하지 않는 것의 분리 3. 중복코드 위 세가지가 잘 분리 된 소스코드가 좋은 소스코드이다. 왼 쪽 사진의 윗 부분의 소스코드를 아랫부분으로 수정하면 수정해야 할 부분이 한 곳으로 줄어든다. 하지만 오른쪽 코드처럼 객체를 생성해서 인스턴스를 주입하는 메서드를 따로 만들어서 객체를 주입하면 더욱 변경에 용이한 소스코드가 된다. 객체를 주입하는 메서드를 정의한 모습이다. Map과 비슷하게 key value가 String으로 정의되어 있는 자료구조이다. config.txt에 =구분자로 구분 된 key와 value를 읽어 들인다. 그리고 key에 맞는 value의 타입의 클래스 인스턴스를 생성해서 반환한다..

Spring 2023.07.27

[야놀자 테크스쿨] 계획

07/24 멘토링 요약 : 일단 무조건 실무에서 쓰는 SpringBoot + JPA를 해야한다. 왜냐하면, 시간은 한정되어 있기 때문에 학자처럼 기술이 발전한 흐름따라 공부할 여유가 없다. 모르는 내용은 최대한 그때 그때 이전 강의로 돌아가면서 채워넣는 방식으로 해야한다. 이력서는 미리 써야한다. 내용이 없더라도 어떤 내용을 채워넣을지 미리 작성해놓고, 그걸 한 다음에 이력서에 적으면 된다. MyBatis로 쿼리짜는 연습을 한 뒤, JPA로 넘어가는 것이 좋다는 것이 공통된 의견 남궁성 스프링의 정석 강의 최대한 빠르게 완강하고, 8월 첫째 주 까지 Spring + MyBatis를 이용해 CRUD 구현한 게시판을 최대한 빠르게 만들고 이해가 잘 가지 않는 내용을 다시 복습한 뒤, SpringBoot+JP..

[Java] 반복문(break, continue)

자바에는 크게 3가지의 반복문이 존재합니다. 그 중에서도 알고리즘 문제풀이나, 어떤 로직을 구현할때 가장 요긴하게 사용되는 break와 continue에 대해서 정리합니다. break break문은 감싸고 있는 제어문의 블록을 빠져나오는 기능을 합니다. 여러 반복문이 중첩되어 있는 경우에는 가장 인접한 반복문에서 탈출합니다. continue 반복문 내부에서 조건문과 같이 사용하며, 조건이 참인 경우 반복문 내부의 다른 수행문들을 수행하지 않음. 3의 배수를 출력하는 프로그램입니다. 변수 num이 3의 배수가 아닐 때, 아래 출력문을 수행하지 않고, for 루프를 계속 돕니다.

[Java] 조건문

자바 조건문에서 흔히들 사용하는 if else 구문 이외에 switch case 구문이 사용되는 경우가 있습니다. switch case문이 사용되는 경우는 보통 가독성을 위해서 쓰는 경우가 많습니다. if (조건식) { 수행문 1; // 조건식이 참일 경우 수행. } // 블럭 안에 수행문이 1개일 경우 괄호 {} 생략이 가능함 if (조건식) 수행문; // if-else 문 if (조건식) { 수행문 1; // 조건식이 참일 경우 수행. } else { 수행문 2; // 조건식이 거짓일 경우 수행. } ================================================== if (조건식 1) { 수행문 1; // 조건식 1이 참일 경우 수행 } else if (조건식 2) 수행문 2..

Java 연산자 (삼항 연산자, 비트 연산자)

삼항 연산자 조건문을 사용해서 코딩을 하다보면 if ... else if ...else if ... else 형태로 의미없이 코드가 길어지는 경우가 발생합니다. 단순한 if 문일 경우 삼항연산자를 사용하면 소스코드의 길이를 획기적으로 줄일 수 있습니다. 삼항연산자는 조건문이 참 or 거짓일 경우를 판별하는 경우에 쓰입니다. 조건문의 참 거짓에 따라 콜론을 기준으로 왼쪽에 참일 때, 오른쪽에 거짓일 때의 값이 변수에 할당되는 형태로 이루어져 있습니다. ArrayList arr = new ArrayList(); int num = arr.isEmpty()?1:0; System.out.println(num); arr.add(1); int num2 = arr.isEmpty()?1:0; System.out.prin..

Java의 자료형(리터럴과 부동소수점 방식)

자바에서 변수에 값을 대입하여 선언을 하는 경우에 오류가 나는 경우가 있습니다. long num = 12345678900; 위와 같이 선언할때 long num이 의미하는 것은, stack 메모리에 long 타입의 8byte 크기의 num이라는 이름의 메모리 공간이 생긴다는 것을 의미합니다. 고리고 12345678900이라는 수는 Operands stack이라는 기억공간에 일시적으로 적재되었다가 값이 복사되어서 num이라는 변수 메모리 공간에 저장됩니다. 정수형 리터럴은 기본적으로 4byte의 공간이 할당됩니다. 그러므로 21억 즉 int의 공간이 넘어가는 수는 명시적으로 L을 작성해서 Operands stack에 8byte 공간을 할당해서 임시적으로 적재한 뒤, 변수에 값이 저장되도록 해줘야 합니다. 또..

[야놀자 테크스쿨] 부트캠프 시작!

7월 10일부터 야놀자x패트스캠퍼트 백엔드 테크스쿨 과정이 시작되었습니다. 거의 대부분의 부트캠프가 재학중에는 수강이 불가능한데, 야놀자 테크스쿨은 재학생도 참여가 가능하길래 냉큼 신청했습니다! 왜냐면 저는 6학점밖에 남지 않아서, 온라인 교양강의만 수강하면 되기 때문입니다 ㅎㅎ. 많은 수업이 패스트캠퍼스에서 제공하는 온라인강의와 화려한 강사님들의 실시간 강의도 제공된다는 것이 정말 좋은 기회를 잘 잡은 것 같습니다. 저는 학점과 공인어학점수도 보유중이고 자격증도 취득계획이지만, 가장 중요한 프로젝트 경험이 없어서 정말 걱정이 많았는데, 야놀자 테크스쿨은 프로젝트를 커리큘럼이 프로젝트를 중심으로 돌아간다고 봐도 무방할 정도로 프로젝트가 많습니다. 오늘 Github pull request 실습을 해서 어쩌..

ArrayList와 LinkedList의 차이점 그리고 ListIterator

자바에는 ArrayList와 LinkedList가 내장 클래스로 모두 구현이 되어 있습니다. 언제 ArrayList를 사용하고 언제 LinkedList를 사용해야 할 지 헷갈릴 때가 많아 오래도록 기억하고자 포스팅하게 되었습니다. 백준 알고리즘 1406번 에디터 문제입니다. 정답률이 26%밖에 되지 않는 아주 어려운 문제였습니다. https://www.acmicpc.net/problem/1406 1406번: 에디터 첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수 www.acmicpc.net 저는 이 문제를 보고 ArrayList를 사용할지 LinkedList..

자바 OOP 2023.06.01

BufferReader로 입력받을 때 StringTokenizer를 사용해야 하는 경우

자바에서 키보드 입력을 받을 때는 Scanner를 사용하는 방법과 BufferReader를 사용하는 방법이 있습니다. 알고리즘 문제를 풀 때는 시간이 중요하기 때문에 속도가 빠른 BufferReader를 많이 사용하곤 합니다. Scanner는 1KB의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면, BufferReader는 8KB 크기의 버퍼를 가져 buffer에 입력들을 저장했다가 한 번에 전송하기 때문에 속도가 빠릅니다. 또한, Scanner는 입력을 읽는 과정에서 내부에서 정규 표현식 적용, 입력값 분할, 파싱 과정 등을 거치기 때문에 속도가 느립니다. BufferReader는 타입이 String타입으로 고정이 되어 있습니다. 그래서 Integer.ParseInt() 와 같은 메소드를 호출하여 형변..

알고리즘 2023.05.27