728x90

프로그래밍 410

Effective Java 3/E - 4장 클래스와 인터페이스 - 3

23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스의 단점 열거 타입 선언, 태그 필드, switch 문 등의 관련 코드가 필요 필드들을 final로 선언하는 경우, 쓰이지 않는 필드까지 생성자에서 초기화 인스턴스의 타입만으로는 현재 의미 파악 불가 의미 없는 코드로 가독성이 떨어지면서 필요 없는 코드 작성 과정에서 오류 발생 가능성과 비효율적인 작업이 급격하게 증가하게 된다. 이러한 문제를 해결하기 위해서는 서브타이핑(Subtyping)을 사용하는 것이 좋다. 태그 달린 클래스의 예시 public class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; // 관련 필드가 한 곳에다 모여 있다. double lengt..

Effective Java 3/E - 4장 클래스와 인터페이스 - 2

18. 상속보다는 컴포지션을 사용하라 상속은 코드 재사용의 강력한 수단이지만, 잘못된 사용은 오히려 오류를 유발한다. 다른 패키지의 구체 클래스를 확장하여 사용하는 상속은 위험한 행위가 된다. 상속은 캡슐화를 깨뜨린다. 상위 클래스의 구현에 따라서, 하위 클래스 동작에 이상이 발생할 수 있다. 상위 클래스는 릴리즈마다 내부 구현이 변경될 수 있는데, 이를 확장한 하위 클래스에서는 어떠한 변경 사항 없이도 동작에 문제가 발생할 수 있다. HashSet을 상속하여 사용하는 구조 예시 public class InstrumentedHashSet extends HashSet { public int addCount = 0; public InstrumentedHashSet() {} public Instrumented..

Effective Java 3/E - 3장 모든 객체의 공통 메서드

Object는 객체를 만들 수 있는 구체 클래스로, 상속하여 사용하는 것을 기본으로 하고 있다. Object의 final이 아닌 메서드들은 모두 재정의를 염두에 두고 설계되어 있어 이에 맞게 재정의해야 한다. 10. equals는 일반 규약을 지켜 재정의하라 equals를 잘못 재정의하면 문제를 발생시키므로, 대응하기 위한 방법 중 가장 쉬운 것은 하지 않는 것이다. 다음 케이스에 대해서는 재정의하지 않는 것이 좋다. 재정의하지 않아도 되는 경우 각 인스턴스가 본질적으로 고유한 경우 Thread 클래스 같은, 어떤 행위를 하는 클래스들이 이에 해당한다. 인스턴스의 논리적 동치성을 검사할 필요가 없는 경우 java.util.regex.Pattern은 두 인스턴스가 같은 regex인지 확인하도록 재정의했다...

JAVA에서 람다식(Lambda Expression)에 대해 정리해보기

람다식? 람다식 또는 람다 표현식(Lambda Expression)은 프로그래밍에서 흔히 사용되는 개념으로 익명 함수 등으로 불리기도 한다. 많은 프로그래밍 언어에서 람다식을 볼 수 있으며 Java에서는 이 람다 표현식을 Java8부터 추가되어 활용할 수 있다. 특징 기본 형태 (int param1, String param2) -> { DoSomething...} // 기본 (Parameter, ...) -> { DoSomething... } // 타입이 동일한 경우 () -> { DoSomething... } // 매개변수가 없는 경우 (Parameter, ...) -> DoSomething // 단일 실행문인 경우 (Parameter, ...) -> { return some; } // 단일 실행문이 ..

자바(Java)와 메모리(Static, Stack, Heap)에 대한 정리

코드를 조금 더 실용적으로 작성하기 위해선 JVM의 메모리 영역들에 대한 이해가 필요하다. 모든 것을 다 Heap이나 Stack에 밀어 넣고 인스턴스 생성과 Thread Safe에 대해 고려하지 않는 등의 행위는 적절하지 않기 때문이다. 메모리 영역에 대한 이해와 그를 바탕으로 한 코드 설계는 개발자가 더 나은 코드를, 그로 인해 더 나은 개발자가 되기 위해서는 필수적이다. 세부적으로 따지면 코드 영역 같은 것도 있고 하지만, 크게 이렇게 다루고 신경써줘야 하는 부분은 static, stack, heap이다. 각 영역마다 특징적인 것들이 있고, 그렇다 보니 그 특징들을 고려해서 코드를 작성해야 인스턴스의 불필요한 생성을 방지하고, Thread Safe를 보장할 수 있으니 잘 짚고 넘어가는 것이 필요하다...

Redirect와 Forward에 대한 간단 비교

모든 내용을 언급하기 앞서 둘의 가장 큰 차이를 딱 하나로 말하라고 하면, 사용자에게(웹 브라우저에서) URL이 변경되어 보이는지 여부일 것이다. Forward Web Container에서의 페이지 이동만 진행되므로 웹 브라우저에는 해당 내용이 노출되지 않는다. 웹 브라우저에는 최초 호출 URL만 남아 있고, forward 과정에서 거쳐가는 URL은 노출되지 않으며, forward를 통해서 Request 객체와 Response 객체가 공유된다. 이러한 특성 때문에, 경우에 따라서 forward를 쓰면 문제가 발생할 수 있다. 예를 들어, 유저가 글쓰기나 삭제, 수정 과 같은 변경 작업을 요청으로 보냈고 그에 대해 응답을 할 수 있도록 forward로 응답 페이지를 불러온다고 가정하자. 이 과정에서 어떤 ..

BOJ] 14716 - 현수막(충남대학교, 생각하는 프로그래밍 대회 A번)

