Loading [MathJax]/jax/output/CommonHTML/jax.js

1. 요약

디자인 패턴은 소프트웨어를 설계하면서 자주 발생하는 문제들을 해결하기 위한 해결 방법을 일반화하여 정리한 것을 말합니다. 그래서 프로그램을 개발하면서 이미 많은 사람들이 고민했던 고민들을 쉽게 해결할 수 있다는 장점이 있고, 이를 이용하면 빠르게 프로그램을 개발할 수 있다는 장점이 있습니다. 그리고 이미 정리된 패턴을 사용하게 되면 팀원들과 소통이 빠르고 정확하게 이루어진다는 장점이 있습니다. 또 기존에 존재하는 패턴에 자신만의 기능을 추가하여 새로운 패턴을 만드는 것도 가능합니다. 

2. 종류

디자인 패턴으로 가장 유명한 GoF 디자인 패턴이 있습니다. GoF는 (Gang of Fout)으로 Erich Gamma, Richard Helm, Ralph Johnson, John Vissides 라는 사람들이 소프트웨어를 개발하면서 생기는 문제들을 구분하고 체계화하여 정리하였습니다. 이들은 23개의 디자인 패턴을 정리하고 이 23개의 패턴을 크게 3가지로 분류했습니다. 생성(Creational)패턴, 구조(Structural) 패턴, 행위(Behavioral) 패턴입니다.

1) Creational Pattern

생성패턴은 객체를 생성하는데 필요한 패턴들입니다. 객체의 생성을 캡슐화하여 전체적인 프로그램 구조에 영향을 주지 않으면서 확장성을 갖게 만든 패턴입니다. 아래와 같은 패턴이 생성패턴입니다.

팩토리 메서드 패턴(Factory Methods Pattern) / 추상 팩토리 패턴(Abstract Factory Pattern) / 싱글턴 패턴(Singleton Pattern) / 빌더 패턴(Builder Pattern) /  프로토타입 패턴(Prototype Pattern)

2) Structural Pattern

기존의 객체를 확장하거나 여러개의 객체를 이용하여 더 큰 객체나 구조를 형성하는 패턴입니다. 아래와 같은 패턴이 생성패턴에 속합니다.

어댑터 패턴(Adapter Pattern) / 브릿지 패턴(Bridge Pattern) / 컴포지트 패턴(Composite Pattern) / 데코레이터 패턴(Decorator Pattern) / 퍼사드 패턴(Facade Pattern) / 플라이웨이트 패턴(Flyweight Pattern) / 프록시 패턴(Proxy Pattern)

3) Behavioral Pattern

행위패턴은 객체나 클래스에서 행동을 묘사하는 패턴입니다. 하나의 행동이 여러 행동으로 영향을 주던지, 하나의 객체에서 여러 행동을 하는 것과 같은 기능을 하게 됩니다.

책임 연쇄 패턴(Chain of Responsibility Pattern) / 커맨드(Command Pattern) / 인터프리터 패턴(Interpreter Pattern) / 이터레이터 패턴(Iterator Pattern) / 미디에이터 패턴(Mediator Pattern) / 메멘토 패턴(Memento Pattern) / 옵저버 패턴(Observer Pattern) / 스테이트 패턴(State Pattern) / 스트래티지 패턴(Strategy Pattern) / 템플릿메서드 패턴(Template Method Pattern) /  비지터 패턴(Visitor 패턴)

 

1. 정의


행렬식은 n by n 행렬인 정방행렬일 경우 해당 행렬을 하나의 수에 대응시키는 함수입니다. 행렬 M 이 있을때 이를 실수 a로 대응시키는 함수이지요. 정리하면 행렬 A

의 행렬식은 

또는

라고 표현합니다. 행렬식은 n by n 행렬을 기준으로 재귀함수를 이용하여 구할 수 있습니다. 재귀함수는 수학에서 배우는 재귀이거나 컴공에서 배우는 재귀나 같은 의미로 함수 내부에서 함수를 호출하여 초기값을 기준으로 순서대로 값을 구해나가는 과정을 표현한 함수입니다. 행렬식을 재귀적으로 구하기 위해서는 초기값이 필요합니다. 따라서 행렬 A의 n차 정방행렬을 표현하는 기호를 하나 정의하고 다음 이야기를 하도록 하겠습니다. 행렬 A의 n차 정방행렬의 행렬식은

으로 표현할때, 초기값을 

로 표현합니다. 그리고 나머지 n = 1, 2, ...  인 행렬은 재귀적으로 구하게 됩니다. 

