목록전체 글 (385)
만족
Firebase에서 단일 객체에 대해 I/O를 할때는 딱히 어려움을 겪을 일이 없다 그러나 ArrayList와 같은 배열 객체를 I/O할때는 주의해야 한다. 위와 같은 형태로 데이터베이스가 구성되어 있다고 하자. 겉보기에는 ExArray1과 ExArray2의 내용은 같은 것 처럼 보인다. 그러나 JSON 내보내기 기능을 이용해서 JSON 파일을 살펴보면 처럼 ExArray1과 ExArray2는 저장방식이 조금 다르다는 것을 알 수 있다. 형태가 다르면, 당연히 데이터를 가져올 때에도 서로 다른 방식으로 가져와야 한다. ExArray1의 경우 ArrayList으로 가져온다. 가져올 때 Object타입으로 가져왔으므로 그것을 ArrayList으로 캐스팅해서 사용하면 되는 것이다. ExArray2의 경우 Ha..
어떤 listener들의 method는 boolean값을 return한다. 이 return value가 의미하는 것은 true //다음 listener를 호출 불가능하게 한다false //다음 listener를 호출 가능하게 한다. 예를 들어서 ListView의 각각의 Item들에 LongClick listener와 Click listener가 적용되어 있다면 LongClick이 끝난 뒤에 Click이 실행되게 되는데 만약 LongClick에 정의한 행동만을 실행하고 싶다면 LongClick Listener의 메소드의 리턴값을 true로 전달하면 된다. 그렇게 하면 다음 Listener로 흐름이 넘어가지 않는다.
참고 https://academy.realm.io/kr/posts/constraintlayout-it-can-do-what-now/ https://academy.realm.io/kr/posts/cool-constraintlayout-droidcon-boston-2017/ 요약 ConstraintLayout은 RelativeLayout과 비슷한 역할을 할 수 있게 고안된 Layout이다. 그러나 RelativeLayout은 연산속도에 있어서 계속해서 부모 컨테이너와의 관계를 계산하기 때문에 문제가 있지만 ConstraintLayout은 새로운 알고리즘을 사용하여 연산속도가 Linear하기 때문에 RelativeLayout보다 우수한 성능을 가질 수 있다. 그러나 굳이 모든 dev environment에서 ..
"English Explain exist below.Please Scroll Down" 파이어베이스는 서버가 필요하지만 번거롭거나, 백엔드 지식이 없을 때 사용할 수 있는 편리한 기능을 제공한다. 하지만 API에 있는 정보만으로는 원활한 개발에 상당히 어렵다는 것을 느낀 사람이 많을 것이다.(가이드는 친절하지만 종종 더 자세한 설명을 얻고 싶을 때 API에서 찾아보면 "한 줄 설명"이 꽤나 많기 때문이다...)(물론 그렇지 않은 사람도 많을 것이다.) 특히 데이터베이스의 데이터 입출력에 관해서, 데이터를 가져오는 경우 set메소드가 존재하지만데이터를 내보낼 때는 get이 아닌 Listener를 활용하기 때문이다. 그래서인지 즉각적으로 데이터를 교환하기가 상당히 까다롭고, 검색으로도 해답을 찾기 상당히 힘..
최근 가상화폐에 대한 관심이 급속도로 높아지면서 많은 말들이 나오고 있다. 게다가 정부에서 가상화폐에 대한 강도높은 직접적 규제를 암시하면서, 이에 대한 찬반론이 심화되고 있다. 우선 가상화폐에 대한 설명을 잠깐 하자면, 가상화폐의 핵심 기술은 블록체인(Block Chain)이라는 기술이다. 가상화폐 사용자들이 일정 시간마다 모여서 거래내역을 기록하는 일종의 '장부(Block)'를 함께 기록하여이 블록들을 Chain처럼 엮어서 거래 내역을 조작하지 못하게 하는 기술이 블록체인이다. 가상화폐 소유자들이 각각의 BlockChain을 가지고 있기 때문에, 한 사용자가 악의적으로 Block을 수정하더라도나머지 사람들의 BlockChain은 바뀌지 않을 것이라서, 과반의 BlockChain이 "진짜 장부"로써의 ..
기본적으로 존재하는 뷰 외에도 사용자가 직접 View Class를 상속받아서 개발자 임의로 View를 만들어 사용할 수 있다. package com.example.windows7.myapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; /** * Created by WINDOWS7 on ..
이분 탐색(Binary Search) 정렬되어 있는(이분 탐색의 주요 조건) 배열에서 데이터를 찾으려 시도할 때, 순차탐색처럼 처음부터 끝까지 하나씩 모든 데이터를 체크하여 값을 찾는 것이 아니라 탐색 범위를 절반씩 줄여가며 찾아가는 Search 방법이다. 작동예시 1 2 3 4 5 6라는 값에서 6을 찾고자 한다면 배열의 중간에 위치한 3이라는 값과 6을 비교한다. 6은 3보다 크므로, 이제 3의 왼쪽에 위치하는 값들은 탐색할 필요가 없으므로 (어차피 3 왼쪽에 있는 수들은 3보다 작기 때문이다) 3의 오른쪽에 있는 값들을 대상으로 탐색을 다시 시도한다. 이제 4 5 6이 남았으므로, 다시 중간값인 5와 찾고자 하는 대상인 6를 비교한다. 6은 5보다 크므로, 5의 오른쪽에 있는 값들을 대상으로만 탐색..
퀵 정렬 Merge Sort와 비슷하게 Divide and Conquer기법을 사용하고 Recursive Function을 이용한다. 매 재귀마다, Quick Sort는 Pivot이라는 정렬의 기준이 될 기준을 선정한다. 효율적인 Pivot을 선정하는 방법은 다음에 설명하기로 하고, 우선 Pivot을 현재 배열의 마지막 데이터로 하기로 하자. 그 Pivot을 기준으로 Pivot보다 작은 데이터들은 Pivot의 왼쪽으로, 큰 데이터들은 Pivot의 오른쪽으로 옮긴다. 그러면, Pivot은 제 위치를 찾게 되고(정렬이 끝난 뒤의 위치에 존재한다) 정렬되지 않은 배열은 Pivot의 왼쪽과 오른쪽이다. (2개의 정렬되지 않은 부분배열로 나누어진다.) 이제 정렬되지 않은 부분배열에 대해서 Quick Sort를 반..
병합 정렬 n개의 정렬되지 않은 데이터들이 들어있는 배열에서1번째부터 n/2번째까지, n/2+1번째부터 n번째까지의 데이터를 2개의 배열로 나누고 이 나누어진 배열을 다시 1번째부터 (n/2)/2번째까지, (n/2)/2+1번째부터 n/2번째까지의 2개의 배열과(n/2)+1번째부터 (n/2)+1 + (n/2)/2번째까지, (n/2)/2+1 + (n/2)/2+1번째부터 n번째까지 2개의 배열로 나눈다. 이러한 과정을 계속 반복하여각각의 array의 길이가 1이하가 될 때 까지 n개의 데이터가 들어있는 1개의 배열을 k개의 부분배열로 나눈다. 그리고 잘게 쪼개어진 배열들을 2쌍씩 묶어서 정렬한다. 쉽게 말해서, 큰 문제를 여러 개의 작은 문제들로 쪼개어 처리하는 Divide and Conquer기법을 사용한다..
n개의 데이터가 있는 배열이 있다고 하자. 2번째 데이터부터 n번째 데이터까지 하나씩 데이터를 선정하여 반복하는데 선정된 데이터의 번쨰(index)가 k번째 데이터라면 k-1번째 데이터부터 1번째 데이터까지 k번째 데이터와 비교하면서, 만약 비교당하는 ?번째 숫자가 k번째 데이터보다 크다면 ?번째 데이터를 오른쪽으로 한 칸씩 옮긴다. 그리고 ?번째에 원래의 k번째에 있던 데이터를 삽입한다. 이 과정이 끝나면 k+1번째를 시작하면서 같은 과정을 n번째 데이터까지 반복한다. Java Code public static void insertionSort(int[] array){ for(int i=1; i=0 && array[j]> target){ array[j+1]= array[j]; j--; } array[j..
선택 정렬 오름차순 정렬을 한다고 하면, n개의 데이터가 있는 배열에서 첫 번째 데이터를 선택하고, 두 번째 부터 n번째 배열을 첫 번째 데이터와 비교하면서 가장 작은 값의 데이터를 찾는다. 찾았다면, 그 데이터와 첫 번째 데이터의 위치를 서로 바꾼다. 이 과정을 첫 번째 데이터부터 n-1번째 데이터까지 반복한다. [Java Code] public class EEE { public static void main(String args[]){ int array[]= {1,3,4,6,2,8}; selectionSort(array); for(int i=0; i arr[k]) { minIndex = k; } } if (minIndex !== l) { const temp = arr[minIndex]; arr[min..
Session은 Client와 Server가 관계를 유지하는 방법으로써 사용된다. Client가 Server에 request를 보내면 Server는 Client는 고유한 ID를 가진 Session 객체를 만든다. Session은 쿠키와는 다르게 Client측에 데이터를 저장하지 않고 Server에 저장하기 때문에 쿠키보다 보안상 안전하다. JSP에서는 Session객체를 session변수를 이용해 접근할 수 있다. [Session에 Data Set] session.setAttribute("name1", "value1"); session.setAttribute("name2", "value2"); 처럼 저장한다. setAttribute의 첫 매개변수는 String type으로 된 해당 data의 key값이다..
외부에서 웹사이트의 접속 등에 의하여 서버에 접속하게 되면, 서버는 1명당 1개의 커넥션 객체를 만들게 되는데 필요할 때마다 1개씩 새로 만들게 되면 한번에 많은 인원이 접속할 때 서버에 큰 부하가 걸리게 된다. 미리 커넥션 객체를 여러 개 만들어서 부하를 줄일 수 있는 방법이 있는데, 그것을 커넥션 풀 이라고 한다. Servers의 context.xml의 Context태그 내부에 다음 태그를 추가한다. 여기에서 maxActive는 미리 만들어 둘 커넥션 객체의 갯수이다. maxWait는 미리 만들어 둔 커넥션 객체를 초과하여 커넥션 객체가 필요할 경우, 새로운 객체를 만들기까지 대기하는 시간이다. 또한 이렇게 지정해 두면, Java에서 데이터베이스를 사용할 때 상당히 편리하다. 기존의 Database ..
DAO와 DTO는 Database와 통신 시에 사용하는 Design Pattern중 하나이다. DAO는 Data Access Object로 데이터베이스에 접근 할 때 사용하는 객체이고 DTO는 Data Transfer Object로 Database에 Access하여 가져온 데이터들을 규격화한 객체이다. DAO/DTO 패턴을 사용하면 반복되는 코드가 줄어들고, 규격화된 데이터들로 인해 효율성이 증가한다. 예를 들어 member라는 table을 대상으로 DAO/DTO 패턴을 적용하면 public class MemberDAO { public MemberDAO() { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (Exception e) { S..
Servlet이 초기에 생성될 때 필요한 기본적 Parameter 외에 개발자가 따로 필요한 정보가 있다면 web.xml이나 그 Servlet안에서 직접 필요한 Parameter를 임의로 넣어줄 수 있다. Method 1) Servlet파일 내의 Annotation에 직접 기술 @WebServlet("MAPPING NAME") 처럼 되어 있는 기본 WebServlet annotation을 다음과 같이 변경한다. @WebServlet(urlPatterns={"MAPPING NAME"}, initParams={@WebInitParam(name="name1", value="value1"), @WebInitParam(name="name2", value="value2")}) WebServlet의 매개변수에 ini..
어떤 객체에 대해서, 자바코드 대신 JSP 액션태그를 이용해서 변수의 값을 set, get 하는 방식. 예를 들어 다음 클래스가 있다고 하자. package com.javac.ex; public class Student_Bean {private String name;private int age;private int grade;private int studentNum;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getGrade() {r..
기존의 Statement클래스를 이용한 SQL문의 실행은 문자열을 합치고 문자열 데이터의 경우 ' '로 감싸주는 등의 번거로움이 많고 실수를 유발하는 경우가 많기 떄문에 이를 보완한 PreparedStatement클래스를 사용한다. connection.createStatement(); 로 Statement객체를 불러오는 대신 connection.prepareStatement("Insert SQL"); 로 PreparedStatement객체를 불러온다. prepareStatement()의 매개값으로는 SQL문을 넣어주면 된다. ex) insert를 사용하려면 PreparedStatement prestm= connection.prepareStatement("insert into member (c1, c2, ..
설명은 Oracle Database 11g Express Edition으로 한다. .java파일(Servlet)에서 Oracle Database를 이용하는 방법을 알아보자. doPost()나 doGet()중에서 사용하는 Method를 선택하여 다음의 코드를 삽입한다. doPost를 기준으로 설명하면 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub request.setCharacterEncoding("EUC-KR");//특정 Database와의 연결 정보를 담는 ObjectConnec..
[포워드(Forward)] 지정한 정보를 가지고 다른 페이지로 이동한다. ex) 다음의 코드로 param1과 param2를 가지고 targetPage.jsp로 이동한다. targetPage.jsp에서는 Sended Param1: Sended Param2: 처럼 parameter로 전달했던 정보를 얻어올 수 있다 을 사용하지 않으면 매개변수 없이도 페이지를 이동할 수 있다. 포워드의 경우에는 서버 내부에서 페이지를 이동하기 때문에, 실제로는 targetPage.jsp로 이동했더라도 클라이언트 측 URL은 변하지 않는다. [리디렉션(Redirection)] 포워드와 마찬가지로 페이지를 이동한다. 단, 이동할 때 매개값을 전달하여 이동하고 싶을 경우에는, URL에 데이터를 실어서 전달한다. URL에 데이터가 ..
어떤 데이터를 서버가 아닌 클라이언트에 서버의 명령에 의해서 저장된 것을 쿠키(Cookie)라고 한다.데이터를 클라이언트의 로컬에 저장하여 보안상 문제가 있기 때문에, 요즘에는 잘 사용하지 않는 기술이다. 데이터가 별로 중요하지 않고, 서버의 자원을 절약해야 할 경우에 사용할 수 있는 기법이다. [Make Cookie] 쿠키 객체를 만들고, 쿠키의 유효 기간을 설정한다. 쿠키의 속성이 모두 정의되면 response객체에 쿠키를 추가한다. [Get Cookies]