-
[C++] classC++ 2022. 12. 24. 00:22
[객체지향 Object Oriented Programming]
C에서는 struct로 사용한 구조체에 오직 "변수만" 선언이 가능했음
typedef struct player { char name[10]; int age; int rank; }TennisPlayer; void forehand(TennisPlayer* p) { printf("%s forehand",p->name); } void backhand(TennisPlayer* p) { printf("%s backhand",p->name); }
따라서 변수와 함수가 따로 놀았다(함수를 구조체 외부에 선언해야했음)
그래서 구조체변수가 함수를 호출할 수 없고,
그저 자신의 멤버변수들만 관리할 수 있었다.
그래서 구조체의 멤버변수들을 바꾸려면
우리가 직접 함수를 호출해주어야했음(절자지향)
즉 구조체는 그저 연관된 데이터를 묶어놓은 것이었음
하지만, 객체지향에서는 "클래스"라는 "함수를 가질 수 있는" 존재가 나타난다
구조체 업그레이드 버전이라 생각하면됨
typedef class player { private: char name[10]; int age; int rank; public: void forehand() { printf("forehand"); } void backhand() { printf("backhand"); } }TennisPlayer;
따라서, 어떤 클래스변수(인스턴스)를 정의할때 변수와 함수를 모두 선언부에 넣을 수 있다
그리고 그 인스턴스는 마치 살아있는 생명체마냥 자기자신이 함수를 호출하고
그에 따라 변수를 관리하고 여러가지 기능을 할 수 있다
객체를 이루는 것은 데이터와 기능이다.
객체는 하나 이상의 데이터(변수)와 하나 이상의 기능(함수)로 구성된다.
이렇게 함수가 클래스 내로 들어갈 수 있게 되면서,
클래스 내 멤버변수에 접근하기 위해서는 클래스 내 함수들을 이용해야만 하게되었는데
이러한 접근하는 과정에서 나온 개념이"접근허용범위"를 별도로 지정하는 "접근제어지시자" 임
private: 클래스 내 함수에서만 접근허용protected: 상속
public: 어디서든 접근허용
struct -> default = public
class -> default = private
[class에 들어가야하는 함수]
예를 들어 위의 TennisPlayer 클래스에는 TennisPlayer에 종속적인 함수만 들어가야함
forehand backhand는 한 명의 테니스 선수가 할 수 있는 기능들이니 적합함
하지만 pickupball 이라는 함수는 들어가면 안됨
이것은 tennis와 관련된 함수지만, 볼보이가 해야하는 임무이기 때문
따라서 위 TennisPlayer의 함수로 포함되는 것은 부적절함
이와 같이 OOP를 할시에는 하나의 객체(클래스)가 하나의 책임을 가져야함
TennisPlayer는 무조건 테니스선수라는 임무만 수행해야한다.
입장 퇴장 포핸드 백핸드 서브 발리 등등...
한 줄로 말하자면, 클래스는 오지랖이 넓으면 안됨(교수왈)
이를 단일 책임 원칙(Single Responsibility Principle)이라고 한다.
이는 객체지향 5원칙 중 1번째 원칙임
[단일책임원칙이 제대로 지켜지지 않았을 경우]
위 TennisPlayer를 통해 테니스 게임을 개발하고 있는데
귀찮다고 볼보이 관련 코드를 TennisPlayer 클래스에 넣어버림
이렇게 되면 TennisPlayer클래스는 선수와 볼보이라는 두 가지 책임을 지게 되는데,
만일 볼보이 관련 수정 사항이 발생하게 되면 별 상관도 없어보이는 TennisPlayer 클래스를 고쳐야하게 됨
이처럼 하나의 클래스가 두 가지 이상의 책임을 지니게 되면
1. 클래스의 목적이 모호해지고
2. 기능을 수정할 때 영향을 받는 범위도 커져서 유지보수가 힘들어지며
3. 결국 작성한 본인조차도 이게 정확히 뭐하는 클래스인지 명확히 설명할 수가 없는 스파게티 코드가 되어버림
'C++' 카테고리의 다른 글
[C++] 복사생성자의 호출시기 (0) 2022.12.30 [C++] 복사생성자(copy constructor) (0) 2022.12.27 [C++] 생성자(constructor) (0) 2022.12.26 [C++] 참조자 (reference) (0) 2022.12.23 [C++] basics (0) 2022.12.23