한글로 바뀌면서, 용어가 혼용되는 경향이 있어서 머릿속이 복잡한 김에 정리를 해봅니다. 생각나는 대로 적어본 것이니, 출처는 제 뇌가 되겠네요.
추상클래스 abstract / abstract class
: 구현을 뒤로 미룬 클래스. 인터페이스 형태와 구현클래스 형태가 뒤섞여 있다. 더 정확히 보자면, 몇가지 메서드 등이 불분명하니 서브 클래스(자바 에서 주로 자식 노드를 일컫는 용어) 에서 사용하라고 미뤄두는 것이다. 좀 더 정확히 들어가면. 추상 클래스는 인스턴스 생성이 불가능하다. 또는 인스턴스 생성을 하라고 만드는 클래스가 아닌 것이다. 클래스는 클래스인데, 실제 사용하기 보다는 상속을 받아서 자식 클래스들에게서 사용하기 위해 만드는 설계 인 것이다.
추상메서드 abstract / abstract method
: 구현을 뒤로 미룬 메서드 이다. 보통 클래스에서 abstract 를 해주고, 메서드 에서도 abstract 를 해준다. 추상 클래스에서는 구현된 메서드와 구현되지 못한 메서드가 섞여 있는데, abstract method 는 차후 자식 클래스 에서 분명히 구현이 되어야 한다.
인터페이스 interface
: 인터페이스는 모든 구현을 자식 노드에게 보류한다. 즉, 인터페이스 자체에서는 일절의 구현 코드가 없다. 메서드의 형태만 명시한다. '이 메서드는 이런 것을 받고 이런 것을 돌려받는 메서드이다' 이 정도로만 정리해놓은 클래스 이다. 당연히 인터페이스도 인스턴스 생성은 할 수가 없다. 해서도 안 된다. 이 인터페이스를 통해서, 자식 노드들의 공통점들을 추려서, 가상적이지만 그룹화를 시키는 개념을 생각해볼 수가 있다. mysql, oracle 클래스가 있는데 둘다 connect 라는 기능은 동일할 것으로 생각할 수가 있으니. boolean connect() 라는 추상적인 메서드를 인터페이스에서 지정해놓을 수 있는 것이다. 이는 다른 곳에서 사용하기에 편리해짐을 뜻한다. 그냥 db.connect() 를 호출만 하면 되는 것이다. 이후 데이터베이스는 추가하거나 제거해도 동일한 인터페이스를 implements 해서 사용하면 되는 문제가 된다. 즉, 서로 간에 신경을 덜 써도 되게 된다.
어떻게 보면, 상호간의 기본 규칙을 정해놓는 느낌일 수도 있다. 그래서 명칭이 인터페이스 인 걸 지도 모른다.
구상클래스 concrete / concrete class
: 추상 클래스의 정반대이다. 추상클래스가 아닌 것이 곧 구상클래스 라고 생각해 볼 수 있다. 한글로 표현하기 애매하므로, 구상 클래스 / 구현 클래스/ 구체클래스 / 구체화된 클래스 등의 표현이 뒤섞여서 사용되고 있다. 우리가 오브젝트를 만들기 위해서 만드는 클래스는 구상클래스 인 것이다. 이 구상클래스를 만들기 위해서 물려받게 되는 것들이 [구상 클래스(마찬가지로) / 추상 클래스 / 인터페이스] 세 가지가 되는 것이다. (더 있거나 더 생길 수도 있겠다. 내가 아는 것은 현재 세가지)
그렇다면 '추상 클래스, 구상 클래스, 인터페이스' 의 차이점은?
: 세 가지는 같이 보고 있으면 차이점으로 구분 할 수가 있다. 인터페이스는 코드구현 없이 형태만 존재한다. 추상 클래스는 형태와 코드구현이 같이 공존한다. 구상 클래스는 코드 구현만이 존재한다. (코드 구현 블럭 없는 메서드 형태만 있는 것이 없다. public void a(); 라는 형태를 가질 수 없다. )
<슈퍼 클래스와 서브 클래스>
슈퍼 클래스 Super class
: 자바에서는 보통 부모 노드를 슈퍼 클래스 라고 부르는 듯 하다. parent class 부모 클래스 라고도 생각할 수도 있는데. 부모 클래스와 슈퍼 클래스 개념을 다소 비슷하게 생각해도 무리가 없다. 이렇게 본다면, 부모 클래스 / 슈퍼 클래스 / 상위 클래스 / 기반 클래스 (base class) 라는 용어가 섞여서 나올 수도 있는데 비슷하게 생각을 해도 무리가 없다. 다른 언어에서는 슈퍼 클래스는 정말 최상위 클래스를 말할 수도 있다는 점에 유의하자.
서브 클래스 Sub class
: 자식 노드를 뜻한다. 서브 클래스(Sub class) / 하위 클래스 / 파생 클래스 / 유도클래스 (Derived class) / 자식 클래스 (child class) 등의 용어가 혼용되며 사용이 된다. 각각은 아주 세부적으로는 다른 용어를 뜻할 수는 있지만, 결론적으로는 자식 노드를 말한다. 같은 용어라는 것이다. 자식 노드는 자식 노드 인데, 어떤 점을 강조하기 위해서 단어 선택이 다를 뿐이다.
<오버로딩 과 오버라이딩>
오버로딩 Overloading
: 메서드 이름은 동일하지만, 인자값과 인자갯수, 리턴형태가 다른 경우. 다른 메서드로 인식하는 특징. 자바와 같은 언어의 특징이다. 다르게 생각을 한다고 보면 된다. 이름은 동일하지만 말이다. 반대로 스크립트형 언어에서는 오버로딩이 지원 안되는 경우가 있다. 자바스크립트의 경우 인자값이나 리턴값에 따라서 같은 이름의 메서드를 여러개 생성할 수가 없다.
깊게 들어가면, 메서드 이름을 포인터값으로 리턴받는 언어의 경우는, 오버로딩의 구현이 어려워서 이기도 하다. ...
OOP 에서는 대체적으로 오버로딩이 구현이 되어 있고, 동일한 이름의 메서드를 여러개 만들 수 있게 되었다.
오버라이딩 Overriding
: 중요한 부분이다. 부모 클래스와 자식 클래스에서 동일한(인자값과 인자갯수, 리턴형태 모두 동일한 그 자체) 메서드가 있을 경우에. 자식 클래스에서 대체해서 사용하는 것을 말한다. 일종의 overwriting 같은 개념이라고 보면 된다. 어떤 경우에는 @overriding 이라고 명시하는 경우도 있으니. 이 용어에 대해서는 알고 있어야 한다.
<상속과 이행>
상속 inherit / inheritance
: 상속되는 것과 상속하는 것. 부모와 자식 관계가 형성이 된다. 자식 노드는 부모의 특성을 물려받게 된다. 클래스간의 연결관계를 형성하는 방법중의 하나이다. 상속이라는 것을 일종의 과정, 또는 관계 로 생각을 하면 된다. 상속과정을 위해서 나온 용어들이 extends, super class, sub class, abstract class 등이 되는 것이다. 이러한 용어들이 상속과정을 만들어주게 된다. (한글로 쉽게 생각하면, 부모가 자식에게 물려주는 과정이 상속과정이다)
자식 클래스에서 부모클래스를 상속하는 과정의 확장 extends
: 상속을 사용할 때의 지시어. 자식 노드는 'extends [부모 노드명]' 형식으로 부모 특성을 확장하게 된다. 상속을 받기 위해서 'extends' 라는 지시어를 쓰게 되는 것이다. 명칭이 한글로 어렵기 때문에, 개발자 사이에서는 '상속받는다' 라고 표현을 한다. 주의할 점은 '상속받는다' 라는 한글이 영어로는 'extends' 가 될 수가 없으므로 헛갈린다는 점이다. 그냥 편하게 부르기 위해서 '상속받는다' 라는 표현을 쓴다고 생각하자. (확장 이라는 개념으로만 쓰기에는 다소 부적절하기 때문이다. 상속을 확장하는 개념인데, 결국은 상속받는다 라는 말로 표현이 가능하기 때문이다)
인터페이스의 이행 implements
: 인터페이스를 사용할 때의 지시어. 자식 노드는 'implements [인터페이스명]' 형식으로 형태를 물려받게 된다. 한국말로는 이행/도입/시행/실현/구현 등이 비슷한 용어가 된다.
-- 여기서부터 아래부분은 계속 작성중입니다. 아직 정리가 완전하지 못합니다.
<구성과 집합>
구성 Composition
: 클래스들을 어떻게 배치하고 어떻게 구성도를 가지게 될지. 이 과정을 뜻한다. 클래스로 얘기하자면, 클래스의 속성이 또 다른 클래스로 구성 될 수 있는 것이다. 이런 클래스들간의 구성을 말한다. (한글로 표현하려니 어렵다...)
class Car
- Engine engine
이런 형태로 되어가는 것을 구성한다고 보는 것이다. Engine 도 클래스로 구현하게 될 것이다. C 에서는 struct 를 통해서 구성 composition 을 한다고 한다.
집합 aggregation
: 구성 (Composition) 과는 다른 뜻을 가진 용어다. 배열이나 Vector 같은 집합을 말한다.
위임 delegation
: