본문 바로가기

언어33

[PostgreSQL] 캐릭터형 AUTOINCREMENT AutoIncrement를 사용하면 1, 2, 3, 4 와 같은 시퀀스 ID가 자동으로 만들어지게된다. 하지만 때로는 위와 같은 방식이 아니라, 숫자형의 자리수를 정해서 0001, 0002 와 같은 ID를 만들어야 할 때가 있다. PostgreSql에서는 다음의 방법으로 위의 ID를 만들 수 있다. 쿼리는 다음과 같다. CREATE SEQUENCE IF NOT EXISTS START WITH 1 INCREMENT BY 1 NO MINVALUE || MINVALUE 1 NO MAXVALUE || MAXVALUE 99999 CACHE 1; CREATE TABLE IF NOT EXISTS ( column1VARCHAR(N)DEFAULT to_char(nextval('SEQUENCE_NAME'), 'FM0000.. 2021. 10. 25.
[PostgreSQL] 특정 칼럼 기준 가장 오래된 데이터 보여주기 조금은 이상하다고 느껴지는 요구사항을 만났다. 1:N 관계를 가진 테이블을 조인시켜, 대표적으로 하나의 데이터만 보여줘야 하는 요구사항이었다. 예를 들어 다음의 테이블이 있다고 가정하자. 설명하자면 하나의 상품이 있으면, 해당 상품을 판매하는 판매자는 여러 명이 될 수 있다. 하지만 사용자에게 보여줄 때는 모든 판매자를 보여주는 것이 아니라, 단 한 명의 판매자만 보여줘야 한다. 즉 1:N 관계의 테이블이나 마치 1:1 관계인 것처럼 보여줘야만 하는 것이다. 이를 테이블로 표현하면 아래와 같이 만들어진다. 물론 위처럼 조회용으로 테이블을 만들어서 별도로 만들면 편하겠지만, 오히려 코드가 복잡해질 가능성이 있고 관리해야 할 테이블이 늘어났다. 그리고 무엇보다 성격상 소위 말하는 가라를 치고 싶지 않았다. .. 2021. 10. 25.
[IFrame] 부모-자식 간 통신 IFrame이란 한 HTML 안에 다른 HTML을 삽입하는 기술이다. 기본적으로 같은 도메인 간 HTML을 IFrame으로 넣었다면 부모 HTML에서 자식 HTML의 요소는 아래와 같이 얼마든지 호출이 가능하다. document.getElementById(IFrameName).contentWindow.document.getElementById(id) 하지만 만약 타 도메인의 HTML을 IFrame으로 넣었다면, CORS 관련 에러가 발생하며 조작이 불가능해진다. 그렇다면 타 도메인의 HTML을 IFrame으로 불러와 그 요소를 조작해야 한다면 어떻게 해야할까? 이 경우, 부모와 자식이 메시지를 주고받는 형식을 만듬으로써 해결할 수 있다. 테스트를 위해 위와 같은 웹 페이지를 구현하자. HTML 코드는 아.. 2021. 10. 16.
[Ajax] Ajax를 활용한 통신 AJax (Asynchronous JavaScript and XML) AJax는 웹 페이지 전체를 다시 로딩하지 않고, 웹 페이지의 일부분만을 갱신함으로써 동적인 페이지를 만들어줄 수 있게 해주는 기법이다. AJax를 사용하면 굳이 프론트가 움직이지 않아도 백그라운드 영역에서 서버와 통신이 가능하고, 그 결과를 토대로 페이지 내의 요소를 동적으로 바꾸어줄 수 있다. XMLHttpRequest XMLHttpRequest는 웹 브라우저가 서버와 데이터를 교환할 때 사용된다. 현재를 기준으로 대부분의 웹 브라우저 (익스플로어는 7 이상) 가 해당 객체를 내장하고 있고, AJax는 이를 활용하여 서버와 통신할 수 있다. 사용법 Ajax의 대략적인 사용법은 아래와 같다. 물론, 모든 항목의 값을 지정해줄 필요까지.. 2021. 10. 16.
[JQury] 제이쿼리 사용법 JQuery JQuery는 HTML의 클라이언트 사이드 조작을 단순화하기 위해 개발된 크로스 플랫폼의 자바스크립트 라이브러리이다. 그냥 간단하게 말하자면, DOM 조작에 있어 여러 기능을 탑재했고 사용이 간편한 자바스크립트의 라이브러리라고 볼 수 있다. 처음에는 document. window. 같은 함수들을 이용하면 얼마든지 DOM 조작이 가능한데 굳이 왜 써야하나 싶었는데, 위의 방식보다 더 다양한 기능들을 제공하고 있었고 사용하다보니 편하다는 생각이 들어 포스팅을 작성하게 되었다. JQuery를 사용했을 때의 장점은 다음과 같다. 웹 페이지의 DOM을 쉽게 검색하고 조작할 수 있다. 웹 페이지의 종류와 무관하게 호환성이 좋다. 메소드 체이닝이 짧고, 코드의 유지관리가 용이하다. 오픈소스이기에 누구나 .. 2021. 10. 14.
[JAVA] Call by Value & Call by reference 두 방식은 메소드 (함수, Function)을 호출할 때 해당 메소드에 파라미터를 넘겨주는 방식이다. 이 중 값을 넘겨주는 방식을 Call by value, C++에서는 포인터라고 표현되는 참조값을 넘겨주는 방식을 Call by reference라고 한다. Call by value는 단순히 값만 넘겨주는 방식이므로 파라미터로 넘겨준 값이 변해도 원래 변수의 값은 변하지 않는다. 하지만 Call by reference는 참조값을 넘겨주는 방식이기에 변수의 값이 변하면 원래 변수의 값도 변하게 된다. 그렇다면 JAVA는 Call by value 일까, 아니면 Call by reference일까? 아래의 예시를 보자. public class HelloWorld{ public static class exampl.. 2021. 4. 29.
[JAVA] == vs equals vs hashCode == 객체, 참조 타입에서 가리키는 주소가 같은지 확인한다. 즉, 같은 객체인지를 확인한다. equals() 객체의 내용 (값)이 같은지 확인한다. hashCode() 메모리에서 가진 해시 주소값을 반환한다. 상세하게 설명하면 주소값를 비교함으로써 같은 객체임을 확인하는 함수이다. 하지만 hashCode를 사용한 비교는 그렇게 정확하지 못한데, hashCode는 객체마다 유일한 값을 리턴하지 않고, 다른 객체임에도 같은 hashCode를 갖는 경우가 생기기 때문이다. 같은 hashCode를 갖게 되는 것은 HashTable이 의 형태로 데이터를 저장할 때, 키 값을 기준으로 해시값을 만들기 때문이다. 이 때 HashTable은 크기가 한정적이기에 서로 다른 객체가 같은 해시값을 가질 수 있다. 이를 해시.. 2021. 3. 30.
[JAVA] Garbage Collection (GC) 자바의 코드와 C 계열 언어들의 코드를 비교해보면, C 계열 언어는 클래스 선언 시 생성자와 소멸자를 정의해주지만, 자바의 경우에는 생성자만 정의하곤 한다. 이러한 차이점은 C 계열 언어들과 달리 자바에서는 개발자가 굳이 메모리를 해제하지 않아도 되기 때문이다. 그 이유는 GC 때문이다. JVM의 GC는 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제하는 역할을 수행한다. GC는 메모리의 힙 영역을 돌아다니며 더 이상 사용되지 않는 인스턴스에 할당된 메모리를 삭제하는데, 이를 위해 자바는 GC를 실행하기 위해 GC의 쓰레드를 제외한 다른 쓰레드들을 전부 잠시 멈추었다가, GC의 동작이 완료된 이후 재개해야 한다. 이러한 동작을 Stop the World 라고 한다. Stop The World는 당.. 2021. 3. 30.
[JAVA] String, StringBuffer, StringBuilder 자바에서 문자열을 다룰 때, 대표적으로 String, StringBuffer, StringBuilder를 사용한다. 사실 데이터의 변경이 많지 않을 때, 즉 연산이 거의 없을 때는 위의 클래스 중 어느 클래스를 사용하여도 큰 문제는 없다. 하지만 세 개의 클래스는 분명 다른 목적으로 개발되었고, 그 차이점은 개발자 면접 질문에서 자주 출제되는 질문이다. String은 원래 불변이다. 즉, 원래는 변할 수 없는 클래스이다. 하지만 Java에서 String은 변경이 가능하다. String str = "abc"; str += "de"; System.out.println(str); 위처럼 코드를 구동해보면 출력은 abcde가 된다. 즉, 변할 수 있다. 하지만 그 변화하는 과정이 조금 비효율적이다. str을 선.. 2021. 3. 30.
[JAVA] BufferedReader와 Scanner 자바는 콘솔에서 입력을 받을 때 가장 자주 사용하는 두 가지 클래스가 있다. 하나는 BufferedReader, 다른 하나는 Scanner이다. 두 클래스는 콘솔에서 입력을 받는다는 공통점이 존재하지만, 차이점도 존재하는데, 가장 큰 차이점은 바로 속도이다. BufferedReader는 버퍼를 사용해 입력을 받는다. 즉 키보드가 입력될 때마다 한 문자씩 버퍼로 이동하여 저장하고, 버퍼가 가득 차거나 줄바꿈이 일어나면 버퍼의 내용을 한 번에 전송하는 방식으로 사용된다. 이러한 점은 기존의 문자열을 한 글자 단위로 읽는 InputStreamReader에서 발전한 형태이며, 속도가 빠르다는 장점이 있다. 그렇기에 알고리즘 문제에서 Scanner 대신 자주 사용된다. BufferedReader의 단점은 모든 입.. 2021. 3. 30.
Python range float list(range(1,10,0.1)) range의 step 파라미터는 int형만 올 수 있다. 그렇기에 위의 코드를 돌리면 'float' object cannot be interpreted as an integer 와 같은 에러가 발생한다. 그렇기에 소수 배열을 만들기 위해서는 저렇게 쓰지 말고 import numpy as np list(np.arange(1, 10, 0.1)) 을 사용해야 한다. 2021. 2. 15.
Lambda를 활용한 Activate Function import matplotlib.pyplot as plt import numpy as np %matplotlib inline x = list(range(-100,100)) step_y = list(map(lambda a : 1 if a>0 else 0, x)) sign_y = list(map(lambda a : 1 if a>0 else -1, x)) sign_y[100] = 0 #lambda는 elif가 없음. sigmoid_y = list(map(lambda a : 1 / (1 + np.exp(-a)), (x))) relu_y = list(map(lambda a : a if a>0 else 0, x)) fig, (ax1, ax2, ax3, ax4) = plt.subplots(figsize = (18, .. 2021. 2. 12.