전체 글

전체 글

    얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)

    얕은 복사(Shallow Copy)란 주소값을 복사하는 것을 말한다. (스택 영역) 깊은 복사(Deep Copy)란 실제 값을 메모리 공간에 복사하는 것을 말한다. (힙 영역) 1. 얕은 복사(Shallow Copy) 🐝 얕은 복사(Shallow Copy)는 주소값을 복사하는 것이다. 참조값을 복사했기 때문에 위의 그림처럼 같은 인스턴스를 가리키고 있다. 그래서 기존의 값을 바꾸면 복사된 값도 바뀌게 되는 상황이 발생한다. public class User { String name; int age; public User(String name, int age) { super(); this.name = name; this.age = age; } } ---------- public class ShallowCop..

    생성자 주입을 선택하라!

    이전 글을 통해 의존관계를 주입하는 4가지 방법(생성자 주입, 수정자 주입, 필드 주입, 일반 메서드 주입)을 살펴보았다. 이번 글에서는 4가지 방법 중 생성자 주입을 사용해야 하는 이유에 대해서 알아보고자 한다. 3가지 이유(불변, 누락 방지, final 키워드 사용 가능)를 근거로 생성자 주입을 사용해야 하는 이유를 알아보자. (들어가기에 앞서 생성자 주입이란 생성자를 통해서 의존 관계를 주입하는 방법이다.) @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Aut..

    의존관계 주입 방법

    의존관계 주입은 크게 4가지 방법이 있다. 각각의 방법과 특징에 대해서 알아보도록 하자. (들어가기에 앞서 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다는 것에 주의하자.) 1. 생성자 주입 🐪 1. 개념 생성자를 통해서 의존 관계를 주입하는 방법 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolic..

    플로이드-와샬(Floyd-Warshall) 알고리즘

    1. 개념 🐕‍🦺  플로이드-와샬(Floyd-Warshall) 알고리즘이란 모든 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘이다. 다익스트라(Dijkstra) 알고리즘과 다르게 음의 가중치를 허용한다는 게 특징이라고 할 수 있다.  다익스트라 알고리즘을 간단하게 설명하자면 출발 정점으로부터 모든 정점까지의 최단경로를 구하는 알고리즘이다. 다익스트라를 이용하여 플로이드-와샬 알고리즘을 구현한다고 하면 출발 정점을 모든 정점의 개수만큼 설정해 주면 된다.  순차 탐색 방법으로 다익스트라를 구현하면 O(V^2)이고, 모든 정점을 출발 정점으로 한다고 하면 O(V * V^2) = O(V^3)이 되게 된다. 플로이드-와샬 알고리즘의 시간복잡도 또한 O(V^3)으로 같다. 하지만 플로이드-와샬 알..

    최장공통부분수열(Longest Common Subsequence - LCS)

    1. 개념 🐢 최장공통부분수열(Longest Common Subsequence)이란 주어진 수열의 부분 수열에서 가장 긴 것을 의미한다. 위의 그림에서 알 수 있는 것처럼 부분 수열이 연속적일 필요는 없다. 2. 동작방식 🦎 동작 방식은 DP를 이용한다. 문자열 A와 문자열 B가 주어졌다고 하자. 문자열 A와 문자열 B를 한 글자씩 비교한다. 비교하는 문자가 같다면 DP[i][j] = DP[i - 1][j - 1] + 1이 된다. 비교하는 문자가 다르다면 DP[i][j]는 DP[i-1][j]와 DP[i][j-1] 중에 큰 값으로 설정한다. 1번과 2번 과정을 반복한다. 여기서 말하는 DP[i][j]는 문자열 A는 i번째까지 문자열 B는 j번째까지 고려하였을 경우에 얻을 수 있는 최장공통부분수열의 길이이다..

    최장공통문자열(Longest Common Substring - LCS)

    들어가기에 앞서 LCS를 구별하도록 하자. 일반적으로 LCS라고 하면 최장공통부분수열(Longest Common Subsequence)을 뜻하지만, 최장공통 문자열(Longest Common Sustring)도 LCS라고 부르기도 한다. 둘의 차이점은 구하고자 하는 부분 문자열의 연속성이라고 할 수 있다. 이번 글에서는 최장공통 문자열(Longest Common Substring)에 대해서 먼저 알아보자 1. 개념 🦆 최장공통부분문자열(LCS)은 연속된 부분 문자열 중 가장 길이가 긴 문자열을 말한다. 2. 동작 방식 🐓 동작 방식은 DP를 이용한다. 문자열 A와 문자열 B가 주어졌다고 하자. 문자열 A와 문자열 B를 한 글자씩 비교한다. 비교하는 문자가 같다면 DP[i][j]는 DP[i-1][j-1] ..

    최장증가부분수열(Longest Increasing Subsequence - LIS)

    1. 개념 🌠 최장 증가 부분 수열(LIS - Longest Increasing Subsequence)이란 임의의 수열로 만든 부분 수열 중 오름차순으로 정렬된 가장 긴 수열을 의미한다. '3 2 6 4 5 1'이 있다고 하자. 해당 수열의 부분 수열은 {3}, {2}, {6},... {3, 2}, {2, 1},... {2, 6, 4}, {2, 4, 5},... {3, 2, 5, 1},... {2, 6, 4, 5, 1},... {3, 2, 6, 4, 5, 1} 등이 존재한다. 여기서 최장 증가 부분 수열은 {2, 4, 5}이며 그 길이는 3이 되게 된다. 이번 글을 통해 최장 증가 부분 수열의 길이를 구하는 3가지 방법을 알아보자. 순서는 시간복잡도가 큰 것에서부터 작은 것으로 진행된다. 2. 방법 1 ..

    캐시(Cache) - 검증 헤더와 조건부 요청 헤더

    이전 글을 통해 캐시의 기본 개념을 살펴보았다. 응답을 받을 때 '캐시가 유효한 시간 값'을 받았는데 만약 캐시 유효 시간이 초과한 경우에는 어떻게 동작을 해야 할까? 더 나아가서 서버에 다시 요청을 했지만 데이터가 바뀌지 않아서 '캐시에 있는 유효 시간이 지난 데이터'와 같은 데이터라면 굳이 또 다운을 받아와야 할까? 이러한 점을 '검증 해더'와 '조건부 요청 헤더'라는 것을 통해 동작 방식을 이해해 보자. 1. 검증 헤더와 조건부 요청 헤더 🐳 1. 검증 헤더 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터 Last-Modified, ETag를 사용 2. 조건부 요청 헤더 검증 헤더로 받은 조건에 따라 분기가 생기는 헤더 If-Modified-Since인 경우, Last-Modified 사용 If..

    캐시(Cache)

    1. 개념 🐇 캐시(Cache)란 웹 페이지 요소를 저장하기 위한 임시 저장소이다. 이미지, 사진, 오디오와 같은 파일들을 캐시에 저장하고 해당 데이터를 재사용할 수 있다. 캐시를 이용하면 데이터를 전송받기 위해 다시 서버에 요청을 하지 않아도 된다는 장점이 있다. 2. 캐시가 있는 경우 vs 캐시가 없는 경우 🦓 '캐시가 없는 경우'와 '캐시가 있는 경우'를 그림을 통해 비교해 보자. 각각의 상황에서 첫 번째와 두 번째에 같은 요청을 보낸다고 가정하자. 아래의 상황을 충분히 이해한다면 뒤에 나오는 '3. 캐시의 사용법'과 '4. 캐시를 사용했을 때의 이점'을 자연스럽게 이해할 수 있을 것이다. 1. 캐시가 없는 경우 2. 캐시가 있는 경우 3. 캐시의 사용법 🐄 서버가 데이터를 보낼 때 캐시 유효시간(..

    세션(Session)

    Cookie에 이어서 Session에 대해서 살펴보자. 1. 개념 🐶 세션(Session)은 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다. 웹 서버에 저장되는 쿠키라고 할 수 있다. 이를 이용하여 로그인 같이 보안상 중요한 작업을 수행할 때 사용한다. 2. 특징 🐱 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안이 좋다. 사용자가 많아질수록 서버 메모리를 많이 차지한다. 각 클라이언트에게 고유 ID(세션 ID)를 부여한다. 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공한다. 저장 데이터에 제한이 없다. 만료 시점은 클라이언트가 로그아웃하거나, 설정 시간 동안 반응이 없으면 무효화되기 때문에 정확한 시점을 ..

    쿠키(Cookie)

    HTTP 프로토콜 환경은 Connectionless와 Stateless 한 특성을 가진다. 즉, 클라이언트와 서버가 서로 상태를 유지하지 않는 특성이 있다. ( Connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징 Stateless : 통신이 끝나면 상태를 유지하지 않는 특징 ) 이는 로그인과 같이 상태를 유지해야 하는 경우에 문제가 발생한다. 이를 해결하기 위해 Cookie와 Session을 사용한다. 이번 글을 통해 Cookie에 대해서 알아보도록 하자. 1. 개념 👨‍💻 쿠키(Cookie)란 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일이다. 이를 이용하여 사용자 아이디 등의 정보 저장 - 세션관리 사용자에게 적절한 페이지를..

    JVM 메모리 구조

    1. JVM 개념 👨‍🔧 JVM(Java Virtual Machine)이란 '자바를 실행하기 위한 가상의 컴퓨터'라고 할 수 있다. 여기서 말하는 가상의 컴퓨터란 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터 속의 컴퓨터이다. 자바로 작성된 애플리케이션은 모두 JVM에서만 실행되기 때문에 자바 애플리케이션을 실행하기 위해서는 JVM이 반드시 필요하다. JVM은 OS에 종속적이기 때문에 해당 OS에서 실행 가능한 JVM이 필요하다. 이러한 특성으로 인해 자바의 장점 중 하나로 'Write Once, Run AnyWhere.(한 번 작성하면 어디서든 실행된다.)'라는 것이 있다. 2. 3가지 주요 영역 👩‍🔬 JVM은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요 영역인..