전체 글
  • 자바 네이티브 인터페이스(Java Native Interface, JNI) 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 네이티브 메서드 C, C++과 같은 네이티브 프로그래밍 언어로 작성한 메서드를 말한다. 네이티브 메서드의 쓰임 1) 레지스트리와 같은 플랫폼 특화 기능을 말한다. 2) 네이티브 코드로 작성된 기존 라이브러리를 사용한다. 레거시 데이터를 사용하는 레거시 라이브러리가 그 예다. 3) 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다. -> JVM에는 거의 해당되지 않는다. 플랫폼 특화 기능을 활용하려면 네이티브 메서드를 사용해야한다. 하지만 자바가 성숙해가면서 (OS 같은) 하부 플랫폼의 기능들을 점차 흡수하고있다. 그래서 네이티브 메서드를 사..

    Read more
  • 플로이드 워셜 알고리즘 (Floyed-Warshall Algorithm) 플로이드 워셜 알고리즘은 '모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우' 사용하는 알고리즘이다. 단계마다 '거쳐가는 노드'를 기준으로 알고리즘을 수행한다. 하지만 매번 방문하지 않은 노드 중에서 최단 거리를 갖는 노드를 찾을 필요가 없다. 노드의 개수가 N개일때 알고리즘 상으로 N번의 단계를 수행하며, 단계마다 O(N제곱)의 연산을 통해 '현재 노드를 거쳐가는' 모든 경로를 고려한다. 따라서 플로이드 워셜 알고리즘의 시간복잡도는 O(N3제곱)이다. 모든 노드에 대하여 다른 모든 노드로 가는 최단 거리 정보를 담아야하기 때문에 2차원 리스트에 '최단거리' 정보를 저장한다. 플로이드 워셜 알고리즘은 다이나믹 ..

    Read more
  • 리플렉션 리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다. Class 객체가 주어지면 그 클래스의 생성자, 메서드 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있고, 이어서 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있다. 또한 각 인스턴스들을 사용하여 각각에 연결된 실제 생성자, 메서드, 필드를 조작할 수도 있다. 이 인스턴스들을 통해 해당 클래스의 인스턴스를 생성하거나, 메서드를 호출하거나, 필드에 접근할 수 있다. 리플렉션 단점 1) 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다. 리플렉션 기능을 써서 존재하지 않는 혹은 접근할 수 없는 메서드를 호..

    Read more
  • 인터페이스 타입 사용 매개변수 타입으로 클래스가 아니라 인터페이스를 사용해야한다. 또한 적합한 인터페이스만 있다면, 매개변수 뿐만 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 객체의 실체 클래스를 사용해야할 상황은 오직 생성자로 생성할때 뿐이다. 좋은 예. 인터페이스를 타입으로 사용 Set test = new LinkedHashSet(); 나쁜 예. 클래스를 타입으로 사용 LinkedHashSet test = new LinkedHashSet(); 인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 수 있다. 만약 구현 클래스를 교체하고자한다면 그저 새 클래스의 생성자(혹은 다른 정적 팩터리)를 호출해주기만 하면 된다. 구현 클래스 유연하게 변경 Set test =..

    Read more
  • 문자열 연결시 String 대신 StringBuilder을 사용 권장 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 이는 한줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들때는 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n의 제곱에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사하므로 성능 저하를 피할 수 없는 결과다. 문자열 연결을 잘못 사용한 예시 - 느리다 package com.java.effective.item63; public class Main { public static void main(String[] args) { } public Stri..

    Read more
  • 문제 N x M 크기의 얼음 틀이 있다. 구멍이 뚫려있는 부분이 0, 칸막이가 존재하는 부분이 1이다. 구멍이 뚫려있는 부분끼리 상, 하, 좌, 우로 붙어있는 경우 서로 연결되어있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을때 생성되는 총 아이스크림의 개수를 구해라. (예시) 00110 00011 11111 00000 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 총 빨간색 구간 + 파란색 구간 + 초록색 구간으로 총 3개다. 풀이코드 package seohae.chapter5.S01_drinkFreeze; import java.util.Scanner; /* DFS N x M 구멍 0, 칸막이가 존재하는 부분 1 아이스크림의 개수 구하기 상, 하, 좌, 우 (-1, 0) ..

    Read more
  • 문자열을 쓰지않아야할 사례 문자열(String)은 텍스트를 표현하도록 설계되었다. 자바에서 문자열을 의도하지 않은 용도로도 쓰이는 경향이 있는데, 문자열을 쓰지 않아야할 사례에 대해 알아보자. 1) 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 입력받을 데이터가 진짜 문자열일 경우에만 사용해야한다. 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야한다. 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 2) 문자열은 열거타입을 대신하기에 적합하지 않다. 문자열보다는 열거 타입이 월등히 낫다. 3) 문자열을 ..

    Read more
  • 우선순위 큐 (Priority Queue) 우선순위가 가장 높은 데이터를 가장 먼저 삭제한다. 기존의 기본 큐는 가장 먼저 삽입된 데이터를 가장 먼저 삭제하는데 우선순위 큐는 우선순위에 따라 삭제한다. 따라서, 우선순위에 따라 처리하고 싶을때 사용한다. 우선순위 큐는 힙 자료구조로 구현되어있다. 자바에서는 아래 라이브러리로 사용이 가능하다. import java.util.PriorityQueue PriorityQueue pq = new PriorityQueue(); 큐 라이브러리에 데이터를 묶음으로 넣으면, 첫번째 원소를 기준으로 우선순위를 설정한다. 우선순위 큐를 사용하면 내부적으로 최소 힙, 최대 힙을 이용한다. 최소 힙을 사용하는 경우 '값이 낮은 데이터가 먼저 삭제'된다. 최대 힙을 이용하는 경우..

    Read more
  • 들어가기전 기본 다익스트라 알고리즘에 대해 먼저 공부하자. https://devfunny.tistory.com/638 최단 경로 알고리즘 - 다익스트라 알고리즘 기본 버전 최단 경로 알고리즘 (Shortest Path) 가장 짧은 경로를 찾는 알고리즘이다. 1) 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 경우 2) 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 devfunny.tistory.com 개선된 다익스트라 알고리즘 개선된 다익스트라 알고리즘에 알아보자. 위 이전 포스팅의 기본 다익스트라 알고리즘은 시간 복잡도가 O(V제곱) 이였다. 하지만 개선된 다익스트라 알고리즘을 사용하면 O(ElogV)를 보장하여 해결할 수 있다. * O(ElogV) V : 노드의 개수 E : 간선의 개수..

    Read more
  • 기본타입과 박싱된 기본타입 자바이 데이터 타입은 크게 두가지로 나눌 수 있다. 바로 int, double, boolean과 같은 기본 타입과 String, List 같은 참조 타입이다. 각각의 기본 타입에 대응하는 참조 타입이 하나씩 존재하고, 이를 박싱된 기본타입이라고 한다. 기본타입 int, double, boolean 박싱된 기본 타입 Integer, Duble, Boolean 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 둘의 차이는 분명하다. 따라서 상황에 따라 주의해서 선택해야한다. 기본 타입과 박싱 기본타입의 차이 1) 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성이란 속성을 갖는다. 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서..

    Read more
  • 최단 경로 알고리즘 (Shortest Path) 가장 짧은 경로를 찾는 알고리즘이다. 1) 한 지점에서 다른 특정 지점까지의 최단 경로를 구하는 경우 2) 모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우 최단 경로 알고리즘을 사용해야 하는 사례는 위 2가지 외에도 다양하다. 최단 경로 문제는 보통 '그래프'를 이용하여 풀이한다. 각 지점은 그래프에서 '노드'로 표현되고, 지점간 연결된 도로는 그래프에서 '간선'으로 표현된다. 최단 경로 알고리즘에서 꼭 알아야하는 유형은 아래 두가지다. 1) 다익스트라 최단 경로 2) 플로이드 워셜 알고리즘 플로이드 워셜 알고리즘은 다음 포스팅을 참고하자. https://devfunny.tistory.com/648 최단경로 찾기 - 플로이드 워셜 알..

    Read more
  • float와 double 타입의 단점 float 와 double 타입은 과학과 공학 계산용으로 설계되었다. 이는 정확한 결과가 필요할 때는 사용하면 안된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭제곱수 등을 표현할 수 없기 때문이다. 오류 발생하는 코드 package com.java.effective.item60; public class Main { public static void main(String[] args) { double funds = 1.00; int itemBought = 0; for (double price = 0.10; funds >= price; price += 0.10) { funds = funds - price; it..

    Read more
  • 표준 라이브러리 사용 이유 무작위 정수 하나를 생성하는 예제 코드를 보자. package com.java.effective.item59; public class Random { static java.util.Random rnd = new java.util.Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } } 위 코드는 흔하지만 문제가 많은 코드다. 1) n이 크지 않은 2의 제곱수라면 얼마 지나지않아 같은 수열이 반복된다. 2) n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. 3) n 값이 크면 이 현상은 더 두드러진다. 다음 코드는 예시를 위해 특정 범위에서 무작위 수를 백만개 생성한 다음, 그 ..

    Read more
  • 문제 https://leetcode.com/problems/search-insert-position/ Search Insert Position - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이코드 package SITE03_leetcode.easy; /** * https://leetcode.com/problems/search-insert-position/ */ public class E003_leetCode35_SearchInsertPosition { pu..

    Read more
  • CORS 개념

    CORS(Cross Origin Resource Sharing) CORS는 '교차 출처 리소스 공유'라는 이름으로, HTTP 헤더를 사용하여 한 출처(origin)에서 실행중인 웹 어플리케이션이 다른 출처(cross-origin)의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 정책이다. origin (=출처) https://test-a.com:80/member?idx=1 1) protocol : https:// 2) host : test-a.com 3) port : 80 4) path : /member 5) query string : ?idx=1 cross-origin (=다른 출처) - https://test-a.com:80/** - https://test-b.com:80/** ..

    Read more

    CORS 개념

  • Copyright 2024. GRAVITY all rights reserved