1) n = 1 인 경우

n = 1 인 경우는 행렬의 원소가 1개이기 때문에 행렬식은 해당 원소와 대응하게 됩니다. 

2) n = 2 인 경우

n = 2 일때 부터 어느정도 재귀적인 규칙이 보이기 시작하는데요. 일반적으로 대각선 원소끼리 곱해서 빼는 방식으로 표현합니다. 따라서 a와 d를 곱하고 b와 c를 곱하여 뺀 결과가 2 by 2 행렬의 행렬식이 되는 것입니다. 

3) n = 3 인 경우

n = 3 일때는 1행을 기준으로 아래에 있는 원소로 2 by 2 행렬을 만들어 행렬식을 구하여 연산을 하게 됩니다. 이때 1행의 원소인 a, b, c는 순서대로 1, -1, 1 을 곱하게 됩니다. 그리고 1열인 a 원소를 선택했을때 2, 3 열의 원소로 행렬을 만듭니다. 그렇게 되면 3 by 3 행렬의 행렬식은 2 by 2 행렬의 행렬식의 연산으로 표현됩니다. 그리고 위의 2 by 2 행렬의 연산을 풀어쓰면

로 표현할 수 있습니다. 이렇게 재귀적으로 구하는 함수를 일반화하여 코드로 작성하면 쉽게 결과를 찾을 수 있습니다.


2. 활용

행렬식은 다양한 분야에서 활용될 수 있습니다. 가장 많이 사용되는 곳이 역행렬을 구하기 위해서 사용됩니다. 역행렬은 A라는 행렬을 기준으로 해당 행렬에 역행렬을 곱하게 되면 단위행렬이 나오는 행렬입니다. 행렬 A의 역행렬은 

으로 표현하고 행렬 A의 역행을 행렬식을 활용하여 표현하면

으로 표현할 수 있고 이때 행렬식이 0이 된다면 역행렬을 구할 수 없게 됩니다. 따라서 해당 행렬의 역행렬이 존재하는지 확인하기 위해서는 행렬식이 존재하는지 먼저 확인하면 따로 계산을 할 필요가 없이 해당 행렬이 가역행렬인지 확인할 수 있습니다.

또 행렬식은 기하학적으로 활용이 가능합니다. 2차 직교좌표계에서 행렬 A는 2 by 2 행렬입니다. 이때 한개의 열을 하나의 벡터로 생각하면 

다음과 같이 표현할 수 있습니다. 따라서 기존의 x축 y축 기저를 해당 벡터로 변환하는 행렬이 됩니다. 이때의 행렬식은 두 벡터를 이용하여 만든 사각형의 넓이가 됩니다. 3차 공간좌표계에서는 행렬식이 해당 행렬로 변환한 도형의 부피가 됩니다. 4차, 5차도 이와 같은 기하학적 의미가 통용되지만 일반적으로 사람이 생각할 수 있는 수준을 벗어나기 때문에 선형대수정도에서만 사용하는 개념이 됩니다.

휴면계좌에 묶인 돈이 엄청 나다는 뉴스를 자주 접하게 되는데요. 올해 상반기에도 15만건의 휴면예금이 권리자들에게 돌아갔다고 합니다. 이를 금액으로 환산하면 약 726억이라고 하네요. 정말 알게 모르게 숨어있는 돈이 많은 것 같습니다. 휴면계좌라고 하면 은행이나 보험사 등 여러 금융사들에서 만들어진 계좌 중에서 일정기간 동안 거래가 이루어지지 않아서 휴면처리된 계좌입니다. 은행은 예치된 금액에 따라 적게는 1년 많게는 10년 이상 거래가 이루어지지 않으면 휴면계좌가 되고 보험사는 보혐료를 제때 납입하지 못해 효력상실된 보험을 찾아가지 않아 생기게 되는 계좌등이 휴면계좌에 포함됩니다.

이런 예치금들은 서민금융진흥원(서민원)에 출연되어 이자수익으로 금융지원을 하게 되는데요. 이 예치금들은 권리자들이 있기 때문에 임시로 보관하는 역할을 하는 것입니다. 요즘은 이런 예치금들을 인터넷으로 통해서 쉽게 조회하고 돌려받을 수 있습니다. 50만원 이하의 금액은 간단한 본인인증을 통해서 인터넷으로 돌려받을 수 있지만, 50만원이 넘는 금액은 서민금융통합지원센터나 가까운 금융회사 영업점에 신분증을 가지고 방문해야지 돌려받을 수 있습니다. 

