질문]오브젝트 오리엔티드에 관해

kimdy123의 이미지

c나 C++을 쬐금 짜는 사람입니다.
오브젝트 오리엔티드 프로그램 이말에 대해서 정확한 개념이 없습니다.
과연 어떤 프로그램이 오브젝트 오리엔티드를 지원못하고 어떤것들은
하는지 못하면 무엇때문에 못하는지 개념상으로 저의 머리속에 쏙 안들어
오네요 책은 읽어보았지만 추상적인 내용일뿐 실제적으로 간단한 예를 보면
서 이해하고 싶습니다. 과연 어떤것인지 가슴속으로 느끼면서 아하..
아시죠 간단한 예가 있는 사이트나 좀 상세이 알려주시면 감사드리겠습니다.
그럼 읽어주셔서 감사 드립니다.
그럼 오늘도 좋은 하루 되세요.

mshyun의 이미지

흠 도움이 안될수도있지만 참고바랍니다.

절차지향프로그램으로서 프로그램을 짠다고햇을시에는
사람이라는 걸 프로그래밍을 한다고해봅시다.
그렇다면 사람이라는 모습 특징들을 프로그램으로 짜게될 것입니다.
그런데. 이렇게 사람이라는걸 프로그램한상태에서 다시 그 사람을 걷게 하고싶을때 과연 어떤일이 벌어질까요?
물론 불가능?한게 아닙니다. 좀더 복잡하다는거죠. 모듈을 새로 짜야된다거나 다시처음부터 프로그래밍을 하는 수고를 해야한다는 차이겠죠.
그렇다면 객체지향은 어떻게하느냐
객체지향은 모든걸 객체로 보는 프로그램방식입니다.
그렇기 때문에 사람이라는 걸 하나의 객체로 보고 그객체에 이벤트및 성격 특징을 줌으로써 쉽게 프로그램을 할수있다는 방식이죠.

이걸로 부족하다면 하가지 예를 더 들자면
윈도우에 프린터를 하나 설치한다고해봅시다.
그러면 프린터 드라이버가 필요합니다.
그런데 우리는 프린터를 사면 프린터 회사에서 드라이버를 주게됩니다.
이건 아시겠죠?그러면 이렇게 하지않고 c언어에서처럼 switch문같은 것을이용해서
윈도우에서 모든 드라이버를 지원한다고해봅시다.
그럼 전세계의 프린터드라이버를 가지고있어야할 뿐 만 아니라 그걸 찾는것 또한 수고가 될 것입니다.
그럼 이걸 객체지향프로그램은 어떻게 하느냐
지금처럼 윈도우에서 하는 방법처럼 아무것도 가지고있지않습니다.
단지 가지고잇는건 프린터 드라이버가 들어갈 자리를 하나 만련해놓죠.
객체지향프로그램에서는 이런걸 추상화 라고합니다(abstract)
그렇게 함으로써 사용자가 프린터를 설치하고 드라이버를 설치하는거죠
이것이 (implements)라고도 하죠.

도움이 되엇으면 좋겠군요.

dotri의 이미지

좀 개념적으로 설명을 해보면..
컴퓨터로 하는 모든 작업은 "연산" 이라는 과정입니다.
게임을 하는것도, 워드를 쓰는것도, 인터넷을 하는것도 모두 CPU 에 의해서 연산이 이루어져서 하게 되는겁니다. 다만 겉으로 보이는 모습만 그림일 뿐이지, 사실은 모두 0 과 1 로 이루어진 기호밖에 안되지요.

모든 프로그램에는 "연산(Method)" 과 "데이터(Data)" 가 있습니다. 이 세상에 연산이나 데이터 둘중 하나라도 없는 프로그램은 없습니다. 워드 프로세스에서는 사용자가 입력한 문장이 데이터가 될 것이고, 그것을 화면에 보여준다거나 디스크에 저장한다거나 하는 동작이 연산이 될 것입니다. 그 간단한 Hello, world 프로그램만 보더라도 "Hello, world" 라는 문자열은 데이터가 되고 printf() 함수는 연산이 됩니다.

