전체 글

전체 글

    뷰(VIEW)

    1. 개념 🐣 뷰(View)는 테이블처럼 취급할 수 있지만 '실체가 존재하지 않는다'라는 의미로 '가상의 테이블'이라고 불린다. 실제 테이블처럼 행과 열을 가지고 있지만, 실제로 데이터를 저장하고 있지는 않는다. 추가적인 설명을 위해 뷰의 생성 방법을 간단하게 먼저 살펴보면 아래와 같다. CREATE VIEW 뷰이름 AS SELECT ~~~ 본래 데이터베이스 객체로 등록할 수 없는 SELECT 명령을 객체로서 이름을 붙여 관리할 수 있도록 한 것이 뷰이다. 따라서 뷰를 참조하면(호출하면) 뷰에 정의된 SELECT 명령이 실행되고 그 결과를 테이블처럼 사용할 수 있다. 그래서 View와 Table의 차이점이라고 한다면, View는 데이터가 없고 SQL만 있는 것이고, Table은 실질적인 데이터가 있는 것..

    함께 자라기 - 애자일로 가는 길

    이번 글에서는 간단한 책의 소개와 기록해 두면 좋을 몇 가지 내용을 적고자 한다. 현재 나의 상태에서 선정한 몇 가지 주제이므로 책에서 나온 다양한 내용들도 꼭 살펴보기를 바란다. 1. 책 소개 🌱 책은 자라기 함께 애자일 이라는 3개의 장으로 구성되어 있다. '1장. 자라기'에서는 학습을 학습하는 방법에 대해서, '2장. 함께'에서는 협력 방법에 대해서, '3장. 애자일'에서는 제목 그대로 애자일에 대해서 알아본다. 책의 내용을 요약하자면 아래와 같다. 함께 자라기 - 애자일로 가는 길 2. 두 가지 실수 문화 🌿 실수 문화는 실수 예방과 실수 관리로 나눌 수 있다. 실수 예방 실수로 가는 경로를 차단하는 것이다. 즉, 실수를 저지르지 말라고 요구하는 것이다. 실수 관리 실수가 나쁜 결과로 되기 전에 ..

    세그먼트 트리(Segment Tree)

    1. 개념 🛫 세그먼트 트리(Segment Tree)란 여러 개의 데이터가 존재할 때 특정 구간의 합을 구하는 데 사용하는 자료구조이다. 트리 종류 중 하나로 이진트리의 형태이며, 특정 구간의 합을 가장 빠르게 구할 수 있다는 장점이 있다. O(log N) 2. 동작방식 🚁 세그먼트 트리를 이용하기 위해서는 우선 '구간 합 트리'를 생성해야 한다. 그리고 '구간 합을 구하는 함수'와 '원소를 수정하는 함수'를 이용하여 구간 합을 구하고 특정 원소를 수정할 수 있다. '1 9 3 8 4 5 5 9 10 3 4 5'라는 12개의 원소를 가진 배열이 주어졌을 때 세그먼트 트리를 이용하여 구간 합을 구해보자. 1. 구간 합 트리 생성하기 '구간'은 원래 데이터 범위를 반씩 분할하는 것으로 설정한다. 최상단 노드..

    클래스와 멤버의 접근 권한을 최소화하라 - [4장. 클래스와 인터페이스(아이템15)]

    이번 글을 통해 '정보 은닉의 장점'과 '클래스와 인터페이스', '멤버(필드, 메서드, 중첩 클래스, 인터페이스)'의 접근 제한자 원칙에 대해서 알아보자. 1. 정보 은닉의 장점 🎸 정보 은닉의 장점은 정말 많은데 그중 대부분은 구현과 API를 분리시켜서 얻는 이점과 연관되어 있다. 정보 은닉의 장점은 아래와 같다. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음, 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최..

    카운팅 정렬 (Counting Sort)

    1. 개념 👑 '계수 정렬'이라고도 불리는 '카운팅 정렬(Counting Sort)'은 각 원소들이 몇 개씩 있는지 나타내는 count배열을 활용하는 정렬 알고리즘이다. 각 원소의 값이 count 배열의 인덱스가 되므로 '정수나 정수로 표현할 수 있는 자료'에 대해서만 적용 가능하다. 2. 동작방식 🎓 동작 방식은 다음과 같다. 원소의 최댓값을 포함할 수 있는 배열 설정 각각의 원소가 몇 번 등장하는지 카운팅 count 배열의 인덱스 = 원소 값 count 배열의 값 = 등장 횟수 count 배열을 누적합으로 만들어주기 정렬되지 않은 배열(초기값)의 뒤에서부터 돌면서, 원소의 값과 동일한 인덱스가 가리키는 곳에 원소 배치해 주기 '0 2 1 1 4 4 4 3 5'가 주어졌을 때 동작방식을 아래의 그림을 ..

    Comparable을 구현할지 고려하라 - [3장. 모든 객체의 공통 메서드(아이템14)]

    이번 글을 통해 Comparable을 어떻게 구현하면 좋을지 알아보고자 한다. 우선은 'compareTo 규약'에 대해서 알아보고 'compareTo를 구현하는 2가지 방법'에 대해서 알아볼 것이다. (만약 Comparable에 대한 기본지식이 필요하다면 이전 글을 참고하기 바란다.) 들어가기에 앞서 Comparable 인터페이스의 유일무이한 메서드인 compareTo의 특징에 대해서 한번 살펴보자. 이는 아래의 2가지만 빼면 Object.equals와 같다. 단순 동치성 비교에 더해서 순서까지 비교할 수 있다. Generic을 지원한다. 1. compareTo 규약 🪔 sgn(표현식) 표기는 수학에서 말하는 부호 함수를 뜻하며, 표현식의 값이 음수, 0, 양수 일 때 -1, 0, 1을 반환하도록 정의했..

    보이어-무어(Boyer-Moore) 알고리즘

    1. 개념 📸 보이어-무어(Boyer-Moore) 알고리즘은 skip이라는 것을 활용한 문자열 매칭 알고리즘이다. 여기서 skip이란 문자열을 비교할 때 불필요한 비교가 있다면 건너뛸 수 있도록 도와주는 것이다. (정확한 명칭은 아니지만 아래의 동작방식을 본다면 왜 skip이라고 불리는지 알 수 있을 것이다.) 보이어-무어 알고리즘은 문자열을 비교할 때 일반적으로 앞부분보다는 뒷부분에서 불일치가 일어날 확률이 높다는 성질을 활용한다. 그래서 비교할 문자열과 패턴을 앞부분부터 확인하는 것이 아닌 뒷부분부터 확인하게 된다. 2. 동작방식 🎬 기본적인 동작방식은 일치하지 않은 문자를 만난 경우 패턴에서 일치하는 문자를 찾아서 이동한 후 비교를 다시 시작한다는 것이다. 본문은 'abphone' 패턴은 'phon..

    라빈-카프(Rabin-Karp) 알고리즘

    1. 개념 ⚽ 라빈-카프(Rabin-Karp) 알고리즘이란 해싱(Hashing)을 이용한 문자열 매칭 알고리즘이다. 비교하고자 하는 문자들과 패턴의 문자들을 일일이 비교하는 대신에 문자열의 해시값을 비교하는 방식으로 진행된다. 2. 동작방식(연습용) 🏀 동작 방식은 아래와 같다. 해시 함수를 설정한다. 해시 함수를 이용하여 패턴의 해시값을 구한다. 비교하고자 하는 문자열의 해시값을 구한다. 일치하면 패턴과 찾은 문자열을 1:1 비교한다. 일치하지 않으면 비교하고자 하는 문자열을 한 칸 뒤로 옮겨서 3번부터 다시 시작한다. 해시값이 같더라도 1:1 매칭을 통해서 최종적으로 패턴과 비교하고자 하는 문자열이 일치하는지 확인하는 절차가 필요하다. 그 이유는 해시값이 같다고 해서 무조건 같은 문자열이라고 보장할 ..

    로깅 (SLF4J, Logback)

    1. 개념 👮‍♂️ 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리가 함께 포함된다. ├─ springmvc │ └─ Dependencies │ └─ org.springframework.boot:spring-boot-starter-thymeleaf │ └─ org.springframework.boot:spring-boot-starter │ └─ org.springframework.boot:spring-boot-starter-logging │ └─ ch.qos.logback:logback-classic │ └─ org.apache.logging.log4j:log4j-toslf4j │ └─ org.slf4j:jul-to-slf4j 기본적으로 SLF4J와 Logback 라이브러리를 사용한다. 간..

    clone 재정의는 주의해서 진행하라(2) - [3장. 모든 객체의 공통 메서드(아이템13)]

    이전 글을 통해 불변 객체에서 clone을 사용하는 방법을 알아보았다. 이번에는 가변 객체에서 clone을 사용하는 방법을 알아보자. 가변 객체를 복제하는 3가지 방법을 살펴보자. 1. 배열 복사를 이용하는 경우 👨‍🚀 public class Stack implements Cloneable{ private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[..

    clone 재정의는 주의해서 진행하라(1) - [3장. 모든 객체의 공통 메서드(아이템13)]

    이번 글에서는 clone을 재정의 할 때 어떤 점을 주의해서 재정의 해야 하는지 알아보고자 한다. clone의 기본적인 사용방법보다는 주의점에 초점이 맞춰져 있으므로 clone의 기본적인 사용방법을 알고 싶다면 이전 글을 참고하기 바란다. clone을 재정의할 때 크게 2가지 상황으로 구분할 수 있다. 첫 번째는 불변 객체에서의 clone이고 두 번째는 가변 객체에서의 clone이다. 먼저 불변 객체에 clone을 재정의할 때 주의점을 살펴보고, 다음 글을 통해 가변 객체에 clone을 재정의할 때 주의점을 살펴보도록 하자. 1. clone 규약 👩‍🌾 clone을 오버라이딩해서 우리가 만든 클래스에 재정의를 할 때 다음과 같은 조건(규약)을 만족하게 만들어야 한다. 아래의 3가지 규약을 기억하고 어떻게..

    clone()

    1. 개념 👷‍♂️ clone() 메서드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다. 2. 사용방법 👩‍⚕️ clone()은 Object 클래스에 다음과 같이 정의되어 있다. public class Object { protected native Object clone() throws CloneNotSupportedException; } 이를 사용하기 위해서는 다음 2가지를 수행하여야 한다. Cloneable 인터페이스를 구현한다. clone()을 오버라이딩하면서 접근 제어자를 protected에서 public으로 변경한다. public class User implements Cloneable { String name; int age; public User(String name, int age..