대부분 인터넷을 통해서 예치금을 찾게 되는데요. 휴면예금찾아줌 서비스를 이용하면 아주 쉽게 조회와 환급이 가능합니다. https://sleepmoney.kinfa.or.kr/ 

 

서민금융진흥원 휴면예금 찾아줌

서민금융진흥원 출연 휴면 예ㆍ보험금 조회 및 지급신청 등

sleepmoney.kinfa.or.kr

해당 사이트에 들어가게 되면 조회가 가능하게 됩니다. 조회한 금액은 지급을 신청하거나 기부하기 등 다양한 방법이 있는 것 같습니다. 우선 개인 정보를 조회하기 위해 나의 정보 조회를 선택하여 본인 인증을 하여 조회가 가능합니다. 저는 조회 결과 아무런 예치금이 없는 것으로 나타났습니다. 

불행인지 다행인지 모르겠지만 이런 경우에는 더 이상 진행할 수 없습니다. 다른 분들은 그래도 몇 만원정도 돌려받았다고 하네요.

최근 들어 이런 금액을 조회하고 환급 받을 수 있는 서비스들이 많아지고 있는데요. 사실상 주인이 있는 돈이고 언제 어떻게 찾으려고 할지 모르기 때문에 금융사에서는 정말 관리하기 까다로운 예치금들입니다. 따라서 이를 권리자들이 찾아서 내수 경제 활성화를 위해서 사용해주면 나라 경제에 좋은 영향을 줄 수 있겠죠. 이렇게 생긴 돈들은 대부분 치킨이나 한번 시켜먹자 이런 생각으로 소비를 하게 되는 경우가 많고 쉽게 사용하는 분들이 많이 있는데요. 이를 통해서 묶여있던 돈들이 시장에 풀리면서 어느정도 순환의 긍정적인 효과를 만들어내지 않을까 생각합니다. 물론 미미한 영향일 수 있지만요. 아쉽지만 저는 치킨을 시킬 수 없겠군요.

기하학에서 점만큼 중요한 개념이 있는데요. 바로 벡터입니다. 벡터는 수학에서도 사용되지만 물리에서도 사용되는 개념입니다. 아마 물리 수업시간에 수업을 들으신 분들은 기억하고 있으실텐데요. 벡터와 스칼라에 대해서 배웠을 것 입니다. 벡터는 크기와 방향이 있는 성분이고 스칼라는 크기만 있다 라고요. 수학에서도 벡터와 스칼라가 있습니다. 두 학문에서 사용하는 개념은 거의 비슷하다고 볼 수 있습니다. 

일반적으로 n 차원의 벡터는 다음과 같이 생겼습니다.

벡터는 행렬과 비슷한 형태를 하고 있는데요. 실제로 행이 n 개이고 열이 1개인 행렬입니다. 반대로 행렬은 벡터의 모임으로 볼 수 있는데요. 이는 나중에 행렬식을 다루면서 자세하게 이야기하도록 하겠습니다. 오늘은 벡터의 연산에 대해서 알아보도록 하겠습니다. 

1, 벡터의 덧셈 

벡터의 덧셈은 행렬의 덧셈과 마찬가지로 더하고자 하는 벡터의 크기가 같아야 합니다. 즉 원소가 3개인 벡터와 원소가 4개인 벡터는 서로 덧셈이 불가능합니다. 물론 이 벡터를 차원의 개념으로 확장한다면 같은 차원의 원소끼리 덧셈이 가능하겠지만 일반적인 연산을 하기 위해서 원소의 개수가 같아야 합니다. 아래 두 개의 벡터를 더하는 예제를 통해서 덧셈이 어떻게 이루어지는지 알아보도록 하겠습니다.

다음과 같이 두개의 벡터가 있을때 두 벡터의 합은 다음과 같이 연산됩니다.

2. 벡터의 뺄셈

벡터의 뺄셈은 덧셈과 같은 방법으로 + 기호 대신에 - 기호를 사용하면 됩니다. 따라서 위에서 예제로 든 두 벡터를 뺀다면 다음과 같은 결과를 얻을 수 있습니다.

지금까지의 덧셈과 뺄셈은 수학적인 계산에 의한 결과였습니다. 이를 기하학적으로 생각한다면 어떻게 될까요? 위에서 벡터는 방향성분이 있다고 했습니다. 그래서 덧셈은 기존의 벡터에 다른 나머지 벡터를 같은 방향으로 움직는 것이 되고, 뺄셈은 기존의 벡터와 반대 방향으로 움직인다고 생각하면 되는 것입니다. 그래서 실제로 벡터를 -1 만큼 스칼라배를 한 것을 덧셈한 결과와 벡터를 뺄셈한 결과는 갖게 됩니다. 

