programming

Java - SOLID
Object-Oriented Programming (OOP)를 더 유연하게 하고, 이해하기 쉽게 하기 위한 접근법으로 SOLID라는 객체지향의 설계 원칙이 있는데 본격적으로 SPRING 수업에 들어가기 전에 한번 정리를 해보려 한다. SOLID는 유명한 책인 '클린 코드'의 저자인 Robert C. Martin (Uncle BOB Martin..)이 00년도에 그의 논문 "Design Principles and Design Patterns"에 처음으로 소개된 5가지의 원칙이다. SOLID원칙을 잘 지킨다면 변경이 용이하고 유지보수와 확장이 쉬운 소프트웨어를 개발하는데 도움이 된다고 한다. 어떻게 하면 객체지향을 더 잘 쓸 수 있을까? 하는 관점에 의미를 두고 정리해보자. Single responsibil..
Brute-Force Algorithm
완전 탐색 알고리즘 Brute-Force Algorithm Brute + Force는 근성으로 노가다를 통해 답을 찾는다. 즉, 모든 가능성을 시도해보며 값을 찾는 방법이다. 예를 들면 4 digit 자물쇠가 있다고 할 때 자물쇠로 만들 수 있는 모든 경우의 수를 자물쇠가 풀릴 때까지 무식하게 하나하나 시도해보는 것과 같다. 모든 경우의 수를 다 확인하기 때문에, 시간 복잡도나 공간 복잡도를 신경 쓰지 않고, 최악의 시나리오가 오더라도 컴퓨터 성능에 의존해 '결과만 일단 찾아보자' 할 때 사용할 수 있는 방법을 의미한다. Brute-Force 알고리즘은 크게 다음의 2가지 상황에서 사용한다. 프로세스 속도를 향상 시키고자 하는 데 사용할 수 있는 다른 알고리즘이 존재하지 않는 경우 문제를 해결하는 여러 ..
![[TBC] Search Algorithm](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FNnsVQ%2FbtrDAPVqSB6%2FAAAAAAAAAAAAAAAAAAAAABLJcevBhd3oc2At0DlRb1M-QF7xcbsdGG5sipMNluYt%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DOFnefzncgW2y%252BV0uJeQVpmjw2Ks%253D)
[TBC] Search Algorithm
추가할 것: Hash search / Trie / Heaptree 선형 탐색 Linear Search Algorithm - O(n) 배열의 0번째 인덱스부터, 찾으려는 값과 인덱스의 값을 하나씩 비교 (처음부터 끝까지 하나씩 확인) 값을 찾으면 해당 인덱스를 반환하고, 찾는 값이 없으면 -1을 반환 선형 탐색은 배열의 정렬 여부와 관계없이 시행할 수 있고 다른 탐색 알고리즘에 비해 정말 단순하고 간단한 구조이지만, 배열의 모든 요소를 하나씩 찾기 때문에 시간이 오래 걸려서 그다지 효율적인 편은 아니다. 이진 탐색 Binary Search Algorithm - O(log n) 데이터가 정렬된 상태에서 절반씩 범위를 줄여가며 특정 값을 찾는다 숫자 Up&Down 게임을 생각하면 쉽다. 탐색을 할 때마다 탐색..
Greedy Algorithm
탐욕 알고리즘, 욕심쟁이 알고리즘 등으로도 불리지만 가능하면 영문명인 그리디 알고리즘이라고 하자. Greedy 알고리즘은 위의 '탐욕'이라는 키워드 대로 선택의 순간이 주어질 때마다 당장 눈앞에 보이는 최적의 상황만을 따라가서 최종적인 답에 도달하는 방법을 말한다. Greedy 알고리즘으로 문제를 해결하기 위해서는 대략 3 단계별로 구분할 수 있다. 선택 절차(Selection Procedure) - 현재 상태에서의 최적의 해답을 선택한다 적절성 검사(Feasibility Check) - 선택된 답이 문제의 조건을 충족하는지 검사한다. 해답 검사(Solution Check) - 문제가 해결되었는지 검사하고, 해결되지 않았다면 다시 1번인 선택 절차로 돌아가 과정을 반복한다. 말로만 보면 모든 상황에서 가..

