캡슐화란?
- 대상 객체가 있을 때 그것을 추상화시켜서
- 필요한 부분만 뽑아서 단순화시킨 것을 캡슐화라고 한다.
- 캡슐화를 통해 class라는 것으로 묶을 수 있고, class형 dataType이라고 한다
- 그 데이터 타입을 이용하여 객체를 만들 수 있고,
- 객체가 만들어져서 메모리에 위치한 상태를 instance라고 한다
instance
- 실체를 의미 - A클래스로 만든 a;
- A a; 이면 메모리에 올라간 상태!
- Son 클래스형 dataType을 가지고 b객체를 만들었다. -- Son b;
- b라는 객체가 만들어져서 메모리에 딱 할당되어있는 상태! 를 instance라고 한다.
- 실제로 손흥민 b가 메모리에 위치한 상태일 때.
캡슐화의 기본 정책 – 정보은닉
- 정보은닉을 위한 접근제어자
- private / protected / pulbic
- 멤버 변수는 철저히 감춘다 -디폴트가 private!
- 멤버 함수( Set/Get 함수 )를 통해서 접근하도록 해라 ( 권고사항 )
생성자
- 객체가 만들어질 때 반드시 호출되는 함수
- 종류 ( 기본 생성자, 인자를 받는 생성자, 복사 생성자 )
소멸자
- 객체가 소멸될 때 호출되는 함수
상속과 포함
지금까지는 클래스를 만드는 방법을 배운 것이다. 이제부터는 객체와 객체 간의 관계에 관련된 내용
상속 - ( is a ) - Tiger is a Animal
포함 - ( has a ) - Car has a Wheel - 포함은( 포함과 참조 )로 나뉜다.
먼저 상속 Start !
부모 자식의 관계라고 하면 – 생각이 굳어버릴 수도 있다..
Parent - 부모 위치 클래스를 – base class – 기반 클래스
Child - 자식 위치 클래스를 – derived class – 유도된 클래스
반드시 상속한다는 개념이 아닌 - 상속을 객체지향 도구의 하나로 유연하게 생각하자.
상속 클래스 만드는 법
- A클래스를 상속받아 만드는 B --- class B : public A { }
## a클래스 상속받은 b클래스로 객체를 만들어보면
a클래스의 영역도 가지고 있고, 자기 자신 b영역도 가진다. / a의 특성도 가지고 b를 가진다.
상속을 시켜서 만드는 것의 유용성 - 유지보수성, 확장성, 재사용성, 가독성
유지보수성
- 자식 클래스들의 필요한 기능들 부모 클래스에 구현해놓으면 자식에게 그대로 다 물려준다..
- value5에 대한 내용 추가시켜줄 경우 calss A에만 내용 추가시켜주면 물려받은 애들 다 자동으로 적용 //
- 각각 따로 해주어야 할 작업을 부모 클래스에만 해주면 됨
확장성
- a클래스의 특성을 가진 다른 것 만드는!
재사용성
- 모듈화를 통한 재사용성 확장
가독성
- 코드를 나눠서 만들어서 자식 클래스에는 코드가 간편해진다.
상속을 하는 방법 2가지 - 일반화, 특수화
일반화
- 클래스를 만들었더니 공통된 부분들이 있네 , 이럴 경우 상속을 생각해볼 필요
공통된 부분 빼내서 부모 클래스를 만들고, 각각 클래스에서는 삭제
시작 부분에서 구조를 잡는 경우에 많이 적용
특수화
- 하나의 클래스가 너무 비대해질 경우 // 클래스 안에 있는 부분들을 하나씩 빼서 자식 클래스로 만들 수 있다.
운영 중 변경사항이나 특이사항에 맞춰 구조변경에 많이 적용
구조는 유연성이 중요하다!! 상황에 맞춰서 유지보수!
너무 타이트하게 구조 짜 놓은 것이 안 좋을 수도 있다..
실습을 통하여 - 상속의 일반화 - 방법과 유용성 체크해보기!
동물 육성 게임
- 소, 닭, 돼지를 육성한 뒤 팔아서 농장을 발전시켜 나가는 게임
일단 하나하나 다 만들기
- 클래스도 / 멤버 변수도 / 생성자도 / 소멸자도 / SetGet함수도 / 사용하는 함수도
이런 식으로 Chicken , Pig 클래스 다 만들어 주기.
각각마다 클래스를 하나 씩 다 만들어 놓고 봤더니 공통된 부분이 있다.
공통된 변수나 함수 부분이 많이 있다 - 이럴 경우 상속을 생각해볼 수 있다.
상속을 시켜서 구조적인 이점이 있다고 판단이 되었을 경우! ( 무조건 X )
상속하기로 판단하고 상속 시작
- 모두 다 아우를 수 있는 적당한 네임의 클래스를 하나 만들어준다. - class Animal
- Animal 생성자를 만들어 준다.
- 각 클래스마다 상속받았다고 표시 - (((( :: public Animal ))))
- 각 클래스에서 Animal 생성자 호출 - (((( 생성자 초기화 리스트로 ))))
- 각 클래스에서 Animal 부모 클래스로 넘긴 부분 삭제 – 공통된 부분 빼냈으니 그 부분 삭제
- 각 클래스의 고유한 속성은 그 클래스에 놔둔다. ( e.g : 치킨- 날다/못 날다 부분은 치킨 클래스에 그대로 놔둔다.)
자식 클래스만의 속성 - 그대로 남겨둔 속성 부분에서 에러 발생 - 부모의 멤버 변수에 접근 불가능
6번의 문제 해결 2가지 방법
- 부모 클래스에서 멤버 변수의 접근제어자를 protected로 해서 열어준다.
- Set/Get 함수를 해줘서 호출해서 사용할 수 있게 해 준다.
지금까지 내용으로 chicken 클래스 변경
추가 부분 check 및 정리
▣ 105번 Line - 부모의 info ( ) + 치킨만의 info( ) 내용 추가
- 부모의 인포를 호출한다 – Animal :: info( ); ---> 치킨 클래스만의 info( ){ } 추가해줄 수 있음.
▣ 부모 클래스의 함수를 자식이 안 가지고 있으면 부모 꺼를 사용하는데 , 자식이 가지고 있으면 자식 꺼 사용
▣ 이처럼 상속이라는 구조의 장점
- 유지보수 용이 - 이미 만들어놓은 상속 틀에다가 추가하면 된다.
- 코드의 간결화(가독성) - 공통된 부분은 빼내고 각자의 속성만 가지고 있으면 된다.
- 모듈화를 통해서 재사용
- 개발 시간의 단축
review
객체지향의 기본인 캡슐화의 개념을 한번 더 체크해보고
객체와 객체 간의 관계인 상속과 포함도 체크!
상속은 is a - 포함은 has a
상속은 일반화의 경우, 특수화의 경우가 있는데
동물 육성 게임 실습을 통하여 일반화 상속에 대하여 알아보았다.
각각의 특성에 맞춰 클래스를 만들어 놓고 보니 공통된 변수나 함수 부분이 많이 있다면
상속의 구조를 생각해볼 필요가 있다.
상속을 시켜서 구조적인 이점이 판단이 된다면 상속을 시키자!
이렇게 공통된 부분들을 꺼내서 상속의 관계로 만들어 주는 것이 일반화 상속.
일반화 상속 부분은 평소에 알고 있고, 사용해오던 상속의 개념과 방법이 크게 다르지 않아서 이해하기 수월했다.
흥미로웠던 부분은
공통된 부분이 많으니 당연히 상속을 해서 사용하는 것이 맞다고 생각하였는데,
무조건적으로 상속을 시키는 것이 아닌
구조적으로 이점이 판단되면 상속을 시키라는 부분과
상속의 구조로 만들게 되면 구조가 딱딱해진다는 것도 고려해야 한다는 점이었다.
이질적인 것이 계속 추가되는 경우나, 부모나 자식 쪽에서 기능 추가를 해줄 수 없는 경우도
생길 수 있으므로 잘 고려해서 구조를 선택해야 된다는 새로운 관점이 생겼다.
review
'Back-end > C++' 카테고리의 다른 글
22. 03. 25 - 상속( 접근 제어자, 업 캐스팅, 다운 캐스팅 ) (0) | 2022.04.03 |
---|---|
22. 03. 24 - 상속(특수화) : 동물 육성 게임, string 클래스 기능 추가 상속 (0) | 2022.04.02 |
22. 03. 22 - 파일 분할, inline 함수 (0) | 2022.04.02 |
22.03.21. 복사 생성자, const함수 (0) | 2022.04.02 |
22.03.18 - 동적 객체 배열, C언어 형식 지정 문자열, 동적 객체 포인터 배열 (0) | 2022.03.25 |