분류 전체보기

AWS SAA(AWS Certified Solutions Architect - Associate) 취득 후기
📘 1. 시험 난이도 시험 난이도는 타 컴퓨터 관련 자격증과 비교하면서 살펴보는 것이 좋을 거 같다. 1. 정보처리기사 (x3) 확실히 2배보다는 공부량이 많고 5배까지는 아니라서 3배라고 선정하였다. 보기가 헷갈리는 게 확실히 정처기보다 많기 때문에 한 번에 합격하기 위해서는 적어도 정처기 학습량의 3배 이상을 공부해야 한다. 2. SQLD, ADsP,... (x10) 개념과 기출문제의 양 자체가 10배 정도 많다고 생각한다. 📘 2. 공부법 프로젝트를 하면서 EC2, RDS, S3 정도를 사용해 본 경험이 있다. 하지만, 공부를 한 게 아니라 단순히 실행만 시켜본 것이라서 거의 AWS에 대해서 모르는 상태였다. 자격증 취득을 위해 강의와 기출문제를 적극 활용하였다. 1. 강의 강의는 유데미에 있는 S..

[백준 BOJ / JAVA] 두 배열의 합 (2143번)
📘 1. 문제 소개 2143번: 두 배열의 합 첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그 www.acmicpc.net 해당 문제는 이분 탐색과 투 포인터로 풀 수 있다. 📘 2. 이분 탐색을 이용한 풀이 🧵 1. 풀이 간단하게 생각해 보면 다음과 같은 방법을 떠올릴 수 있다. A와 B의 부 배열의 합을 구한다. A의 부 배열의 합을 반복문으로 돌면서, B의 부 배열의 합에서 이분 탐색을 이용하여 T를 만들 수 있는 값을 찾는다. (물론 B의 부 배열의 합을 기준으로 반복문을 돌아..

[백준 BOJ / JAVA] 멀티버스 Ⅱ (18869번)
📘 1. 문제 소개 18869번: 멀티버스 Ⅱ M개의 우주가 있고, 각 우주에는 1부터 N까지 번호가 매겨진 행성이 N개 있다. 행성의 크기를 알고 있을때, 균등한 우주의 쌍이 몇 개인지 구해보려고 한다. 구성이 같은데 순서만 다른 우주의 쌍 www.acmicpc.net 📘 2. 풀이 🧵 1. 좌표 압축 문제의 포인트는 좌표 압축이다. 좌표 압축이란 좌표 값들을 작은 범위의 값으로 압축하는 것이다. 수의 값에 상관없이 수의 대소관계만 알면 될 때 사용할 수 있다. -100, -4, 0, 3, 5000이라는 좌표가 있다고 해보자. 이를 배열처럼 표시한다면 다음과 같다. -100 ... -4 ... 0 ... 3 ... 5000 존재 존재 존재 존재 존재 하지만 압축을 이용하여 대소관계만 파악한다면 다음과 ..

[백준 BOJ / JAVA] 괄호의 값 (2504번)
📘 1. 문제 소개 2504번: 괄호의 값 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X www.acmicpc.net 📘 2. 풀이 해당 문제는 일반적인 스택 문제에 값을 구하는 문제가 더해진 문제다. 괄호를 이용한 일반적인 스택 문제에 대한 설명은 아래 문제를 참고하도록 하자. 9012번: 괄호 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 www.acmicpc.net ..

지역변수의 범위를 최소화하라 - [8장. 일반적인 프로그래밍 원칙(아이템57)]
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 이번 글을 통해 지역변수의 범위를 최소하하는 방법을 알아보자. 📙 1. 지역변수를 가장 처음 쓰일 때 선언하라. 지역변수의 범위를 줄이는 가장 강력한 기법은 지역변수를 가장 처음 쓰일 때 선언하는 것이다. 선언을 미리 해두면 코드가 어수선해져 가독성이 떨어진다. 📙 2. 지역변수는 선언과 동시에 초기화하라. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch 문의 경우 변수 값을 try 블록 바깥에서도 사용해야 할 수도 있으므로 예외다. 📙 3. 반복문을 사용하라. 반복문은 독특한 방식으로 변수 범위를 최소화해준다. 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하..

공개된 API요소에는 항상 문서화 주석을 작성하라 - [8장. 메서드(아이템56)]
📙 1. 문서화 주석 작성 방법 자바에는 소스코드 파일에서 문서화 주석(doc comment; 자바독 주석)이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환하여 보여주는 자바독이 있다. 문서화 주석을 작성하는 규칙은 '문서화 주석 작성법(How to Write Doc Comments)'에 기술되어 있다. 해당 문서에 더해서 추가적으로 알아야 하는 내용은 아래와 같다. API를 올바로 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 직렬화할 수 있는 클래스라면 직렬화 형태에 관해서도 적어야 한다. 기본 생성자에는 문서화 주석을 달 방법이 없으니 공개 클래스는 절대 기본 생성자를 사용하면 안 된다. 유지보수까지 고려한다면 대다수의 공개되지 않은 클래..

옵셔널 반환은 신중히 하라 - [8장. 메서드(아이템55)]
📙 1. 옵셔널 개념 Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 보통은 T를 반환해야 하지만 특정 조건에서는 아무것도 반환하지 않아야 할 때 T 대신 Optional를 반환하도록 선언하면 된다. 옵셔널을 반환하는 메서드는 예외를 던지는 메서드보다 유연하고 사용하기 쉬우며, null을 반환하는 메서드보다 오류 가능성이 작다. 컬렉션의 최댓값을 구하는 메서드를 다음과 같이 Optional로 표현할 수 있다. // Optional을 사용하지 않은 경우 public static E max(Collection c) { if(c.isEmpty()) throw new IllegalArgumentException("빈 컬렉션"); E result = null; ..

null이 아닌, 빈 컬렉션이나 배열을 반환하라 - [8장. 메서드(아이템54)]
📙 1. null을 반환하는 경우 매장 안의 치즈 목록을 반환하는 메서드를 살펴보자. private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeses() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } 컬렉션이나 배열 같은 컨테이너(container)가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 아래와 같은 방어 코드를 넣어줘야 한다. List cheeses = shop.getCheese(); if(cheeses != null && chee..

가변인수는 신중히 사용하라 - [8장. 메서드(아이템53)]
📙 1. 가변인수 인수 개수가 일정하지 않은 메서드를 정의할 때 가변인수(varargs)를 사용할 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드를 건네준다. 입력받은 int 인수들의 합을 계산해 주는 가변인수 메서드를 다음과 같이 만들 수 있다. static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } 📙 2. 가변인수의 문제점과 그에 따른 해결책 가변인수를 아래와 같이 잘못 구현할 수도 있다. static int min(int... args) { if(args.length == 0) throw new Illega..

다중정의는 신중히 사용하라 - [8장. 메서드(아이템52)]
📙 1. 다중정의의 문제 컬렉션을 '집합, 리스트, 그 외'로 구분하는 프로그램이 있다고 하자. public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List s) { return "집합"; } public static String classify(Collection s) { return "집합"; } public static void main(String[] args) { Collection [] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Coll..

메서드 시그니처를 신중히 설계하라 - [8장. 메서드(아이템51)]
이번 글을 통해 API 설계 요령들을 살펴보자. 이를 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있을 것이다. 📙 1. 메서드 이름을 신중히 짓자. 메서드 이름을 신중히 짓는 것에 대해서는 너무나 많이 들어봤을 것이다. 알고 있는 것을 한번 더 상기시킨다는 생각으로 보고 넘어가자. 항상 표준 명명 규칙을 따라야 한다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓자. 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 긴 이름을 피하자. 애매하면 자바 라이브러리의 API 가이드를 참조하자. 📙 2. 편의 메서드를 너무 많이 만들지 말자. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 인터페이스도 마찬가지..

적시에 방어적 복사본을 만들라 - [8장. 메서드(아이템50)]
자바는 일반적으로 안전한 언어다. 하지만 아무리 자바라 해도 다른 클래스로부터의 침범을 아무런 노력 없이 다 막을 수 있는 것은 아니다. 그렇기 때문에 클라이언트가 우리의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. 📙 1. 첫 번째 공격 - 생성자 이용 '시작 시각이 종료 시각보다 늦을 수 없다는 불변식'이 있는 다음과 같은 클래스가 있다고 하자. public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 하낟. * @throws IllegalArgumentException 시작 시각이 종..