객체지향 프로그래밍

2022. 5. 30. 17:46C++

객체지향 프로그래밍(Object-Oriented Prograimming) 쓰는 이유

절차지향 프로그래밍의 한계가 있음

유지보수를 편하게 만들어야함

함수를 보면 여러가지 변수가 보인다.

확장성이 좋다.

 

절차지향 프로그래밍의 한계

1. 데이터와 데이터를 다루는 함수가 분리되어 있다.

어떤 타입을 설계할 때, 그 타입을 다루는 함수를 작성할 때마다 첫 번째 인자로 어떤 데이터를 다룰 것인지 주소값을 받아야 했다. 이는 쓸데없이 함수가 길어지게 하는 요인이 되며, 함수 내부에서도 포인터로 데이터를 다뤄야 하는 불편함이 있다.

 

2. 함수의 이름을 항상 다르게 작성해야 한다.

C언어에서 함수의 이름은 전역 이름공간을 사용하기 때문에 모든 함수마다 이름을 다르게 지어줘야 했다.

 

3. 프로그램을 확장하기 불편하다.

항상 어떤 함수가 필요한지 명확하게 호출해야 했기 때문에 프로그램에 수정 사항이 생기면 변경 사항이 많아졌다. 그래서 이를 최대한 줄이기 위해 함수 포인터를 사용하거나 같은 카테고리의 타입에서 특정 타입이 무엇인지 가려내기 위해 추가적인 데이터가 필요했다.

 

그래서 프로그래밍의 선구자들은 이러한 불편함을 줄이기 위해 여러 컴퓨터 과학자들은 고민하기 시작했고, 그로 인해 나오게 된 것이 객체지향 프로그래밍이다.

 

개요

객체지향 프로그래밍(Object-Oriented Programming)은 현대 프로그래밍 패러다임 중 가장 주류가 된 프로그래밍 패러다임이다. 이름에서 알 수 있듯 객체지향 프로그래밍은 객체를 중심으로 프로그램을 구성하는 방법이다. 이번 강의를 통해서 절차지향 프로그래밍은 어떤 한계가 있고, 그걸 극복하기 위해 객체지향 프로그래밍에서는 어떤 방식을 사용했는지 그리고 객체지향적으로 설계는 어떻게 하는지에 대해서 알아보도록 하자.

 

객체지향 프로그래밍에서의 데이터 부분을 필드(field),함수를 메소드(method)라고 한다.

 

객체지향 프로그래밍의 주요 개념

객체지향 프로그래밍에는 4가지 주요 개념이 있다.

캡슐화 : 캡슐처럼 단단해지며 오류나기가 적음, 데이터와 데이터를 다루는 함수를 같이 작성하는 것이다.

C언어에서 쓰기위해 따로 함수 작성

왼쪽은 c언어고 오른쪽  C++로 작성한거

 

C언어의 호출법 

1. 그냥호출

struct Person person;

 

Person_Create(&person, "최선문");

 

Person_TalkMyName(&person);

 

2. 객체지향적 호출

Person person("최선문");

 

person.TalkMyName();

3. C언어에서 가능한 호출

 

struct Person person;

Person_Create(&person, "최선문");

person->Name = "용준헌"; 

Person person("최선문");

 

컴파일 오류와 로직오류가 나서 C++에서는 불가능한 방법이다. C++에서는 클래스안에있는것만 쓸쑤있고 처음에 선언한것은 private에 담겨있어서 선언이 불가능 하다. public은 가능하다.

 

또 어떤 객체를 사용함에 있어 객체를 올바르게 사용할 수 있도록 접근 지정자(Access Specifier)라는 게 있어 외부에 공개할 것과 그렇지 않은 것을 구분지을 수 있다.                     

                                                                    

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

상속(Inheritance) :코드를 물려받는 것을 의미한다. 다시 말해 코드를 재사용 가능.

누가봐도 객체지향쪽 이 코드도 짧고 편해보인다.

상속을 이용하면 타입을 더 작은 단위로 모듈화 할 수 있다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

추상화 : C++의 창시자 비야네 스트롭스트룹 교수님께서는 추상화(Abstraction)에 대해 ‘구현 세부 정보를 숨기는 일반적인 인터페이스를 정의하는 행위’라고 정의했다. 인터페이스에 대한 정의가 생소할 수 있으니 이에 대해서 먼저 살펴보고 가자. 남이 편하게 쓰거나 코드를 보기 쉽게 만들어주는거

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

