<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programming on 0AndWild_log</title><link>https://0andwild.com/series/programming/</link><description>Recent content in Programming on 0AndWild_log</description><generator>Hugo -- gohugo.io</generator><language>ko-KR</language><lastBuildDate>Wed, 31 Aug 2022 20:02:58 +0900</lastBuildDate><atom:link href="https://0andwild.com/series/programming/index.xml" rel="self" type="application/rss+xml"/><item><title>객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보자</title><link>https://0andwild.com/posts/220831_about_oop/</link><pubDate>Wed, 31 Aug 2022 20:02:58 +0900</pubDate><guid>https://0andwild.com/posts/220831_about_oop/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post 객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보자" /&gt;&lt;h2 id="객체지향oop과-절차적-프로그래밍pp"&gt;&lt;a href="#%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5oop%ea%b3%bc-%ec%a0%88%ec%b0%a8%ec%a0%81-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8dpp" class="header-anchor"&gt;&lt;/a&gt;객체지향(OOP)과 절차적 프로그래밍(PP)
&lt;/h2&gt;&lt;p&gt;객체지향언어와 절차지향언어는 &lt;strong&gt;절대 반대되는 개념이 아니다&lt;/strong&gt;. 그렇다면 객체지향언어와 절차지향언어는 무엇인가?&lt;/p&gt;
&lt;p&gt;우리는 보통 Java, Python, C# 등의 언어를 객체지향 언어라고 부르며 C언어는 절차지향언어라고 부른다. 하지만 어디까지나 이 언어들이 &lt;strong&gt;지향&lt;/strong&gt;하는 것이지 C언어는 절차적 프로그래밍만 가능하고 Java나 Python 등은 객체적 프로그래밍만 가능하다는 것이 아니다.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;어떤 언어를 사용하든 상관없이 절차지향적 프로그래밍을 할 수 있다. 반대로 C언어를 사용하더라도 객체지향적으로 코딩을 할 수 있는 것이다.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="절차지향이라는-용어의-오해"&gt;&lt;a href="#%ec%a0%88%ec%b0%a8%ec%a7%80%ed%96%a5%ec%9d%b4%eb%9d%bc%eb%8a%94-%ec%9a%a9%ec%96%b4%ec%9d%98-%ec%98%a4%ed%95%b4" class="header-anchor"&gt;&lt;/a&gt;&amp;lsquo;절차지향&amp;rsquo;이라는 용어의 오해
&lt;/h2&gt;&lt;p&gt;사실 &lt;strong&gt;절차지향적 언어&lt;/strong&gt;라 하는 것은 잘못된 것이다. 모든 프로그래밍 언어가 절차를 기반으로 두고 있는데 절차를 지향한다는 말은 앞뒤가 맞지 않는다.&lt;/p&gt;
&lt;p&gt;하나의 예를 비유하자면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;역도라는 스포츠는 바벨을 이용한 운동을 &lt;strong&gt;기반&lt;/strong&gt;으로 하는 것인데 바벨을 &lt;strong&gt;지향&lt;/strong&gt;하는 스포츠라고 하는 것과 같은 맥락이다.&lt;/li&gt;
&lt;li&gt;그럼 역도를 덤벨로 해야 하나&amp;hellip;?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다시 말해 &lt;strong&gt;절차지향&lt;/strong&gt;이 아닌 &lt;strong&gt;절차적 프로그래밍&lt;/strong&gt;이 맞는 것이다.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;객체지향 프로그래밍(OOP)와 절차적 프로그래밍(PP)는 어디까지나 프로그래밍을 하는데 있어 &lt;strong&gt;접근 방식의 차이&lt;/strong&gt;가 있을 뿐 반대 개념은 아니다!&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="핵심-차이점"&gt;&lt;a href="#%ed%95%b5%ec%8b%ac-%ec%b0%a8%ec%9d%b4%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;핵심 차이점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;절차적 프로그래밍&lt;/strong&gt;: 데이터를 중심으로 함수를 만들어 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;객체지향 프로그래밍&lt;/strong&gt;: 데이터와 기능(함수)들을 묶어 하나의 객체로 만들어 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="절차적-언어와-객체지향언어를-구분하는-기준"&gt;&lt;a href="#%ec%a0%88%ec%b0%a8%ec%a0%81-%ec%96%b8%ec%96%b4%ec%99%80-%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5%ec%96%b8%ec%96%b4%eb%a5%bc-%ea%b5%ac%eb%b6%84%ed%95%98%eb%8a%94-%ea%b8%b0%ec%a4%80" class="header-anchor"&gt;&lt;/a&gt;절차적 언어와 객체지향언어를 구분하는 기준
&lt;/h2&gt;&lt;p&gt;여러가지 방식이 있겠지만 큰 틀에서는 아래와 같이 나뉜다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;캡슐화, 다형성, 클래스 상속을 지원하는가?&lt;/li&gt;
&lt;li&gt;데이터 접근 제한을 걸 수 있는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;대게 위 기준을 만족하면 &lt;strong&gt;객체지향 성향이 강해진다&lt;/strong&gt;고 보면 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="절차적-프로그래밍"&gt;&lt;a href="#%ec%a0%88%ec%b0%a8%ec%a0%81-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d" class="header-anchor"&gt;&lt;/a&gt;절차적 프로그래밍
&lt;/h2&gt;&lt;p&gt;절차적 프로그래밍은 말 그대로 &lt;strong&gt;절차적&lt;/strong&gt;으로 코드를 구성한다는 것이다.&lt;/p&gt;
&lt;p&gt;데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적(순서대로) 진행시키는 방식&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="객체지향-프로그래밍"&gt;&lt;a href="#%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d" class="header-anchor"&gt;&lt;/a&gt;객체지향 프로그래밍
&lt;/h2&gt;&lt;p&gt;객체지향 프로그래밍의 경우 기능들을 묶어 하나의 &lt;strong&gt;객체&lt;/strong&gt;로 만든다.&lt;/p&gt;
&lt;p&gt;다시 말하면 각각의 객체를 생성하고 그 객체마다 할 수 있는 행위(기능)들과 데이터를 하나로 묶어주는 것이다.&lt;/p&gt;
&lt;h3 id="예시"&gt;&lt;a href="#%ec%98%88%ec%8b%9c" class="header-anchor"&gt;&lt;/a&gt;예시
&lt;/h3&gt;&lt;p&gt;자동차 호출 서비스를 구현한다고 가정해보자:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;자동차 객체&lt;/strong&gt;: 자동차가 할 수 있는 행위(기능)를 하나로 묶음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;기사 객체&lt;/strong&gt;: 기사가 할 수 있는 행위를 묶음&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;승객 객체&lt;/strong&gt;: 승객이 할 수 있는 행위를 묶음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;각 객체의 메소드나 필드를 호출하면서 서로 간의 상호작용을 통해 알고리즘을 구성하는 방식이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="그럼-어떤-방식이-더-좋은가"&gt;&lt;a href="#%ea%b7%b8%eb%9f%bc-%ec%96%b4%eb%96%a4-%eb%b0%a9%ec%8b%9d%ec%9d%b4-%eb%8d%94-%ec%a2%8b%ec%9d%80%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;그럼 어떤 방식이 더 좋은가?
&lt;/h2&gt;&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;정답은 없다. 필요에 맞게 사용을 하고 자신이 선호하는 스타일을 사용하면 된다.&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="과거의-프로그래밍"&gt;&lt;a href="#%ea%b3%bc%ea%b1%b0%ec%9d%98-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d" class="header-anchor"&gt;&lt;/a&gt;과거의 프로그래밍
&lt;/h3&gt;&lt;p&gt;과거에는 현재처럼 큰 규모의 하드웨어와 소프트웨어가 필요치 않았다. 오래된 언어인 &lt;strong&gt;C, 포트란, 코볼&lt;/strong&gt; 같은 절차적 언어의 대표라 할 수 있는 언어들이 사용되어졌다.&lt;/p&gt;
&lt;h3 id="현대의-프로그래밍"&gt;&lt;a href="#%ed%98%84%eb%8c%80%ec%9d%98-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d" class="header-anchor"&gt;&lt;/a&gt;현대의 프로그래밍
&lt;/h3&gt;&lt;p&gt;현대에 들어서면서 점점 소프트웨어 발전이 빨라졌고 이에 따라 코드들도 복잡해져갔다.&lt;/p&gt;
&lt;p&gt;그러다 보니 복잡한 알고리즘들이 꼬이기 시작했고 작성한 코드를 사람이 읽었을 때 이해하기 힘들거나 이해할 수 없는 &lt;strong&gt;스파게티 코드&lt;/strong&gt;가 되어버린 것이다.&lt;/p&gt;
&lt;p&gt;이러한 문제의 대안으로 &lt;strong&gt;객체지향적 프로그래밍&lt;/strong&gt;이 나온 것이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="왜-객체지향이-우세한가"&gt;&lt;a href="#%ec%99%9c-%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5%ec%9d%b4-%ec%9a%b0%ec%84%b8%ed%95%9c%ea%b0%80" class="header-anchor"&gt;&lt;/a&gt;왜 객체지향이 우세한가?
&lt;/h2&gt;&lt;p&gt;다만 현재 기준 객체지향 프로그래밍이 우세하게 사용되어지고는 있다. 그 이유는:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;복잡한 프로그래밍일수록 절차적 프로그래밍을 사용한다면 코드들이 &lt;strong&gt;꼬이기 쉽다&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;확장성 측면에서도 &lt;strong&gt;유지 보수&lt;/strong&gt;를 할 때 메리트가 떨어진다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="절차적-프로그래밍-장단점"&gt;&lt;a href="#%ec%a0%88%ec%b0%a8%ec%a0%81-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d-%ec%9e%a5%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;절차적 프로그래밍 장단점
&lt;/h2&gt;&lt;h3 id="장점"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;객체나 클래스 생성 없이 바로 프로그래밍&lt;/li&gt;
&lt;li&gt;필요한 기능을 함수로 만들어 복붙하지 않고 호출하여 사용&lt;/li&gt;
&lt;li&gt;프로그램 흐름을 쉽게 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;각 코드들의 끈끈한 우정 때문에 수정이 힘들다 (유기성이 높아 추가, 수정이 힘듦)&lt;/li&gt;
&lt;li&gt;디버그(오류검사)가 힘듦&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="객체지향-프로그래밍-장단점"&gt;&lt;a href="#%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d-%ec%9e%a5%eb%8b%a8%ec%a0%90" class="header-anchor"&gt;&lt;/a&gt;객체지향 프로그래밍 장단점
&lt;/h2&gt;&lt;h3 id="장점-1"&gt;&lt;a href="#%ec%9e%a5%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;장점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;모듈화, 캡슐화로 유지보수가 편함&lt;/li&gt;
&lt;li&gt;객체지향적으로 현실 세계와 유사성에 의해 코드를 이해하기 쉽다&lt;/li&gt;
&lt;li&gt;객체는 그 자체가 하나의 프로그램으로 다른 프로그램에서도 재사용이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="단점-1"&gt;&lt;a href="#%eb%8b%a8%ec%a0%90-1" class="header-anchor"&gt;&lt;/a&gt;단점
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있음&lt;/li&gt;
&lt;li&gt;현실세계와 유사성에 의해 코드를 이해하기 쉽게 만들기 위해 설계 과정에 있어 많은 시간이 들어간다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="정답은-없다-적재적소에-맞추어-사용하자"&gt;&lt;a href="#%ec%a0%95%eb%8b%b5%ec%9d%80-%ec%97%86%eb%8b%a4-%ec%a0%81%ec%9e%ac%ec%a0%81%ec%86%8c%ec%97%90-%eb%a7%9e%ec%b6%94%ec%96%b4-%ec%82%ac%ec%9a%a9%ed%95%98%ec%9e%90" class="header-anchor"&gt;&lt;/a&gt;정답은 없다! 적재적소에 맞추어 사용하자
&lt;/h2&gt;&lt;h3 id="절차적-프로그래밍을-사용하는-경우"&gt;&lt;a href="#%ec%a0%88%ec%b0%a8%ec%a0%81-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d%ec%9d%84-%ec%82%ac%ec%9a%a9%ed%95%98%eb%8a%94-%ea%b2%bd%ec%9a%b0" class="header-anchor"&gt;&lt;/a&gt;절차적 프로그래밍을 사용하는 경우
&lt;/h3&gt;&lt;p&gt;보통 프로젝트 규모가 크지 않고 재사용할 일이 크지 않는 경우에 많이 사용된다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;프로그램 자체가 가벼워짐&lt;/li&gt;
&lt;li&gt;객체지향으로 만드는 것보다 개발시간과 인력도 줄어듦&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="객체지향-프로그래밍을-사용하는-경우"&gt;&lt;a href="#%ea%b0%9d%ec%b2%b4%ec%a7%80%ed%96%a5-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8d%ec%9d%84-%ec%82%ac%ec%9a%a9%ed%95%98%eb%8a%94-%ea%b2%bd%ec%9a%b0" class="header-anchor"&gt;&lt;/a&gt;객체지향 프로그래밍을 사용하는 경우
&lt;/h3&gt;&lt;p&gt;큰 규모의 프로젝트에서 코드들을 재사용해야 한다면 초기 개발비용을 제외하고 객체지향 프로그래밍이 적합하다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;장점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;유지보수 측면에서 안정적&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="마무리"&gt;&lt;a href="#%eb%a7%88%eb%ac%b4%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;마무리
&lt;/h2&gt;&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;오늘은 이렇게 객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보았다.
아직은 깊이있는 내용에 대해서는 알지 못하지만 여러 글들을 찾아보며 객체지향과 절차적 프로그래밍에 대한 큰 틀을 이해하고 넘어가고 다음번에 좀 더 깊이있게 들어가보자 한다!&lt;/div&gt;
&lt;/div&gt;
</description></item></channel></rss>