3. 스칼라배

벡터의 스칼라배는 행렬의 스칼라배와 같이 각 원소에 상수만큼 늘리는 것인데요. 

다음과 같은 벡터가 있다고 가정해봅시다. 이 벡터는 2차원 직교좌표계에서 X축을 표현하는 벡터입니다. 다음 벡터에 2만큼 스칼라배를 하게 되면 다음과 같은 식이 성립합니다.

이 결과를 2차원 직교좌표계에서 생각한다면 기존의 벡터의 길이만큼 2배가 되는 것입니다.


마지막으로 계획에는 없었는데 벡터의 길이에 대한 이야기가 나와서 길이를 구하는 방법에 대해서 이야기해보겠습니다. 벡터의 길이는 원점을 기준으로 벡터의 길이를 계산합니다. 2차원에서 삼각형의 빗변의 길이를 구하는 공식과 같습니다. 정확히 말하면 n 차원에서 두 점으로 생기는 선분의 길이입니다. 이때 한 점은 원점이고 나머지 한 점은 벡터의 끝점이 되는 것이죠. 따라서 공식은 아래와 같습니다.

와 같은 벡터의 길이를 L 이라고 하면

 

컴퓨터를 통해서 기하학을 다루다보면 기초적인 수학개념이 많이 필요하고 이런 개념을 정확히 알고 있어야지 최적화된 알고리즘을 개발할 수 있습니다. 그래서 오늘은 행렬 연산에서 가장 기본적인 덧셈, 뺄셈, 곱셈, 스칼라에 대해서 이야기를 하겠습니다. 우선 행렬은 쉽게 연산을 할 수 있는 것이 아니고, 행렬을 연산하기 위해서는 조건이 필요합니다. 덧셈과 뺄셈을 하기 위해서는 행렬의 행과 열의 수가 일치해야하고, 곱셈을 하기 위해서는 곱하는 행렬의 앞 행렬과 뒤 행렬의 열과 행이 일치해야합니다. 그렇다면 이제부터 자세하게 다뤄보도록 하겠습니다.

1. 덧셈

두 행렬의 덧셈을 하기 위해서는 두 행렬의 열과 행이 서로 같아야합니다. 예를 들어서 2 x 3 행렬과 3 x 2 행렬은 각각 열과 행이 서로 다르기 때문에 덧셈이 불가능합니다. 2 x 3 행렬과 2 x 3 행렬은 덧셈이 가능합니다. 덧셈을 하는 방법은 각 행렬의 같은 위치의 원소들끼리 더하기를 해서 새로운 행렬에 같은 위치의 원소가 됩니다.

예를 들어보겠습니다. 아래 2 by 3 행렬 A와 2 by 3 행렬 B가 있다고 하겠습니다.

이때 행렬 A와 행렬 B를 더한 행렬을 C 라고 하면 다음과 같이 계산됩니다.

따라서 행렬 C는 

가 되는 것을 알 수 있습니다.

2. 뺄셈

뺄셈도 덧셈과 마찬가지로 두 행렬의 크기가 같아야합니다. 그리고 덧셈을 뺄셈으로 바꾸면 되는 것입니다. 이에 대한 예제는 덧셈과 거의 비슷하기 때문에 따로 다루지 않겠습니다. 여기서 한가지 알아둬야하는 것이 있는데요. 행렬의 덧셈과 뺄셈은 교환법칙이 성립합니다. 즉 A + B = B + A 가 성립합니다. 그리고 A + B + C + ...  + Z 를 순서를 아무리 바꿔서 연산을 하여도 결과는 그대로입니다. 

3. 곱셈

행렬의 곱셈의 경우 행렬이 서로 붙는 부분이 있는데요. 이 붙는 부분의 크기가 같을때 곱셈을 할 수 있습니다. 예를 들어 2 by 3 행렬은 각각 아래와 같이 생겼는데요.

만약에 이렇게 생긴 두개의 행렬이 곱셈이 가능할까요? 정답은 불가능합니다. 왜냐면 곱셈은 앞의 행렬의 열과 뒤의 행렬의 행의 수가 같아야 곱셈이 가능합니다. 