C 언어를 보면, "연산"이라는 것은 함수라는 모습으로 구현되어 있습니다. 프로그램이 수행해야 할 동작들을 함수로 만들어놓고, 필요할때마다 함수를 호출함으로써 사람이 지시한대로 컴퓨터가 연산을 수행하도록 하는거죠. 그리고 C 언어에서 "데이터"라는 것은 변수의 모습으로 구현되어 있습니다. 변수에 어떤 값을 집어넣는다거나, 아니면 함수를 호출할때 인자로 넘기거나 해서 데이터를 특정한 동작대로 처리하는거죠.

그런데 C 언어를 보면.. 우선 main() 함수가 있고, 그 안에서 프로그램의 흐름을 기술해 줍니다. 이것은 프로그램이 차례대로 수행해야 할 동작들을 쭉~ 나열하는것인데, 간단히 그냥 함수들을 차례대로 호출해주는거죠. 그리고 함수를 호출할때에는 변수를 인자로 넘겨주거나, 아니면 함수가 실행되고 난 뒤에 나오는 데이터를 변수에 저장하거나 하는 방법을 택합니다.
이런식으로 C 언어를 한번 살펴보면, "연산" 은 함수라는 것을 통해서 만들어져 있고 "데이터"는 변수라는 것을 통해서 만들어져 있습니다. 즉, 연산과 데이터가 따로 분리되어 있다는 뜻이지요. 그리고 또 C 언어에서는 "데이터"보다는 "연산"이 더 중요하게 취급됩니다. 데이터야 변수 몇개 선언하고 값 대입하는것으로 끝난다지만, 함수를 설계하고 구현하는 연산은 그렇지 않지요. C 언어에서 함수의 설계는 프로그램의 생사를 좌우할 만큼 중요하게 취급됩니다.
바로 이것이 "구조지향적 프로그램" 입니다. 데이터와 연산을 분리하고, 데이터보다는 연산에 더 비중을 두었으며, 대신 데이터는 구조체 라는 특수한 형태를 사용하여 구조화시킬 수 있는 언어지요. 대표적인 구조지향적 프로그래밍 언어가 바로 C 언어입니다.

그럼 이번엔 관점을 좀 달리 해보겟습니다. 위에서 "모든 프로그램에는 데이터와 연산이 존재한다"고 했는데, 우리는 여기서 하나의 개념을 더 만들어볼 수 있습니다. 데이터와 연산을 모두 포함하는 이 커다란 개념은 바로 "객체"입니다. 객체라는 개념은 아주 추상적이지만, 그 안에는 데이터와 연산이 모두 포함되어 있습니다. 데이터와 연산을 따로 구분하는것이 아니라, 아예 객체라는 하나의 큰 틀에 모두 포함시켜버리는거죠. 그러면 데이터니 연산이니 하는 복잡한 문제들은 생각하지 않아도 되고, 오직 하나 "객체"라는 것만으로 모든 프로그램이 가능해집니다. 한 객체 안에는 그 객체의 특성과 관련된 변수들이 선언되어 있고, 또 그 변수들을 가공하기 위한 함수들이 선언되어 있습니다. 한 객체 안의 변수는 그 객체 안의 함수에 의해서만 가공될 수 있고, 그리고 객체 자체를 가공하거나 객체끼리의 연산도 가능합니다. 확실한건, "객체" 라는것 하나만으로 데이터와 연산을 모두 포함할 수 있다는거고, 그점으로 인해서 데이터와 연산을 따로 생각해야 했던 구조지향적 프로그래밍에 비해 훨씬 편리한 프로그래밍이 가능해진다는겁니다. 바로 이런 프로그램을 가르켜서 "객체지향적 프로그램"이라고 합니다. 구조지향적 프로그램과는 상대되는 의미지요. 대표적인 객체지향적 프로그래밍 언어로는 C++ 이나 Java 를 들 수 있겠습니다.

