Lecture Plan
◆ OOP 개요
◆ 클래스와 객체
◆ 생성자와 소멸자
◆ 생성자 오버로딩
◆ 복사 생성자
◆ this, const, static, friend
객체지향 프로그래밍 개요
(Summary) Object Oriented Programming
◆ 절차적 프로래밍이란?
◆ 절차적 프로그래밍의 단점
◆ 객체지향 프로그래밍의 개념과 장점
◆ 객체지향 프로그래밍의 단점
Procedural Programming
◆ 절차적 프로래밍
● 프로그램이 수행하는 일련의 작업을 기준으로 하는 프로그래밍 패러다임
● 작업의 구현 = 함수 / 함수의 집합 = 프로그램
● 데이터와 작업이 분리되어 있는 개념
● 데이터는 작업의 실행을 위해 매개변수로 전달될 뿐
● 이해가 쉬운 방식
함수라는 것은 어떤 작업을 구현하는 매개체
함수들을 모아두면 프로그래밍이 된다.
함수를 구현하면 어떤 입력데이터가 입력되고
함수로 인해서 출력데이터가 나온다.
출력데이터는 다시 함수에 들어가 작업하게 된다.
즉, 이 함수는 어떤 입력이 들어왔을 때 어떤 출력을 내보낸다고 정의되어 있을 뿐이지
사용자가 직접 입력데이터를 정할 수 있다.
Disadvantages of Procedural Programming
◆ 절차적 프로그래밍의 단점
● 함수가 데이터의 구조를 정확히 알아야만 한다
☞ 데이터가 변하면, 함수의 수정이 필요하다.
☞ Tightly coupled
● 프로그램의 규모가 커지면,
☞ 이해하기 어렵고
☞ 유지/ 보수하기 어렵고
☞ 확장하기 어렵고
☞ 디버깅하기 어렵고
☞ 코드를 재사용하기 어렵고
☞ 오작동할 확률이 커진다.
func(int) 형태로 작성하면, 입력 데이터는 int 형이어야 한다.
만일 string 형으로 입력값을 바꾸고 싶다면 함수를 재 창조하거나 overloading을 통해서
함수를 다시 만들어야 한다.
Tightly coupled : (함수와 input 데이터가) 밀접하게 관련(연결)이 되어있다.
- 함수에서 굉장히 안 좋은 특정이다.
- 데이터가 변해도 함수를 계속 사용할 수 있도록 만드는 게 좋은 프로그래밍 방식이다.
- 코드의 재사용성이 높아진다.
절차적 프로그래밍으로 큰 규모의 프로그램을 만들 때는 한계점들이 있다고 알려져 있다.
그래서 만들어진 게 객체지향 프로그래밍이다.
Object Oriented Programming
◆ 객체지향 프로그래밍
● 절차적 프로그래밍의 단점을 극복하기 위해 제안된 프로그래밍 패러다임 중 하나이다.
● C++ , C# , Java 등에서는 이러한 방식을 손쉽게 구현할 수 있는 언어의 문법을 제공한다.
☞ 함수형 프로그래밍 등 새로운 패러다임을 적용할 수 있도록 언어는 계속 확장될 수 있다.
◆ 클래스와 객체를 기반으로 한다.
● 데이터와 작업을 하나로 묶어서 표현한다.
◆ OOP 개요
◆ 클래스와 객체
◆ 생성자와 소멸자
◆ 생성자 오버로딩
◆ 복사 생성자
◆ this, const, static, friend
객체지향 프로그래밍 개요
(Summary) Object Oriented Programming
◆ 절차적 프로래밍이란?
◆ 절차적 프로그래밍의 단점
◆ 객체지향 프로그래밍의 개념과 장점
◆ 객체지향 프로그래밍의 단점
Procedural Programming
◆ 절차적 프로래밍
● 프로그램이 수행하는 일련의 작업을 기준으로 하는 프로그래밍 패러다임
● 작업의 구현 = 함수 / 함수의 집합 = 프로그램
● 데이터와 작업이 분리되어 있는 개념
● 데이터는 작업의 실행을 위해 매개변수로 전달될 뿐
● 이해가 쉬운 방식
함수라는 것은 어떤 작업을 구현하는 매개체
함수들을 모아두면 프로그래밍이 된다.
함수를 구현하면 어떤 입력데이터가 입력되고
함수로 인해서 출력데이터가 나온다.
출력데이터는 다시 함수에 들어가 작업하게 된다.
즉, 이 함수는 어떤 입력이 들어왔을 때 어떤 출력을 내보낸다고 정의되어 있을 뿐이지
사용자가 직접 입력데이터를 정할 수 있다.
Disadvantages of Procedural Projramming
◆ 절차적 프로그래밍의 단점
● 함수가 데이터의 구조를 정확히 알아야만 한다
☞ 데이터가 변하면, 함수의 수정이 필요하다.
☞ Tightly coupled
● 프로그램의 규모가 커지면,
☞ 이해하기 어렵고
☞ 유지/ 보수하기 어렵고
☞ 확장하기 어렵고
☞ 디버깅하기 어렵고
☞ 코드를 재사용하기 어렵고
☞ 오작동할 확률이 커진다.
func(int) 형태로 작성하면, 입력 데이터는 int 형이어야 한다.
만일 string 형으로 입력값을 바꾸고 싶다면 함수를 재 창조하거나 overloading을 통해서
함수를 다시 만들어야 한다.
Tightly coupled : (함수와 input 데이터가) 밀접하게 관련(연결)이 되어있다.
- 함수에서 굉장히 안 좋은 특정이다.
- 데이터가 변해도 함수를 계속 사용할 수 있도록 만드는 게 좋은 프로그래밍 방식이다.
- 코드의 재사용성이 높아진다.
절차적 프로그래밍으로 큰 규모의 프로그램을 만들 때는 한계점들이 있다고 알려져 있다.
그래서 만들어진 게 객체지향 프로그래밍이다.
Object Oriented Programming
◆ 객체지향 프로그래밍
● 절차적 프로그래밍의 단점을 극복하기 위해 제안된 프로그래밍 패러다임 중 하나이다.
● C++ , C# , Java 등에서는 이러한 방식을 손쉽게 구현할 수 있는 언어의 문법을 제공한다.
☞ 함수형 프로그래밍 등 새로운 패러다임을 적용할 수 있도록 언어는 계속 확장될 수 있다.
◆ 클래스와 객체를 기반으로 한다.
● 데이터와 작업을 하나로 묶어서 표현한다.
패러다임(paradigm)은 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다. https://ko.wikipedia.org/wiki/%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84
새로운 패러다임이 와도 C++ 언어는 기능을 확장해서 패러다임을 할 수 있는 기능을 제공한다.
데이터와 작업이 분리되어 있는 개념을 해결하기 위해서 객체지향 프로그램에서는
데이터와 작업을 하나로 묶어서 표현할 수 있는 클래스를 정의를 해서 사용할 수 있도록 한다.
◆ 객체지향 프로그래밍의 특징
1. 캡슐화
☞ 객체는 (데이터) + (데이터를 기반으로 한 동작)을 구현한다.
2. 정보 은닉
☞ 사용자는 내부 구현에 대해 알 필요도 없고, 알아서는 안된다.
- 잘못된 사용 및 수정을 방지한다.
☞ 사용자는 외부로 노출된 인터페이스만 활용 가능하다.
☞ 테스트, 디버깅, 유지보수, 확장이 용이해진다.
3. 상속
4. 다형성
객체 지향 프로그래밍의 특징은 캡슐화 / 정보은닉 / 상속/ 다형성이다.
상속 / 다형성은 나중 강의에서 다룰 예정이다.
캡슐화와 정보은닉에 집중한다면,
캡슐화는 class개념이다.
캡슐화는 데이터와 데이터 기반으로 한 동작(함수)을 가지고 있다.
정보은닉이라는 건
사용자가 잘못된 사용이나 수정을 방지하기 위해 내부 구현에 대해 정보를 은닉한다.
사용자는 사용이 허락된 노출되어 있는 인터페이스만 활용이 가능하며
그렇기에 테스트, 디버깅, 유지보수, 확장이 용이하다.
간단히 요약을 하면,
class 안에 데이터와 함수가 있는데
노출을 허락된 값(데이터 + 함수)과 노출을 금지한 값이 있다.
왜 금지해야 하는가? 금지를 시킴으로써 얻을 수 있는 장점이 있기 때문이다.
테스트, 디버깅, 유지보수, 확장에 용이하기 때문이다.
코드를 통해 특징을 확인할 예정이다.
Disadvantages of Objected Programming
◆ 절차적 프로그램의 상위 호환이 아니다!
● 잘 설계된 절차적 프로그램 > 잘못 설계된 객체지향 프로그램
● 모든 문제에 어울리는 설계 방안이 아니다.
● 모든 대상이 클래스로 치환되는 것은 아니다.
◆ 객체 지향 프로그램은 어렵다
● 특히 C++
◆ 문제를 분석하여 좋은 설계 설명서를 만들어야만 한다.(어렵다)
◆ 성능에서 손해를 보거나, 복잡한 코드가 작성되기도 한다.
모든 문제에 어울리는 설계 방안이 아니기 때문에
"함수형 프로그래밍"을 새로운 패러다임에 적용하여 계속해서 언어가 나오고 있다.
객체 지향 프로그래밍 기법이 근 삼십 년간 사용되는 많은 SW의 비중이 높아지고 있다.
그런 프로그램들이 어울리기 때문에 유행을 하고 굉장히 많이 사용되고 있었던 것이다.
모든 문제에 해결되는건 아니지만, 많은 문제에 해결할 수 있는 해당 사항이 있었기 때문에
많이 사용하고 있다.
C#과 Java에 비해 C++은 기능이 많고 HW에 근접한 언어이기 때문에 어렵다고 볼 수 있다.
C++을 잘 배워두면 나머지 언어는 훨씬 쉽게 할 수 있기에 잘 배워두는 게 좋다.
(Summary) Object Oriented Programming
◆ 절차적 프로래밍
● 데이터와 작업이 분리되어있다.
◆ 절차적 프로그래밍의 한계
● 작업이 데이터에 의존적이다. (ex. 데이터가 변하면 함수를 수정해야 한다.)
◆ 객체지향 프로그래밍의 개념과 장점
● 데이터 + 작업 캡슐화
● 정보 은닉
●상속, 다형성..
◆ 객체지향 프로그래밍의 한계
● 절대란 없다.
● 성능 손실 가능성이 있으며, 디자인에 더 많은 수고가 필요하다.
https://youtu.be/bkaG9 c3_P5g? si=rApqePpIrBmFgHc4
'C++ > C++ : Study' 카테고리의 다른 글
OOP - (3) 멤버 접근 제한자 (0) | 2024.10.14 |
---|---|
OOP - (2) 클래스와 객체 (0) | 2024.09.29 |
C++ 포인터 참조자 (7) 포인터 vs 참조자 (0) | 2024.09.25 |
C++ 포인터 참조자 (6) 참조자 (0) | 2024.09.22 |
c++ 포인터 참조자 (1) 개요 (0) | 2024.09.22 |