OOP와 클래스

C# 포스팅을 안한지가 1년이 넘었는데 그래도

기왕 시작했던 것이고 기초 정도는

마무리 해야할 것 같아서 정리해둡니다.

 

OOP 하면 머리가 약간 지끈 거리는 단어입니다.

Object Oriented Programming - 객체지향 프로그래밍

이것은 현대의 프로그래머들이 머리속에

기본적으로 탑재해야 하는 개념입니다.

 

하지만 평범한 머리의 사람들에게는

이해가 어렵기 때문에 기초적으로 다가

노오력이 필요합니다.

 

OOP에 관한 설명들을 읽다 보면

뭔가 비슷한 것 같으면서도 정의가

통일이 안된 듯한 기분이 드는게

조금씩 다른 설명을 합니다.

 

객체 지향이라는 단어부터 모호하지요.

이것은 프로그래밍 스킬이라기 보다는

프로그래밍으로 문제를 해결하기 위한

방법론입니다. 사람마다 관점이 다를 수 있지요.

 

이것을 공부하려면 절차형 프로그래밍 시대의

고충에 대해서도 생각해볼 필요도 있고

좀 사물을 보는 사고방식도 바꿔야 합니다.

 

객체지향을 설명하는 대표적인 용어는 다음과 같습니다.

 

  • 캡슐화(encapsulation)
  • 추상화(abstraction)
  • 다형성(polymorphism)
  • 상속(inheritance)

 

초보자의 입장에서 보면

역시 잘 와닿지가 않습니다.

왜 이런 방식으로 프로그래밍을 해야하는가?

 

 

컴퓨터 발전의 역사로 들어가면

날밤을 까야하기 때문에 좀더

쉬운 접근을 해야겠습니다.

 

사람이 하기 쉬운 프로그래밍을 하기 위해서아닐까?

 

애시당초 프로그래밍은 0과1의 연속입니다.

0과1을 조합해서 특정 명령어를 생성해 냅니다.

이런 특성을 근대 사회에 최초로 도입한 것은

1890년대에 미국의 인구통계를 자동화

(? 당시로써는 자동화다) 하도록

설계한 천공카드 였다고 합니다.

 

천공카드란 것을 써본 적이 없기 때문에

구멍이 뚫린게 0인지 1인지는 모르겠지만

OMR 답안지의 마킹 방식을 생각하면

일단 1인지 0인지 즉 true 인지 false 인지

검출해 내는 판독기가 있다면 프로그래밍은

가능하다는 것이 됩니다.

 

이 과정이 점점 추상화되서 오늘날

객체지향 프로그래밍까지 발전한 것이라고 하면

멀리 건너 뛴 것 이지만 초기에 발달한

프로그램은 순차적인 코드의 실행이었다는

것을 감안할 때 좀더 인간적으로 이해가

가능한 프로그래밍 방식이 필요하다.

 

그래서 이제 실제 세계의 사물(객체)을

컴퓨터에 1대1 대응을 시켜버리는 단계에

도달합니다. 그것이 객체 지향 프로그래밍을

받아들이는 한 가지 방법일 수 있겠습니다.

 

흔히 C언어와 C++, C#을 비교하면서

객체냐 아니냐를 따지기도 하는데
C언어도 struct 구조체를 함수에서

참조변수로 사용할 수 있었던 것을 보면

실세계 객체(real world object)의 데이터를

가진 자료 구조를 만들 수 있었습니다.

대응하는 함수나 클래스를 fork 하여

상속하는 것도 가능했을 것이라 보면

이미 C언어의 근본에는 객체지향 언어로

업그레이드 할 수 있는 자질이 충분했습니다.

 

단지 절차 지향형이라는 함수와 데이터를

중심으로 프로그래밍을 하기 용이했던 것 입니다.

(모두가 그렇게 프로그래밍 해야한다고 믿고 있었다)

어떤 데이터가 주어지면 그 데이터로

무엇을 어떻게 할 것인가를 생각했습니다.

거기엔 메모리에 독립적으로 존재하며

상호작용하는 객체는 없습니다.

 

함수가 종료되도 상태를 유지시켜줘야

객체를 중심으로 프로그램이 돌아갑니다.

 

그럼 클래스라는 것은 무엇이냐?

클래스 하면 생각하는 것은 학급의 클래스,

MMORPG의 클래스 처럼 유형이나

등급을 의미합니다.

일반적인 용어로는 공통된 특징을 뽑아서

유형을 만들어 놓은 것이 클래스입니다.

예를 들어 한국 사람이란 클래스는

한국 사람이 가진 특징을 뽑아서

만든 클래스입니다. 한국 사람이라는

사람은 실제로는 존재하지 않지만

한국 사람이라는 클래스에 속하는

사람은 있습니다.

 

특징을 뽑아보면 여러가지가 있겠죠?

그 중에 true or false로 판단할 수 있는

명제들을 사용합니다.

한국 국적을 가졌는지 여부 (true or false)

한국에서 태어났는지 (true or false)

한국 국적을 가진 부모가 있는지 (true or false)

한국에서 학교를 다닌 기간이 5년 이상인지

(true or false) 등 명제를 뽑아서 기준을

정한다면 한국 사람이라는 클래스를

프로그램에 구현할 수 있습니다.

 

이런 방식을 적용할 수 있는 범위에는

거의 제한이 없습니다. 이 객체지향

프로그래밍이 발달한 후 IT산업의 발전 속도가

눈부시게 빨라졌는데 하드웨어의 발달과

컴퓨터의 보급률도 있겠지만 중요한 것은

앱을 개발하는 속도가 엄청나게 빨라졌다는 것입니다.

 

꼭 대기업IT 회사에 소속되지 않아도

오픈소스 커뮤니티의 발달로 수많은

클래스 라이브러리가 배포되면서

컴퓨터 학위가 없어도 누구나

프로그램을 쉽게 개발할 수 있게 됩니다.

 

C#의 BCL 이나 FCL은 그런 목적으로

개발되었습니다. C#이 속한 .NET 프레임워크는

거대한 객체지향 프로그램의 생태계입니다.  

 

클래스란 것은 이렇게 방대한 세계이고

프로그래머는 자신의 클래스를 개발하여

오픈소스 생태계에 공유할 수 있습니다.

당연히 남의 클래스도 내가 사용할 수 있습니다.

(오픈소스라도 라이센스 조건은 있다)

 

C# 코딩 기초에서 학습하는 클래스로는

아직 많은 것을 할 수 없겠지만

거기서 부터 시작하는 것 입니다.

사실 제대로된 프로그램을 만들려면

남이 만든 클래스를 사용해야 하지만

뭐든 직접 만들면서 응용력을 기를 수 있습니다.

 

머리로는 이해되도 아직 가슴으로

와닿지 않는다면 그 때는 코딩을

해야할 타이밍입니다.

 

다음 포스팅에서는 클래스를 생성하는

코딩 실습을 하겠습니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band