그리고 또 하나 "절차지향적(절차형) 프로그램"이라는 것이 있고, "선언지향적(선언형) 프로그램"이라는 것이 있습니다. 절차지향적 언어는 보통 접할 수 있는 모든 언어가 다 절차지향적 언어에 해당됩니다. C 언어, C++ 언어, Java 언어, PHP 언어, Perl 언어, Python 언어, 쉘 스크립트, 등등.. 거의 모든 언어가 절차지향적 언어입니다. 절차지향적 언어의 특징을 살펴보자면 "프로그램이 해야 할 동작들을 차례대로 나열한다"는 겁니다. 가령 사용자에게 두개의 수를 입력받아서 그 합을 출력하는 프로그램을 작성한다고 해 봅시다. 그러면 C 언어로는 scanf() 함수를 두번 호출하고 산술연산을 한번 한 뒤, printf() 함수를 한번 호출하면 될 것입니다. 프로그램이 동작해야 하는 과정을 하나씩 차례대로 나열하면 되는것이죠. 이번엔 C++ 언어로 작성하는 경우를 볼까요. 우선 하나의 객체를 만듭니다. 이 객체 안에는 2개의 변수가 있고, 2개의 함수가 포함되어 있습니다. 2개의 변수는 사용자가 입력한 값을 저장하기 위한 변수이고, 첫번째 함수는 사용자로부터 어떤 값을 입력받아서 변수에 저장하는 함수, 또 하나는 두 변수의 합을 출력하는 함수입니다. 그 객체를 사용하여 사용자에게 2개의 숫자를 입력받고, 그 함을 출력해줄 수 있을 것입니다. C++ 언어는 객체지향적 프로그래밍 언어이므로 C 언어와는 동작방식이 조금 다르긴 합니다만, 어쨌든 프로그램이 해야 할 일을 차례대로 나열해야 한다는 점에서는 변함이 없습니다. 이런 방식을 "절차지향적 프로그램"이라고 합니다.
반면 "선언지향적 프로그램"이라는 것은, 절차지향적 프로그램처럼 복잡한 문제를 해결하기 보다는, 보다 간단하고 단순하지만 논리구조가 분명한 곳에서 사용됩니다. 가장 대표적인 예로는 XML 과 SQL 이 있겠습니다. SQL 과 XML 은 선언지향적 언어입니다. 선언지향적 언어의 가장 큰 특징이라하면 "연산(method)에 대해서는 전혀 신경쓸 필요 없다"는 것입니다. 컴퓨터가 수행하는 일련의 동작들은 이미 정의되어 있고, 프로그래머는 그 정의된 동작을 가지고 데이터를 다루기만 하면 됩니다. 가령 SQL 에서 "SELECT * from table;" 이라는 문장은 SELECT 라는 정의된 동작을 지시하는 문장입니다. 또한 XML 에서 "<xsl:value-of select='Int'>" 라는 문장은 <value-of> 라는 정의된 동작을 지시하는 문장이지요. 이런 언어들에서는 SELECT 가 어떻게 동작하는지 전혀 알 필요가 없으며, <value-of> 가 어떻게 동작하는지 전혀 신경쓸 필요가 없습니다. 그저 SELECT 라는 것이 있고, 어떤 기능을 수행한다는 것만 알면 그것을 가지고 데이터를 처리할 수 있는 것입니다. 이런 형태가 바로 "선언형 프로그램"이 되겠습니다.

june8th의 이미지

절차 지향적 프로그램은 문제 해결을 위해서 무엇무엇을 하면 되겠구나. 생각하고, 그것을 줄줄 적으면 됩니다.
OO로 생각한다는 것은 문제 해결을 할 객체를 하나 생각하고, 그 녀석이 어떤 입력에 어떻게 반응을 하면, 문제가 해결 될 것인지 적으면 됩니다.

예를 들어,
ftp서버를 절차지향적으로 프로그램으로 해결하려고 한다면, 일단
프로그램이 시작해서, 포트를 열고, 들어오는 것을 accept해서 날아오는 구문을 쪼개서 적당한 처리를 하고 닫는 것을 반복하면 된다. 라는 생각의 흐름으로 프로그램을 짜게 될테고,
OO로 생각한다면, ftp서버는 서버 소켓을 하나가지고 있다. 그리고, 클라이언트의 연결을 가지게 된다. 라고 생각을 하는 거죠. 그리고, 서버 소켓은 연결이 하나들어올때 마다 클라이언트 연결을 하나씩 만드는 것이고, 그 연결은 문장이 한 줄 들어올 때마다, 하나의 명령을 만들어 내는 것이다. .. 이렇게 생각을 해 나가게 되지요..

짧게 설명하려 했는데. -_-;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.