Time Complexity
시간 복잡도 시간 복잡도 (Time Complexity)는 프로그램의 입력값와 연산 수행 시간의 상관관계를 나타내는 척도를 말한다. 수치가 낮으면 낮을수록 더 효율적인 알고리즘을 뜻한다. 일반적으로 알고리즘에서 효율성을 따질때는 프로그램이 돌아가는 하나하나의 단계를 따지는 게 아닌, 시간 복잡도를 사용하게 된다. 하나하나 단계별로 효율성을 결정하기는 매우 어렵기 때문이다. 시간 복잡도는 크게 3가지 표기법으로 나타낼 수 있다. Big-O - 최악의 경우 (해당 알고리즘은 Big-O보다 더 오래 걸릴 수 없다) Big-Ω - 최선의 경우 (해당 알고리즘은 Big-Omega보다 더 빠를 수 없다) Big-θ - 평균의 경우 (Big-O + Big-Omega를 합쳐 표현한 것과 같음) 이 중에서 최악의 상황을..
![[TBC]Java - 자료구조 (Data Structure)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbFO0Qg%2FbtrDEZP08x8%2FAAAAAAAAAAAAAAAAAAAAAEBz4ATcpg--msDZqpxkOVBMmw-wvlJGpiM_k3D1oeVQ%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DklhZJQv787MlaAF7ojYGOnoFMNk%253D)
[TBC]Java - 자료구조 (Data Structure)
추가할 것: Hash Table / Deque / 데이터를 어떤 식으로 정리해서 활용할지를 다양한 방법을 통해 구현할 수 있도록 알고리즘으로 구체화한 것이다. 대부분의 자료구조는 특정 상황에 놓인 문제를 해결하는데에 특화 되어있다. 따라서 많은 자료구조를 알고 있으면, 어떤 상황이 닥쳤을때 해당 상황에 가장 적절한 자료구조를 사용해서 빠르고 정확하고 효율적이게 문제를 해결할 수 있다. Stack 프링글스 통 > LIFO (Last In First Out) - 후입 선출 > 입력과 출력이 하나의 방향으로 진행되는 '제한적 접근' > 데이터를 한번에 하나씩 넣고 뺀다. (한 번에 여러 개 불가) 어떨 때 쓰일까?? 웹 브라우저에서 뒤로 가기 / 앞으로 가기 구현, 응용 프로그램에서 Ctrl + Z 등등.. ..
Java - 재귀
재귀는 함수의 정의 단계에서 다시 자기 자신을 재 참조하는 함수를 말한다. 즉 자신 안에서 자신을 다시 호출. 이게 말로는 쉬운데 막상 코드를 쳐보면?????????? 하는 반응이 나오는데 처음 접하는 입장에서는 정말 당연한 반응이라고 생각한다. 지금의 내가 그렇고 앞으로도 그럴듯하다. 엄밀히 보면 반복문과 비슷하고 실제로 모든 재귀 함수를 반복문으로 표현할 수 있다. 하지만 반복문안의 반복 문안의 반복 문안의 반복문처럼 코드를 작성하면 정말 헷갈릴 수 있어 이런 상황이 온다면 재귀 알고리즘을 이용하는 것이 더 효율적이다. 하지만 마냥 치트키는 아닌데, 피보나치 수열을 보면 가장 대표적인 재귀의 예제라고 볼 수 있지만 실상은 매우 효율이 나쁘다. 중복되는 부분이 반복적으로 일어나면서 스택의 자리를 채우다..

Java - Effective cont.
파일 입출력 (I/O) 바이트 기반 스트림 입출력 단위가 1byte인 바이트 기반 스트림으로 InputStream, OutputStream가 있다. 스트림은 한 번만 그리고 단 방향으로만 데이터를 전송하기 때문에 입출력을 동시에 하려면 스트림을 각각 만들어야 한다. 바이트 기반 입출력 스트림은 대상에 따라 종류가 달라진다. 입력 스트림 출력 스트림 입출력 대상 FileInputStream FileOutputStream 파일 PipedInputStream PipedOutputStream 프로세스 (프로세스 간의 통신) ByteArrayInputStream ByteArrayOutputStream 메모리(byte계열) AudioInputStream AudioOutputStream 오디오장치 입출력을 스트림을 ..