제한사항 2초, 512MB 입력 첫 번째 줄에는 현수막의 크기인 M와 N가 주어진다. (1 ≤ M, N ≤ 250) 두 번째 줄부터 M+1 번째 줄까지 현수막의 정보가 1과 0으로 주어지며, 1과 0을 제외한 입력은 주어지지 않는다. 출력 혁진이의 생각대로 프로그램을 구현했을 때, 현수막에서 글자의 개수가 몇 개인지 출력하여라. 풀이 방법 BFS, DFS 구분하지 않고 뭘 하든 될 줄 알았는데 BFS를 사용하니까 메모리 초과가 발생했다. 그래서 방향을 틀어 DFS를 사용해서 문제를 해결했다. 사실 BFS로 문제를 해결할 때, 이미 Queue 안에 들어간 내용을 따로 체크해줬으면 메모리 초과가 발생하지 않았을 것 같다. 소스코드 #include #include using namespace std; vect..

판다스(Pandas) shift를 활용해서 Sliding Window 만들기

시계열 데이터를 활용해서 수치를 예측하는 모델을 만들 때 사용하는 다양한 방법 중에 Sliding Window를 활용해 과거 데이터를 feature로 사용하는 방법이 있다. 이 방법은 시계열 데이터를 활용한 예측에서 과거 데이터들을 바탕으로 예측을 수행하므로 과거 데이터들을 포함하는 feature를 만들어줘야 한다. 이렇게 feature로 사용할 과거 기간에 대해서 lookBack, lag, delay 등 다양한 명칭으로 부르는데, 통상적으로 lag이라는 명칭을 많이 사용하는 것 같다. 예시 코드에서는 lookBack으로 작성했다. 다양한 방법으로 lag을 줘서 Sliding Window를 만들 수 있지만, 손수 Sliding Window와 lag 개념을 넣으려면 거기에 맞게 행을 추가해줘야 하고, 데이..

백준] 11008 - 복붙의 달인(ACM-ICPC Regionals)

시간 제한 : 2초 메모리 제한 : 256MB 문제 한신이는 대학교에서 "복붙의 달인"으로 유명하다. 한신이는 타이핑 속도가 느리기 때문에 대학에서 가능한 모든 일을 복붙으로 해결한다. 그는 n개의 문자를 입력하는데 있어서 n초의 시간이 걸리지만 뛰어난 "붙여넣기" 스킬을 이용하면 어떠한 개수의 문자도 단 1초만에 타이핑 할 수 있다. 만약 한신이가 "bana"를 복사한 상태에서 "banana"를 타이핑한다면, "bana" 붙여넣기 1초, 'n' 입력, 'a' 입력으로 총 3초가 걸린다. 한신이가 클립보드에 저장한 p를 알고 있을 때 s를 입력하는데 걸리는 최소 시간을 계산해보자! 입력 첫 번째 줄에는 테스트케이스의 개수 T(T ≤ 25)가 입력된다. 각 테스트케이스는 한 줄에 2개의 문자열 s와 p가 ..