곱셈의 결과는 앞의 행렬의 행과 뒤 행열의 열만큼의 크기의 행렬이 됩니다. 위에 행렬이 2 by 3 행렬과 3 by 2 행렬의 곱은 2 by 2 행렬이 됩니다.

곱셈은 다음과 같이 이루어지는데요. 파란선을 기준으로 a, b, c와 A, C, E를 각각 곱해서 더하여 (1,1) 의 원소가 됩니다. 또 노란선을 기준으로 a, b, c와 B, D, F를 각각 곱해서 (1, 2)의 원소가 됩니다. 이런식으로 각 색깔별로 차례로 곱해서 행렬을 완성합니다. 실제 결과는 아래와 같습니다.

4. 스칼라

스칼라는 행렬의 크기와 상관 없이 행렬의 모든 원소에 일정한 상수를 곱하는 것입니다. 이는 각 행렬을 늘리는 것과 같은 의미인데요. 행렬을 n차원의 벡터로 생각한다면 모든 벡터를 늘리는 것과 같은 의미가 됩니다. 

다음과 같은 행렬에 2를 스칼라배 한다면 각각의 원소에 2를 곱해서

가 됩니다.

형렬은 영어로 Matrix라고 부릅니다. 행과 열을 갖고 있는 일정한 단위입니다. 행렬에 대한 종류는 여러가지가 있고 이를 계산하는 방법도 여러가지가 있습니다. 이번 포스팅부터 행렬에 대해서 하나씩 알아보도록 하겠습니다. 우선 행렬의 종류부터 알아보도록 하겠습니다. 행렬의 종류는 행렬의 형태에 따라서 종류가 나뉩니다. 행렬의 종류는 정방행렬, 대각행렬, 삼각행렬, 단위행렬, 영행렬, 전치행렬, 직교행렬이 있습니다. 

1. 정방행렬 (Square Matrix)

정방행렬은 행과 열의 수가 같은 행렬입니다. N by N Matrix로 표현될 수 있습니다. 정방행렬의 경우 행렬방정식의 기본이 되는 행렬이 됩니다. 그래서 차수가 N인 정방행렬은 차수가 N인 행렬입니다. 

2. 대각행렬 (Diagonal Matrix)

대각행렬은 주대각선 원소를 제외한 모든 원소들이 0인 정방행렬을 의미합니다. 여기서 주대각선 원소라고 하면 한 행렬에서 (0,0), (1,1), (2,2), ... , (n,n) 원소를 의미합니다. 행렬에서 대각선 방향에 위치한 원소들입니다. 

3. 삼각행렬 (Triangular Matrix)

삼각행렬은 주대각선 원소를 기준으로 위 또는 아래에 있는 성분이 모두 0인 정방행렬을 삼각행렬이라고 합니다. 여기서 만약에 위의 성분이 모두 0이라고 하면 이를 하삼각행렬(Lower Triangular Matrix)라고 부르고, 아래의 성분이 모두 0이라고 하면 이를 상삼각행렬(Upper Triangular Matrix)라고 부릅니다.  앞으로 삼각행렬을 이용한 다양한 방법들이 다루어질 예정이기에 잘 기억해주야합니다.

4. 항등행렬 (Identity Matrix)

항등행렬은 행렬 곱셈 연산에 항등원으로 작용하는 행렬입니다. 주대각선 성분이 모두 1인 정방행렬로 해당 행렬에 다른 행렬을 곱하면 결과는 곱한 행렬이 그대로 나오게 됩니다. 이를 단위행렬이라고 부르기도 합니다.  

5. 영행렬 (Zero Matrix)

영행렬은 모든 원소가 0인 행렬로 곱셈 연산에서 영원으로 작용하는 행렬입니다. 만약에 어떤 행렬을 영행렬에 곱하면 결과는 영행렬이 나옵니다. 

6. 전치행렬 (Transpose Matrix)

전치행렬은 주대각선 원소를 기준으로 행과 열을 바꿔주는 행렬입니다. 행과 열을 바꾸기 때문에 주대각선 원소는 변하지 않습니다. 전치행렬은 T 로 표현하는데요. 행렬 A의 전치행렬은

$ A ^T $ 

로 표현합니다.

7. 직교행렬 (Orthogonal Matrix)

직교행렬은 행렬 A의 역행렬이 A의 전치행렬이고 A의 전치행렬과 A 행렬을 곱하였을때 항등행렬이 나오는 행렬입니다. 역행렬은 $$A^{-1}$$로 표현하고 이때 다음과 같은 공식이 성립합니다.

A1 = $ A^T$ , ATA=I

 

+ Recent posts