분류 전체보기
-
큐와 스택은 무엇인가Programming/python 2019. 11. 3. 17:40
큐와 스택은 컴퓨터 과학에서 다루는 여러 가지 자료 구조 중에서도 가장 기본적인 것이다. 두 자료 구조는 '자료를 넣는 동작'과 '자료를 빼는 동작'을 할 수 있으며, 들어간 자료가 일렬로 보관된다는 공통점이 있다. 하지만 자료를 넣고 뺄 때 동작하는 방식이 서로 다르다. 큐(Queue) 큐는 '줄 서기'에 비유할 수 있다. 택시를 타기 위해서 줄을 서는 과정을 생각해보면 쉽다. 새로 택시 정류장에 도착한 사람은 맨 뒤로 가서 줄을 서고, 택시가 도착하면 그 줄의 맨 앞에 선 사람이 줄을 빠져나가 택시에 탄다. 가장 먼저 줄을 선 사람이 가장 먼저 택시를 타게 된다. 즉 FIFO ( First In First Out ) 선입선출 이라고 불리며, 프로세스 처리, CPU 관리에서 많이 사용된다. 큐에 자료를..
-
추상클래스와 인터페이스의 공통점과 차이점Programming/java 2019. 11. 3. 02:20
추상클래스와 인터페이스를 알아보기 앞서 인터페이스와 추상클래스가 언제, 그리고 왜 쓰이는지 그 목적성에 대해서 분명히 알고 개념을 익힌다면 더욱 공통점과 차이점을 명확하게 할 수 있을 것이다. 추상 클래스 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)들 포함하고 있다는 의미이다. 추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 즉 상속을 강제하기 위한 추상메서드를 하나 이상 가진 클래스를 말한다. 추상클래스는 다음과 같은 특징을 가지고 있다. 공통 구현을 상위 클래스에 뽑아내려고 사용 자신의 생성자로 객체 생성 불가능 하위 클래스를 참조하여 상위 클래스의 객체를 생성 하위 클래스를 제어하기 위해 사..
-
오버로딩과 오버라이딩의 차이점Programming/java 2019. 10. 28. 19:45
지난 포스팅의 객체지향 프로그래밍에서 다형성을 설명할 때, 하나의 클래스 내부에 같은 이름의 기능을 여러 개 정의하거나 상위 클래스의 기능을 하위 클래스에서 다시 정의하는 것, 즉 오버라이딩과 오버로딩에 대해서 간략하게 짚고 넘어갔었다면 이번에는 오버라이딩과 오버로딩이 구체적으로 어떻게 사용되는지. 또, 어떤 차이점을 가지고 있는지에 대해서 알아보자. 우선 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 말한다. 예를들면 키보드나 스마트폰을 예를 들어보자면 키보드는 같은 버튼의 동작 방법을 가지고 있더라도 ESC는 취소, Enter는 실행의 목적을 가지고 있고 스마트폰의 키패드 또한 문자나 게임 등의 모양은 같지만 다른 기능들을 수행하는 것들을 말한다. 자바에서는 주로..
-
MVC? 싱글톤? 여러가지 디자인 패턴들Programming 2019. 10. 28. 02:58
디자인 패턴의 개요 여러 사람이 협업을 하며 프로그램을 개발 할 때 다른 사람이 작성한 코드나 기존의 코드를 이해하는 것은 어렵다. 이런 코드들은 유지 보수를 함에 있어서 새로운 기능을 추가하거나 최적화를 하기에 힘든 구조적인 결함을 가지고 있다. 이를 최소화하기 위해서 디자인 패턴은 등장했다. 특수한 경우의 프로그래머가 아니라면 프로그래밍을 하면서 만나는 문제가 지구상에서 유일한 문제일 경우는 거의 없기 때문에 앞서 이미 많은 수많은 오류들을 피하는 방법을 패턴화하게 된다면 좀더 버그가 발생하는 폭을 줄이고 수정하는데(발생하는 숫자가 아니라 예외를 찾는데 조금더 덜 시간을 사용하게 됨) 최소한의 시간을 들일 수 있게 된다. 즉 디자인 패턴은 프로그램 등을 개발하는 중에 발생했던 문제점들을 정리 및 특정..
-
[python]버블 정렬Programming/python 2019. 10. 20. 00:17
버블 정렬(Bubble sort)이란? 버블 정렬이란, 두 인접한 원소를 검사하여 정렬하는 방법이다. 거품 정렬이라고도 불리며 원소의 이동하는 모습이 거품이 수면으로 올라오는 듯한 것처럼 보이기 때문에 지어진 이름이다. 버블정렬의 특징 장점 구현이 간단하다. 단점 하나의 요소가 가장 왼쪽에서 가장 오른쪽으로 이동하려면 배열의 모든 다른 요소들과 교환해야하는 필요 이상의 교환이 생긴다 시간 복잡도 시간 복잡도가 O(n²)로 상당히 느린편이지만 코드가 단순하기 때문에 자주 사용된다. 코드 #버블 정렬 #리스트 a를 버블 정렬로 정렬함 def bubble_sort(a): n = len(a) for i in range(0,n-1): for j in range(n-1): if a[j] > a[j+1]: a[j],..
-
[python]퀵 정렬Programming/python 2019. 10. 18. 22:46
퀵 정렬(Quick Sort)이란? 퀵 정렬은 기준(Pivot)을 먼저 정하고 그 기준으로 두 개의 비균등한 크기로 분할하고 분할된 부분 리스트들을 기준과 비교해 정렬한 다음 정렬된 부분을 합하는 방법. 그룹을 둘로 나누어서 재귀 호출한다는 방식은 병합 정렬과 비슷하지만 그룹을 나눌 때 미리 기준과 비교해서 나눈다는 점이 다르다. 분할단계(divide): 입력 배열을 피벗을 기준으로 비균등하게 2개의 부분 배열(피벗을 중심으로 왼쪽은 피벗보다 작은 요소들을 배치하고, 오른쪽은 피벗보다 큰 요소를 배치)로 분할한다. 정복단계(Conquer): 부분 배열을 정렬한다. 배열 크기가 충분히 작지 않다면 재귀 호출을 이용해서 다시 분할 정복 방법 적용(재귀는 리스트가 1이하가 될 때까지 반복된다) 결합단계(Com..
-
[python]합병 정렬Programming/python 2019. 10. 18. 01:52
합병정렬(Merge sort)이란? 합병정렬 또는 병합정렬이라고도 부르며, 먼저 절반으로 분할하고 합치면서 정렬하는 방법. 존 폰 노이만이 제안한 방법이며, 분할 정복 알고리즘의 하나이다. 리스트 길이가 1이하이면 이미 정렬된 것으로 본고 그렇지 않은 경우에는 분할단계(divide): 정렬되지 않은 리스트를 타노스 손가락 튕기듯이 절반을 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 마블 MCU로 생각하면 인피니트 워 단계 정복단계(conquer): 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 결합단계(combine): 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 마블 MCU로 치면 앤드 게임에 해당한다. 오른쪽과 같이 [6,5,3,1,8,7,2,4]라는 정렬되지 않은 배열이 ..
-
관점 지향 프로그래밍 AOPProgramming 2019. 10. 17. 19:30
지난 포스팅에서 프로그래밍 패러다임인 객체 지향와 절차형 프로그래밍에 대해서 알아보았다. 그런데 스프링을 공부하다보면 튀어나오는 AOP, 즉 관점 지향 프로그래밍이라는 개념. 객체 지향을 알고있으니 뭔가 프로그래밍 패러다임이라는 것은 알고 있는데 정확히 관점 지향 프로그래밍은 명령형인지 선언형인지 그리고 무엇인지 도통 알 수가 없다. AOP의 개요 프로그래밍 언어에서 절차적은 프로시저를 통해, 그리고 OOP는 클래스를 통해서 분리된 관심과 개념들을 통해 모듈로 분해했다. 앞선 포스팅에서 OOP를 현대에 들어 수 많이 늘어나고 복잡해진 상호작용들과 대응하기 위해서 등장한 개념이라고 설명했다. 하지만 OOP를 적용한다고 할지라도 충분히 분리해 낼 수 없는 부분이 있다는 문제 제기에서 부터 AOP의 개념이 들..