Java - Effective
다음글 Java - Effective cont. 파일 입출력 (I/O) 바이트 기반 스트림 입출력 단위가 1byte인 바이트 기반 스트림으로 InputStream, OutputStream가 있다. 스트림은 한 번만 그리고 단 방향으로만 데이터를 전송하기 때문에 입출력을 동 danc9921.tistory.com Enum Enum은 서로 관련이 있는 상수들의 집합이다. Enum은 열거형, 서로 관련이 있는 것들을 모아서 번호를 매겨놓은 것을 의미한다. enum 열거형이름 {상수명1, 상수명2, 상수명3, ...} 보통 상수명은 대문자로 작성한다. //과일을 열거형으로 작성 enum Fruits { APPLE, STRAWBERRY, ORANGE, GRAPE, WATERMELON } 여기서 { } 안에 있는 열..
Java - Inner Class
내부 클래스 (Inner Class) 내부 클래스는 클래스 안에 선언된 클래스이다. 주로 서로 깊은 관계에 있는 클래스에 사용하며 두 클래스의 멤버 간 쉬운 접근이 가능하고 외부에는 불 필요한 클래스의 노출을 감춰 코드를 간결하게 작성할 수 있다. 즉 객체지향의 '캡슐화'와도 관련이 어느 정도 있는 듯하다 장점을 정리하면 내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능 코드의 복잡함을 줄임 (캡슐화) class A //외부 클래스 { ... class B // 내부 클래스 { ... } static class C //정적 내부 클래스 { ... } void test() { class D //지역 내부 클래스 { ... } } ... } 위와 같은 구조이며 내부 클래스는 외부 클래스를 제외하고는 다..
![[TBC]Java - 컬렉션 프레임워크 (Collections Framework)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F2Y8LF%2FbtrCkfACjyD%2FAAAAAAAAAAAAAAAAAAAAAB3m5LNWBU-J_x13jXBNGqbCUdbF4mxCwbrlw06zwQZa%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DEWAgR%252FIB%252FC%252B6rq9LFzmrIViyI5w%253D)
[TBC]Java - 컬렉션 프레임워크 (Collections Framework)
컬렉션 프레임워크 컬렉션 프레임워크는 많은 양의 데이터와 컬렉션을 다루는데 필요한, 특히 그 유명한 자료 구조를 바탕으로 객체들을 효율적으로 사용할 수 있도록 컬렉션을 만들고 그와 관련된 유용한 클래스와 인터페이스들을 포함하고 있다. 특히, 인터페이스와 다형성을 이용한 OOP적 설계를 토대로 표준화되어 있기 때문에 편리하고 재사용성이 높은 코드를 작성할 수 있도록 많은 도움을 준다. 위의 상속계층에서 붉은색 = 인터페이스, 녹색 = 클래스이다 컬렉션 프레임워크의 주요 인터페이스로 List, Set, Queue 그리고 Map이 있다. 공통적인 데이터를 모아놓은 Collection과 쌍으로 이루어진 데이터(key, value) 집합인 Map이 있는데, 상속 관계도를 보면 알 수 있듯이 List, Set, Q..
Java - 지네릭 (generic)
추가할 것: 지네릭 타입 제한 Generic 지네릭은 왜 필요한가 지네릭 vs 오브젝트 타입 차이점? generic은 굉장히 중요하다. 어떤 타입이 들어올지 미리 정하지 않고 객체를 만들거나 호출 시 어떤 타입으로 할 것인지 설정 지네릭(또는 제네릭, 제네릭스)은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스의 컴파일 단계에서 타입 체크(compile-time type check)를 해주는 기능이다. 인스턴스 별로 다르게 동작하려고 만든 기능이므로 static멤버에 타입 변수 지정 불가 즉 클래스와 메서드에서 쓸 데이터 타입을 나중에 정하는 방식이다. 매개변수와 비슷해 보여 헷갈리지만 매개변수는 값에 연관이 되어있고 generic은 데이터 타입에 포커스 되어있다. 객체의 타입을 런타임이 아닌 컴파..