[0925] OOP Concept 구체적으로 설명 :: Python 상속 기초

2019. 9. 25. 01:28

 

오늘은 컨셉들을 구체적으로 배워보았다. 

우선, 우리는 추상화를 어떻게 시킬건지에 대한 관건에 따라 OOP의 설계가 달려있음을 알아야 한다.

[목차]

1. Class (클래스)

2. inheritance (상속)

3. incapsulation (인캡슐레이션)

4. polymphism (다형성)

 

저번시간에 여러 개념들을 하나로 모아서 어떤 뭉퉁그린 개념으로 만드는 것이 추상화를 하는 것이라고 배웠다. 

그렇다면 모으는 것만이 단순히 추상화인가? 예를 들어, 어떤 동물의 특징과 행동과 같이 두 가지씩, 같은 '동물'이라는 하나의 추사화라도 그 안에서 또 한가지 이상으로 추상화 할 수 있다. 누구나 다르게 정의할 수 있다는 것은 그 자체가 절대적인 개념이 아니라는 것을 알 수 있다.

 

이러한 과정에서 만들어지는 것, 이것들이 function, member function, method 가 될 수 있다.

이와 관련된 자세한 내용은 차차 알아보자.

 

2. Class

건설에서 건축물 등을 지을 때 겉구조와 속구조를 모두 투시하여 그려놓은 설계도를 청사진이라고 하는데, 이것은 한마디로 구체화된 상세 사양을 나타낸 것이다. 그러므로 이것을 바탕으로 집을 누구나 지을 수 있게 된다. 이것과 비슷한 개념으로 프로그래밍 분야에서는 클래스라고 표현한다. Class를 구체화 시켜놓으면 여러 가지 언어로 구현을 할 수 있다. 아까 말한 청사진의 도면처럼 클래스 설계의 표준이 되는 것 UML이라는 것인데, 이것 역시 뒤에서 다시 다루겠다. 

 

또한 클래스는 모듈화의 특징을 가지고 있다.

잘 모듈화 할수록 유지보수도 쉽고 다루기 편리하다. 또한 이것은 여러 가지 오브젝트로 표현할 수 있으며, 이러한 모듈화가 잘 되어 있을수록 소통하며 분업을 효과적으로 할 수 있고 고치기도 쉽다. Class의 큰 개념은 묶는다, 라는 것이지만 다르게 말하면 다른 것과 경계가 생기기 때문에 분리할 수도 있다는 뜻이 된다.

 

2. inheritance

리얼 월드에 존재하는 것을 추상화하여 사용하여야 하는 우리, 그리고 우리 세상의 대부분은 계층화가 가능한 것들이 많다. 바로 이렇게 계층까지 포함해서 디자인하는 것이 '상속'이다. 일종의 추상화의 연속이라고도 볼 수 있으며, 상위에 있는 것은 하위에 있는 것보다 더 추상화된 것이다. 즉, 밑으로 갈수록 더 구체화 시켜지는 구조가 보인다.

 

상속의 타입에도 여러 가지가 있는데, 용어를 잘 보아야 한다. 시험에서도 많이 나온다고 한다. 그림과 함께 참고하여 용어는 꼭 숙지하고 가도록 하자.

 

위의 그림들을 간단히 설명하자면 아래와 같다.

 

Single: 하나를 받는 것 일반적인 것

Multiple 하위에 있는 것을 구현할 때 두 개의 상위 클래스를 받는 것

Multilevel: 여러개의 레벨이 있는 것 아무리 깊어도 어떠한 경우던지 멀티 레벨이 된다.

Hierachical: 여러개를 묶어서 하나를 만든 것 그러나 특히 쓸 일이 없다고 한다.

Hybird: 여러개를 묶어서 하나를 형성하는 것, 여러개의 다른 개념이 같이 얽혀있다.

 

개념상으로 나오는 용어들이다. 하지만 사실 자주 쓰이는 것은 위에서부터 3가지밖에 없다.

 

아까 말했던 UML에 대해 다시 말해보자.

예를들어, A라는 상위 클래스에 의존을 하고 있다. 우리가 알고 있던 화살표와는 반대로 표시하는 것, 즉 화살표를 그릴 때에는 의존성이 있는 쪽으로 그린다는 것을 유념해 두고 있어야 한다. 또 다른 예를 들어, 상속은 BA를 가리키고 있으면 A로부터 B를 상속받은 것이다라는 뜻이다. 의존성이 어디에 있는지를 표현해주는 것이라고 생각하면 된다.

 

