본문 바로가기

Programming

(66)
추상 메서드와 추상 클래스 ( abstract ) ◼︎ abstract 키워드 - 추상 메서드와 추상 클래스 추상 메서드( abstract method ) 간단하게 이야기하자면, 선언부는 존재하나 구현부가 없는 메서드를 칭한다. 추상 메서드를 하나라도 갖고 있는 클래스는 반드시 추상 클래스( Abstract Class )로 선언해야 한다. 추상 메서드 없이도 추상 클래스 선언이 가능하다. 다시 한 번 정리하자면, 메서드만 선언된 것으로, 몸체 ' { } '사이에 코드가 없으며, 상속 받는 클래스에게 강제해 메서드를 구현하도록 하는 것이다. 하지만 중요한 사실이있다. 추상 클래스는 인스턴스를 생성할 수 없는 클래스이다. 이처럼 말이다. 그 이유는 클래스가 미완성이기 때문이다. 추상 클래스는 내부적으로 구현되지 않은 클래스이다. 무슨 말이냐. Animal ..
자바와 객체지향 4대 특성 ( 캡슐화, 상속, 추상화, 다형성 ) 객체 지향은 인간 지향이다. 기존 구조적 프로그래밍 언어는 복잡한 문제도 작은 문제로 분할해 하나씩 정복해 가다보면 해결된다는 전략이다. 즉, 구조적 프로그래밍의 "함수"는 코드를 논리적 단위로 구분하고 분할해 정복하는 것이다. 객체 지향의 출발은 '우리가 주변에서 사물을 인지하는 방식대로 프로그래밍'하는 것이다. 0과 1로 대변되는 기계에 맞춰 사고하던 방식을 버리고 현실세계를 인지하는 방식으로 프로그램을 만들기에, 객체 지향은 직관적이다. 객체 지향의 큰 그림은 아래와 같다. 세상에 존재하는 모든 것은 사물. 즉, 객체이다. 각각 사물은 고유하다. 사물은 속성을 갖는다. 사물은 행위를 한다. 사물을 하나하나 이해하기보다 사물을 분류(class)해서 이해하는 것이 인간의 인지법이다. 직립보행을 하며 말..
알고리즘: 재귀함수(6) 예제 - 멱집합 ( powerset ) 멱집합이란? S의 모든 부분집합을 원소로 하는 집합을 S의 멱집합이라 하며, P(A) 혹은 2의 S승으로 나타낸다. 만약 S의 원소 개수가 n개라면, 멱집합의 갯수는 2의 n승이다. 멱집합 예제 어떤 집합의 모든 부분집합의 집합을 멱집합이라고 함 ex ) 원소의 갯수가 n개인 집합의 모든 가능한 부분 갯수의 집합 갯수 : 2의 n승 즉, 2의 n승의 서로 다른 경우의 수가 존재함 그렇다면 크기가 n인 모든 부분 집합의 경우의 수는 어떻게 출력할 수 있을까? 예시 데이터 { a, b, c, d, e, f }의 모든 부분 집합을 나열하려면 a를 제외한 { b, c, d, e, f }의 모든 부분집합들을 나열하고 { b, c, d, e, f }의 모든 부분집합에 { a }를 추가한 집합들을 나열함 고등학교 수..
객체 지향 설계 5원칙, SOLID 원칙 [ ※ 구체적 내용은 스터디 주차에 맞추어 추가할 예정 ] 객체 지향 언어 특성을 요리에 비유해보겠다. 객체 지향 4대 특성인 [ 상속, 캡슐화, 추상화, 다형성 ]이 요리도구라면, 객체 지향 설계 5원칙은 [ 요리 도구 사용법 ]이며, 디자인 패턴은 [ 레시피 ] 이다. 정리하자면 자바의 4가지 특성을 사용한 SOLID 원칙에 기반해 설계된 것이 디자인 패턴이라고 보면 된다. SOLID 원칙 단일 책임 원칙 [ SRP: Single Responsibility Principle ] 클래스 변경 이유는 오직 하나라는 것. 즉, 하나의 클래스는 하나의 책임 [ = 목적 ]만 가지며, 책임[ = 역할 ]을 분리한다는 것임. 개방 폐쇄 원칙 [ OCP: Open Closed Principle ] 엔티티의 확장은..
알고리즘: 재귀함수(5) 예제 N Queens ※ 두 가지 코드 형식을 학습해 업로드한 코드는 다름. 채스의 Queen을 생각하면 됨 말은 어떠한 대각선과 행, 열에서 절대 겹치면 안 됨 상태 공간 트리 찾는 해를 반드시 포함하고 있는 트리 이 트리는 모든 가능한 경우의 수를 놓은 것이기 때문에 반드시 노드에 찾는 해가 존재한다는 것임 즉, 해가 존재한다면 그것은 반드시 이 트리의 어떠한 노드에 해당한다는 것으로 이 트리를 체계적으로 탐색하면 해를 구할 수 있음 하지만 그렇다고 하여 모든 노드를 탐색해야 한다는 것은 아님. 만약 해의 조건을 만족하지 않는다면 해당 노드는 infeasible 하다고 체크하며, 가장 최근에 진행하였던 노드로 돌아가 다른 선택지의 노드를 체크함. 백트래킹 (Backtracking) 수행하다가 수행 방법이 잘못되었음을 확인..
알고리즘: 재귀함수(4) 예제 Counting cells in a Blob Counting cells in a Blob - 입력으로 하나의 Binary 이미지가 주어짐 - 각 픽셀은 Background pixel이거나 image pixel임 - blob : 서로 연결된 image pixel들의 집합을 blob이라고 부름 - 상하좌우, 대각방향으로도 연결된 것으로 간주함 - 색칠된 background pixel을 우리의 기준으로 잡는 것임 - 이미지상 좌표가 주어졌을 때, 그 점이 속해있는 blob의 크기를 계산하는 것임 - 만약 blob에 속하지 않을 때 0을 반환함 입력 N*M 크기의 2차원 그리드(grid)가 주어짐 하나의 좌표는 ( x, y )임 출력 픽셀 ( x, y )가 포함된 blob의 크기를 출력함 ( x, y )가 어떤 blob에도 속하지 않는 경우는 0을 반환함..
알고리즘: 너비 우선 탐색 (Breadth First Search) 너비 우선 탐색(BFS) 알고리즘 기준점에서 가장 인접한 후보부터 탐색 한 길을 깊이 확인하는 깊이 우선 탐색 (DFS)와 비교됨 최단 경로 구하기에 주로 사용됨. 목적지 발견시 바로 종료할 수 있어 DFS에 비해 빠른 경우가 많음 재귀로 시스템 스택을 사용하는 DFS에 비해 queue를 사용해 스택오버플로우 (Stack over flow)에서 비교적 자유롭고, 힙(Heap) 공간을 넓게 사용할 수 있어 넓은 탐색 범위에 유리함 탐색 초기 Queue에 시작 좌표를 넣고 다음 과정 반복 Dequeue 좌표에서 이동 가능한 모든 경로를 Enqueue 함 다시 Dequeue 좌표에서 이동 가능한 모든 경로를 Enqueue함 도착 지점에 도달할 때까지 2 ~ 3과정 반복 - 양쪽으로 번갈아가며 탐색해 나가기에 ..
알고리즘: 재귀함수 (3) 응용: 미로찾기 미로찾기 조건 - 2차원 그리드(Grid)가 주어짐 - 크기: N * N - 입구 좌표: ( 0 , 0 ) - 출구 좌표: ( n-1, n-1 ) - 미로찾기 알고리즘 해결은 다양한 알고리즘이 있음. 재귀함수가 가장 적합하다는 것 같은데..?.. -- 내용 추가 (2021.03.16 23시 35분) - 개인적으로 가장 적합한 것은 아닌 것 같음. 우선 커리큘럼상 먼저 해당 방법으로 진행된 듯한데, 스택에 담아 탐색하는 경우 모든 경우의 수를 끝까지 가서 판별하기에 속도가 느림. - 반면에 BFS의 경우 큐(Queue) 자료구조로 기준점에서 물의 파동이 퍼져나가듯이 탐색함. 즉, 기준에 인접한 것에 먼저 도달하며 탐색해 나감. 그러다보니 다각도(?)로 진행되는데, 먼저 도달한 곳이 존재한다면 그 즉시 프로..