객체지향 개념
개념 |
설명 |
기능적 분해 |
구조적 언어를 사용하는 프로그래머들은 보통 기능적 분해 관점으로 프로그램 설계에 접근한다. 기능적 분해라고 하는 것은 문제들을 좀 더 작은 단위의 기능들로 나누는 방법을 의미한다. 각각의 함수는 제어하기 쉬워질 때까지 분해된다. |
변경되는 요구사항들 |
변경되는 요구사항은 개발 프로세스의 관점에서 본다면 필수적인 것이다. 훌륭하고 완벽한 요구사항의 정의를 만들어내지 못한 것에 대해 우리 자신이나 사용자들에 대해 비난하기보다, 변경되는 요구사항을 더욱 효과적으로 대응할 수 있는 개발 방법을 채택해야 한다. |
객체 |
객체는 자기 자신의 책임에 의해서 정의된다. 객체는 자기 자신에 대해 책임짐으로써 자신을 이용하는 프로그램의 작업을 단순화한다. |
생성자와 소멸자 |
객체는 생성되고 소멸될 때 호출되는 특별한 메소드를 가지고 있다. 이 특별한 메소드들은 다음과 같다. - 생성자 : 객체를 초기화하거나 세팅한다. - 소멸자 : 객체가 삭제될 때 객체를 정리한다. 모든 객체지향 언어들은 객체를 효과적으로 다루기 위해 생성자와 소멸자를 사용한다. |
객체지향 용어
용어 |
정의 |
추상 클래스 |
개념적으로 유사한 클래스들의 집합이 갖는 공통적인 속성과 메소드를 정의한다. 추상 클래스는 절대 인스턴스화되지 않는다. |
속성 |
객체와 관련된 데이터(또한 데이터 멤버, 멤버 필드 라고 부른다)이다. |
클래스 |
객체의 청사진(blueprint)으로서, 자신의 타입인 객체의 메소드와 데이터를 정의한다. |
생성자 |
객체가 생성될 때 호출되는 특별한 메소드 이다. |
파생 클래스 |
상위 클래스로부터 상세화된 클래스이다. 상위 클래스의 모든 속성과 메소드를 가지지만 또한 다른 속성이나 다른 메소드 구현을 가질 수도 있다. |
소멸자 |
객체가 삭제될 때 호출되는 특별한 메소드 이다. |
캡슐화 |
'온갖 방법의 숨기기'이다. 객체는 자신의 데이터를 캡슐과한다. 추상 클래스는 자신으로부터 파생된 구체적인 클래스들을 캡슐화한다. |
기능적 분해 |
제기된 문제점을 좀더 세분화한 기능들로 작게 나누는 분석 방법이다. |
상속 |
하나의 클래스를 상세화하는 방법으로, 파생 클래스와 그들의 추상 클래스를 연결시킬 때 사용한다. |
인스턴스 |
한 클래스의 특정한 객체이다. |
인스턴스화 |
클래스의 인스턴스를 생성시키는 프로세스이다. |
멤버 |
클래스의 데이터나 메소드이다. |
메소드 |
객체와 관련된 기능이다. |
객체 |
책임을 가지고 있는 하나의 개체이다. 데이터와 이 데이터를 운영하는 메소드를 스스로 포함하고 있는 특별한 보유자이다. 객체의 데이터는 외부 객체로부터 보호된다. |
다형성 |
자신의 타입에 상세화되어 있는 메소드를 구현하는 것과 관련된 객체의 능력이다. |
상위클래스 |
이 클래스로부터 다른 클래스들이 파생된다. 모든 파생 클래스들이 이용할 속성과 메소드의 주요 정의(그리고 재정의(override)가 가능하다)를 포함하고 있다. |
출처 ] 알기 쉬운 디자인 패턴 _ 알란 섈로웨이, 제임스 트로트 공저 _ 김유지, 정지훈, 이형로 공역
책의 내용에서 공감되고 이해되며 시야가 조금 더 넓어진 기분이 들었던 것은 사실이다.
그래서 좋은 기분이 들었지만,
사실 개인적으로 이해할 수 없는 내용들이 있었다.
번역의 한계였을까? 아니면 일부러 어려워 보이게 쓰고 싶은 이유에서 였을까?
개인적으로 이해하기 어렵게 설명되어 있는 것 같다는 느낌에 개운하지 못한 부분이 있었다.
그 중에서 가장 이해할 수 없는 부분이 캡슐화에 대해 설명한 부분,
내가 배운 내용에 따르면 캡슐화는 위에 명시되어 있는 '온갖 방법의 숨기기'가 아니라는 것이다.
객체지향이 가지는 다섯가지 특징이 있다.
1. 추상화 _ Abstraction
2. 캡슐화 _ Encapsulation
3. 상속성 _ Inheritance
4. 다형성 _ Polymorphism
5. 정보 은닉 _ Information Hiding
본 책의 저자는 캡슐화와 정보 은닉을 구분하지 않고 사용한 것 같다.
캡슐화를 해도 정보 은닉을 하지 않을 수 있으며
제대로 캡슐화를 하지 않더라도 정보 은닉은 할 수 있다고 생각한다.
이 두 가지는 명확하게 구분 되어야 한다.
소프트웨어 공학에서 객체지향 설계를 할 때
loose coupling high cohesion 이라는 말이 있다.
바로 이 내용이 캡슐화에 해당하는 말이고,
하나의 클래스에는 가능하면 메서드를 통해서만 데이터에 접근해야 한다는게 정보 은닉이다.
물론 경우에 따라서는 클래스의 멤버 필드에 직접 접근해야 할 경우가 있겠지만
(정말 특이한 케이스가 될거라고 생각한다.)
이것은 클래스를 설계한 사람의 의도와 달리 데이터가 변경될 수 있는 위험을 안고 가는 것이기 때문이다.
그렇기 때문에 한 클래스의 멤버 필드는 가능하면 반드시 멤버 메소드에 의해서 변경되어야 한다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
java 제네릭 (Generic), 내가 알아보기 쉽게 정리 - 1편, 왜 제네릭 (1) | 2017.05.25 |
---|---|
자바 가상 머신(JVM)의 구조 요약 (0) | 2017.05.24 |
java 환경변수 설정 방법과 이유 총정리 (0) | 2017.05.24 |
java (스태틱) static 이란 도대체 무엇인가 (0) | 2017.05.24 |
자바에서 뿐만 아니라 API는 백과사전과도 같은 존재다. 볼줄은 알아야지. (0) | 2017.05.24 |