Single 상속:

단순히 생각해서 상속 한 것이 하나만 있으면 single, 여러개 있으면 Multiple 이라고 생각하면 된다.

 

Multiple 상속:

사실, 멀티플 상속은 자연계에서 적용될 수 있는 사례가 별로 되지 않는다.

기껏 해봤자 날개달리고, 포유류인 박쥐의 예를 들 수 있을 정도이다.

[다이아몬드 문제(Diamond problem)]

만약, 동시에 상속받았을 경우에 제일 하위에서 여러개를 상속받은 함수를(같은 이름의 함수 여러개를 상속받은 경우) 그 이름의 함수를 호출한 경우 어떤 것을 불러야하나? 라는 문제가 발생하게 된다. 이럴 때는 정의를 할 수 없게 되며 이것이 '다이아몬드 문제이다.' 이 문제가 발생한 이유는, 그림에서 보면 위의 부분은 문제가 없는 일반 형식이지만 그 밑의 B,C,D에서 문제가 발생하게 된 것이다.

 

Hybrid 상속:

그림을 보면 멀티레벨 상속도 같이 있고, 한 가지가 아니라 여러 가지 상속이 합쳐진 형태가 하이브리드 상속이다.

 

3. incapsulation

객체지향설게에서는 “모듈화가 가장 중요하다고 하여도 과언이 아니다. 어떻게 해야지 잘할 수 있을까?

이러한 모듈화 개념에서 파생되는 것은 불필요한 것은 노출시키지 말자는 인포메이션 하이딩 개념과, 관계있는 것들은 묶어주는 Class 개념이 합쳐져 이 모든것을 충족시켜주는 것이 '인캡슐레이션' 개념이 된다.

class + information hidding이 중요한 키워드라고 몇번이나 강조하신 느낌이었다. 정보은닉이랑 헷갈리지 말라고.

 

information hidding의 주체는 사람, 사람이다. 핵심은 어쨋든간에 다른 사람들에게 불필요한 것은 노출하지 말자 라는 것이니까. 많이 노출되어서 좋을 것이 없는 것이, 노출되는 인터페이스는 오류를 야기할 수 있다는 등의 문제가 있다.

 

4. Polymphism

간단히 말해, 같은 행위 또는 유사한 행위들을 주체를 바꿔 양상을 바꿀 수 있는 것이다. 자바에서 이 양상이 잘 나타나는데 이것은 뒤에가서 알아보겠다. Ad hoc polymorphism라고 일반적으로 알려져있는 것 이것이 다형성이라고 불리는 일반적인 말과 똑같은 말이라고 보면 된다.

 

Q. Overloading 과 Overrideing의 차이

 

이 질문에 대한 키워드는 function 시그니쳐, 상속 개념, 다형성이다.

 

walk(A,B) walk(A,B,C) 이러한 예시함수들과 같이, 시그니쳐가 이런 것이다. 그리고 같은 이름의 시그니처들이 여러 가지 속성의 인자, 다양한 여러개의 인자들을 받는 것을 말한다. 즉, 같은 이름에 여러 가지 인자들이 올라타있는 것, 오버로딩이다. 자바 프로그래밍을 배울 때 보았던 케이스라 이제야 이해가 가나 싶다.

 

반면에, 오버라이딩은 상속받아서 구체화시킬 때 기존에 있던 함수를 지워서 구현해주는 것을 말한다.

 

Q. 인스턴스랑, 클래스와 인스턴스는 어떠한 관계가 있을까?

이 질문에 대한 핵심 키워드는 클래스는 도면, 인스턴스화를 하면 메모리에 존재하게 되는 것.

메모리, 클래스, 존재.

 

class definition -> instance화 시키면 -> 메모리에 존재하게 된다. 이 과정이 와닿지 않는다면 사진 자료를 보자.

Class를 정의하고, 말 그대로 인스턴스화를 시키면 인스턴스들이 메모리에 존재하게 된다 이것이 인스턴스와 클래스 인스턴스의 차이이다. 클래스 인스턴스는 말 그대로 구현을 하는 것이고, 이 구현한 것들이 메모리 안에 들어가는 것을 읨하는 정도로 알아두면 좋겠다. 사실, 정확한 기억은 아니니까 이 부분에 후에 의문이 생긴다면 질문을 해보자.

BELATED ARTICLES

more