본문 바로가기

전체 글

(68)
String vs StringBuffer vs StringBuilder ( JAVA ) String vs StringBuffer/StringBuilder 둘의 가장 큰 차이점은 String 은 불변 ( immutable ) 의 속성을 갖는다는 것입니다. 이를 설명하기 위한 좋은 예시로, 위의 그림을 참고하면 좋을 것 같습니다. 즉, String은 불변성을 가지기 때문에, 변하지 않는 문자열을 자주 읽어들이는 경우 String 을 사용하면 좋은 성능을 기대할 수 있지만, 그렇지 않은 경우에는 String을 사용하는 것은 좋은 판단은 아닙니다. 문자열 추가, 수정, 삭제 등의 연산이 많이 일어나는 알고리즘의 경우에는 String을 사용하면 힙 메모리에 많은 임시 Garbage가 생성되어, 힙메모리 부족으로 어플리케이션 성능에 치명적인 영향을 가져다 줄 수 있습니다. 이를 위해, Java에서는 ..
알고리즘 문제 풀 때 자주하는 for문에서의 실수😅 ( JAVA ) 음, 제목 그래도 알고리즘 문제를 풀 때, 가장 많이 하는 실수인 ArrayIndexOutOfBoundsException 예외에 대해서 오늘은 가볍게 정리하고 넘어가려 한다. 알고리즘 문제를 풀 때면, ArrayIndexOutOfBoundsException 이 예외를 정말 많이 만나고는 한다. 요즘 있는 코딩테스트의 경우 디버깅을 하기 어려운 경우가 많기 때문에, ( 특히 프로그래머스에서 할 때 ) 해당 예외가 뜨면 디버깅이 불가하다. 즉, 처음에 풀 때 잘 풀어야 된다는 뜻! 이 에러가 뜨는 것은 사실 대부분 for문을 정확히 이해하고 있지 못해서인 이유가 많을 것으로 생각된다. ( 필자도 그러했다.. ;; ) 정말 간단한 것인데, 너무 기본이라 간과하고 넘어가는 경우가 많은 것 같다. 자, 이 그림 ..
Spring MVC 오늘은 MVC 구조에 대해서 정리하고 넘어가보려 한다! Model 어플리케이션의 데이터이며, 모든 데이터 정보를 가공하여 가지고 있는 컴포넌트이다. 사용자가 이용하려는 모든 데이터를 가지고 있어야하며, View 또는 Controller에 대해 어떤 정보도 알 수 없어야 한다. 변경이 일어나면 처리 방법을 구현해야 한다. View 시각적인 UI 요소를 지칭하는 용어이다. - Model 이 가지고 있는 데이터를 저장하면 안된다. - Model 이나 Controller 에 대한 정보를 알면 안되며 단순히 표시해주는 역할을 가지고 있다. - 변경이 일어나면 처리 방법을 구현해야 한다. Controller Model 과 View 를 연결해주는 역할을 한다. - Model 또는 View 에 대한 정보를 알아야 한다..
교착상태 ( DeadLock ) OS 🌙 교착 상태란 프로세스들의 집합이 더 이상 진행을 못하고 영구적으로 블록되어 있는 상태로 정의된다. 교착 상태는 시스템 자원에 대한 경쟁 도중에 발생할 수도 있고 프로세스 간 통신 도중에 발생할 수도 있다. 집합 내의 한 프로세스가 특정 사건의 발생을 기다리며 대기하고 있고, 이 사건이 집합 내의 다른 블록된 프로세스에 의해 발생될 수 있을 때 이 프로세스의 집합은 교착상태가 된다. 교착 상태가 영구적인 이유는 기다리던 사건이 결코 발생하지 않기 때문이다. 교착 상태는 두 개 이상의 프로세스들이 서로 충돌되는 자원 요구를 할 때 발생한다. 교착상태( DeadLock 조건 ) 상호 배제 ( mutual exclusion ) 조건 한 순간에 한 프로세스만이 자원을 사용할 수 있다. 즉 한 프로세스에 의해 점유..
뮤텍스(Mutex)와 세마포어(Semaphore)의 차이💁‍♂️ 뮤텍스 ( Mutex ) 뮤텍스란 MUTual EXclusion 으로 우리말로 해석할 경우 ' 상호 배제 ' 라는 뜻이다. Critical Section 을 가진 Thread들의 running time 이 서로 겹치지 않게, 각각 단독으로 실행되게 하는 기술이다. 만약 어느 Thread에서 Critical Section을 실행하고 있으면 다른 Thread들은 그 Critical Section에 접근할 수 없고 앞의 Thread가 Critical Section을 벗어나기를 기다려야 한다! - 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것. - 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 Synchronized 또는 lock 을 사용한다. - 뮤텍스 객체를 두 스레드가 동시에 사..
프로세스 vs 스레드💻 프로그램 ( Program ) 어떤 작업을 위해 실행할 수 있는 파일을 의미한다. 프로세스 ( Process ) 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 의미한다. - 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 ( 독립적인 개체 ) - 운영체제로부터 시스템 자원을 할당받는 작업의 단위 - 동적인 개념으로는 실행된 프로그램을 의미한다. 할당 받는 시스템 자원 - CPU 시간 - 운영되기 위해 필요한 주소 공간 - Code, Data, Stack, Heap 의 구조로 되어있는 독립된 메모리 영역 특징 - 프로세스는 각각 독립된 메모리 영역 ( Code, Data, Stack, Heap의 구조) 를 할당받는다. - 기본적으로 프로세스는 최소 1개의 스레드(메인 스레드)를 가지고 있다. - ..
Comparable, Comparator 어떻게 쓰지? JAVA 둘 다 객체를 정렬할 때 사용하는 Interface입니다. 알고리즘 문제를 풀다보면, 자주 접하게 되는 부분이라 한 번 정리를 하고 넘어갈까 합니다😀 Comparable 정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메소드를 정의하는 인터페이스 java.lang.Comparable Java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있으며, 정렬 시에 정의된 대로 정렬이 수행됩니다. public final class Integer extends Number implements Comparable { ... } 구현하기 위해서는 Comparable interface를 implements 한 이후에, compareTo() 메소드를 오버라이드하여 구현합니다. re..
플로이드 와샬 알고리즘 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘과 비교하면 좋은데, 다익스트라 알고리즘의 경우에는 하나의 정점에서 출발했을 때, 다른 모든 정점으로의 최단 경로를 구하는 알고리즘이다. 하지만, 만약 모든 정점에서 모든 정점으로의 최단 경로를 구한다면, 즉, 1 : N 이 아니라 N : N 의 최단 경로를 구할 때는 플로이드 와샬 알고리즘을 쓴다는 것이다. 다익스트라 알고리즘은 가장 적은 비용을 하나씩 선택해야 했다면, 플로이드 와샬 알고리즘은 ' 거쳐가는 정점 ' 을 기준으로 알고리즘을 수행한다. 기본적으로 다이나믹 프로그래밍에 의거한다. 시간 복잡도는 O(V^3)이다. 즉, 특별한 경우가 아닌 이상 쓸일은 잘 없겠다.