다형성 : 객체지향 프로그래밍의 핵심으로 잘 다루는 것이 중요하다.

C언어에서 비슷한 효과를 보고 싶다면 함수 포인터를 사용하면 된다.

 

다형성은 객체지향 프로그래밍의 핵심으로 잘 다루는 것이 중요하다. 이에 대해서는 나중에 객체지향적 설계 강의할 때 알아보도록 하겠다.

Virtual void,Override = 가상함수 

Renference

C언어에서 간접참조를 할때 pointer을 썻음 범위바깥에 식별자에있는 데이터를 얻어다가 썻다.
데이터를 복사안하고 간접참조를 해서 메모리를 적게썻다. Renference는 Pointer와 다르다

 

래퍼런스 : &  null값이 들어올수없다.
래퍼런스는 무조건 초기화 해야한다.
간접참조를 할때 무조건 역참조를 안써도된다

래퍼런스를 사용할떄는 주소연산을 사용하지 않아도된다.

래퍼런스의 용도는 간접참조를 편하게 하기위해서 쓴다.

 

# 객체지향 프로그래밍 개념
- 절차지향 프로그래밍이 불편했기 때문에 등장했다.
    - 프로그램 유지보수가 힘들기 때문- 4가지 개념
    - 캡슐화(Encapsulation) : 데이터와 함수를 같이 작성하는 것
    - 상속(Inheritance) : 코드를 물려 받는 것
    - 추상화(Abstraction) : 사용하기 쉽게 인터페이스를 정의하는 것
    - 다형성(Polymorphism) : 같은 인터페이스를 사용하되 서로 다른 동작을 하게 하는 것- 객체에서 데이터를 필드

 

(Field), 함수를 메소드(Method)라고 한다.# C++ 프로그래밍
- 레퍼런스(Reference) : 간접 참조를 위한 타입
- 포인터의 불편함
 (1) Null 체크를 해야 한다.
 (2) 역참조 연산자를 써야 한다.- 클래스 : 객체의 청사진
  - 클래스 타입 : struct, class, union
  - C언어에서 구조체 만드는 것과 문법은 비슷함.
  - 클래스 내부에서 선언된 식별자는 클래스 범위(Class Scope)를 가진다.
  - 멤버에는 변수랑 함수를 가질 수 있다.
  - 클래스를 바탕으로 메모리에 표현한 것을 인스턴스(Instance)라고 한다.- 접근 지정자
  - public : 클래스 외부에서 접근 가능
  - protected : 몰?루
  - private : 클래스 내부에서 접근 가능- 생성자 : 초기화를 담당하는 특수한 메소드
  - 기본 생성자는 아무런 생성자도 정의하지 않았을 때 컴파일러가 자동으로 합성한다.
  - 복사 생성자
  - 첫 번째 매개변수로 동일한 타입의 레퍼런스를 가지는 생성자
  - 복사 생성자도 정의하지 않으면 기본으로 합성된다.
  - 소멸자 : 자원 정리를 담당하는 특수한 메소드
  - 소멸자를 정의하지 않았을 때 컴파일러가 자동으로 합성한다.

 

교수님이 객체지향에 대해 정리한것에 대해서 더 짧게 간추려봤다.

 

객체지향 프로그램은 절차지향의 프로그래밍을 보안하기 위해서 나온것이고 객체 지향 프로그래밍에선 시스템을 상호작용하는 자율적인 객체들의 공동체이고 시스템을 분할하며 다른 객체들과 협력관계이며 각 객체는 협력 내에서 정해진 역할을 수행하면서 책임의 집합이며 객체는 다른 객체와 협력하기위해 메세지를 전송하고 전송하는 과정에서 적합한 메소드를 선택을 하며 어떤 객체들이 메세지를 주고 받으며 협력하며 각 객체 마다 적절한 책임을 수행하며 우연하고 견고하게 협력  관계를 구축하는것이다.

 

https://www.slideshare.net/ssuser642b19/3-pptx-251931526 <<- 객체지향프로그래밍에 대해 정리한 조별ppt입니다!

 

'C++' 카테고리의 다른 글

C++ 객체지향  (0) 2022.06.02
C++ 객체지향 프로그래밍 상속쪽 오류  (0) 2022.05.31
202204_15 c++ 구조체  (0) 2022.04.15
20220414_게임을 만들어보자!  (0) 2022.04.14
20220413_배운것~~~!  (0) 2022.04.13