C# 공부 일지 객체지향 프로그래밍(OOP)와 절차적 프로그래밍(PP)

김고은·2022년 3월 20일
0

C#

목록 보기
1/1

C#에 대해 막 처음 발을 디디면서, C#, 자바는 대표적인 객체 지향 프로그래밍 언어다 라는 글을 보고 객체지향 프로그래밍이 무엇인지, 객체 지향이 아니라 또 ~ 지향 프로그래밍 언어가 있는지 궁금해 찾아보게 되었다.
사실 많이 들어봤는데, 귀찮아서 제대로 공부한 적이 없었다.

따라서 이 페이지를 통해 이 개념은 정복하고 넘어가려고 한다.
출처 3에서는 직접 절차적 프로그래밍과 객체 지향 프로그래밍으로 같은 문제에 대하여 다른 방식으로 코드를 구현했다. 설명도 가장 깔끔하게 잘 되어있다.
이 코드 이틀안에 꼭 구현해봐야겠다.

객체 지향 VS 절차적 프로그래밍

1. 반드시 이분법적으로 두 개념이 구분되는 것은 아니다.
엄밀히 말하자면 어디까지나 '지향'이라는 것이고 하나의 프로그래밍 패러다임이지 C언어는 절차적으로만 프로그래밍한다. Java는 객체지향적으로 프로그래밍을 해야한다.가 아니라는 것이다.
필요한 경우 어떤 언어이건 상관없이 절차지향적으로 코딩할 수 있습니다. 반대로 C언어로도 객체지향적으로 코딩할 수는 있습니다. 유사 객체지향??

2. 객체지향 프로그래밍과 절차적 프로그래밍은 절대 반대개념이 아니다.
절차적 프로그래밍은 '데이터를 중심으로 함수'를 만들어 쓰는편이고, 객체지향은 '데이터와 기능(함수)들을 묶어 하나의 객체'로 만들어 쓴다. 어디까지나 프로그래밍 접근 방법이 조금 상이할 뿐 정반대 개념이 아니다.

그럼 어떻게 구분?

  • 캡슐화, 다형성, 클래스 상속을 지원하는가?
  • 데이터 접근 제한을 걸 수 있는가?

보통은 위 기준을 만족하면 객체지향, 만족하지 않으면 절차적 성격이 강해진다.

요즘에는 객체지향적 프로그래밍이 대세인지라 상용 언어 중 대부분이 객체지향적입니다. 반면에 C는 그렇지 않다.

C, 포트란, 코볼같은 언어들이 절차적 언어의 대표였는데, 복잡한 알고리즘을 짤 때 절차적 프로그래밍을 하면 순서도(흐름도)가 꼬이기 시작하면서 코딩한 코드가 사람이 읽으면서 동작을 이해할 수 없게 되는 일명 '스파게티 코드'가 되어버린다는 단점이 발생하였다. 이러한 문제의 대안으로 객체지향적 프로그래밍이 나온 것이다.

따라서 절차적 프로그래밍 언어들도 객체지향의 특징들을 가져오기 시작했고. 예로들어 C++이 있다!

  • C++ = C언어 기반으로 여기에 더해 상속, 캡슐화 등을 지원 (그 외의 언어들도 자체 업데이트를 통해 객체지향 프로그래밍의 특징들을 하나 둘씩 갖고오게 된다)
절차 지향 프로그래밍
  • 함수를 만들고 순차적으로 프로그램이 동작하는 방식
    대표적으로 C언어가 있다.
  • 장점: 객체나 클래스를 만들 필요없이 바로 코딩 가능, 함수호출가능, 프로그램 흐름을 쉽게 추적할 수 있다. 메모리 적게 듦
  • 단점: 코드끼리 유기성이 높아서 새로운 데이터나 기능을 추가하기 어렵다. 코드 재사용 불가, 유지보수 어려움
객체 지향 프로그래밍
  • 문제를 여러 개의 객체 단위로 나눠 작업하는 방식.
    대표적으로 Pytho, C#, C++, JAVA 등이 있다.
  • 장점: 캡슐화(모듈화)로 인해 유지보수 용이, 객체 자체가 하나의 프로그램이기 때문에 상속처럼 코드 재사용에 용이
  • 단점: 많은 양의 메모리 소모-> 속도가 느림, 설계하는 데 시간 필요
객체지향 프로그래밍의 특성: 추상화, 캡슐화, 상속, 다형성

1) 클래스 + 인스턴스(객체)

클래스
추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메소드로 정의한 것.

  • 어떠한 객체의 상태를 나타내는 변수와 행동을 나타내는 메소드의 집합
  • 객체를 정의하는 틀, 설계도

인스턴스(객체)
클래스에서 정의한 것을 토대로 실제 메모리상에 할당 된 것. 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화 라고 한다.

객체간의 관계
객체 지향 프로그램에서 객체는 다른 객체와 관계를 맺고있다.

  • 집합 관계 : 완성품과 부품의 관계
  • 사용 관계 : 객체가 다른 객체를 사용하는 관계
  • 상속 관계 : 종류 객체와 구체적인 사물 객체 관계

2) 추상화(Abstraction)
객체지향에서 추상화란 객체에서 공통된 속성과 행위를 추출하는 것을 의미한다.
예를들어, 게임 프로그램을 개발하며 캐릭터가 소지하는 다양한 무기들이 있다. 칼, 삽, 곡갱이, 총, 활 등 여러가지 무기들이 존재하는데 이들의 기능적인 내용은 다르지만 공통적인 속성과 행위를 개념으로 무기라는 클래스를 정의할 수 있다.
이렇듯 추상화는 다른 객체들과 구분되는 핵심적인 부분에 집중하여, 복잡도를 관리할 수 있게 해준다.

3) 캡슐화(Encapsulation)
캡슐화는 연관있는 변수와 메소드를 묶어주는 작업을 말한다.
접근 제어 지시자[public, private, protected]를 통해 외부로부터의 접근을 제한하여 객체내에서만 접근이 가능하도록 해주며, 이를 정보은닉이라고 한다.
외부의 클래스 혹은 모듈에 의존적인 프로그램의 경우 변경이나 오류에 취약해지는데, 정보은닉을 통해 이러한 결합도를 낮추며 응집도를 높여준다.

4) 상속(Inheritance)
클래스 개념이 도입되면서 상속을 통해 부모클래스의 속성과 기능을 이어받아(상속받아) 사용하는 것을 말한다.
프로그램을 개발하다 보면 중복되는 속성과 기능을 개발해야 하는 일이 발생되는데 상속을 사용한다면 중복되는 기능을 반복하여 작업하지 않고 작업을 할 수 있게 해준다.

  • 자식클래스는 상속을 통해 부모클래스의 속성과 기능을 물려받는다.
  • 또한. 다형성을 통해 변경이 필요한 부분을 변경하여 사용할 수 있다.

5) 다형성(Polymorphism)
다형성이란 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 동일한 변수, 함수명 등이 다양한 방법으로 기능하는 것을 말하며 오버라이딩(overriding), 오버로딩(overloading)이란 형태로 제공된다.

출처
1. https://webclub.tistory.com/155 [Web Club]
2. https://m.blog.naver.com/ridesafe/222017882422
3. https://st-lab.tistory.com/151

profile
veloger

0개의 댓글