Search
Duplicate
😒

C로 객체지향 프로그래밍이 된다고요?

간단소개
C++/자바로 하면 객체지향 프로그래밍이 아닌가요?
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
개발지식
Scrap
태그
프로그래밍 패러다임
객체지향 프로그래밍
절차지향 프로그래밍
구조적 프로그래밍
비구조적 프로그래밍
9 more properties

네, 됩니다!

C는 절차지향 프로그래밍 언어인데요?

C가 객체지향 프로그래밍 언어는 아닙니다.
문법적으로 객체지향 프로그래밍을 지원하지 않습니다. ( = 도와주지 않습니다. )
someObject.someMethod("Hello world!");
Java
복사
객체지향 프로그래밍 문법/기능을 활용한 예시
C++이나 자바 등의 언어에서는 이렇게 쓸 수 있는 것을, C로 한다면 이렇게 됩니다.
someObject.vtable->someMethod(&someObject, "Hello world!");
Java
복사
객체지향 프로그래밍 예시
언어 차원에서 지원해주지 않을 뿐, 충분히 가능합니다.

C++이나 자바를 쓰면 객체지향 프로그래밍인가요?

객체지향 프로그래밍 언어는 언어 차원에서 객체지향 프로그래밍을 지원할 뿐입니다.

비구조적 프로그래밍 언어, 어셈블리

대표적으로 절차지향 프로그래밍이 아닌, 비구조적 프로그래밍 언어로 어셈블리가 있습니다.
cmp eax,3 je anywere ; anywere로 점프! anywere가 어디 있을까요? 아무도 몰라요. mov eax,999
Lisp
복사
아무 곳에서나 아무 곳으로나 점프할 수 있습니다.
if나 비슷한 구조적 프로그래밍 문법을 지원하지 않습니다.

어셈블리로 구조적 프로그래밍?

하지만 그와 관련해 구조적인 규칙을 만든다면, 그리고 그를 지킨다면 구조적 프로그래밍입니다.
if/while같은 전형적인 구조를 정의하고, 그 구조에 맞지 않는 점프를 사용하지 않는 식으로요.
je my_if_skip ; if라는 문법은 없지만, if라면 아래 어딘가 있겠네요 mov eax,999 my_if_skip:
Lisp
복사
실제로 C의 콜 스택과 같은 개념을 사용해 어셈블리로도 함수를 만들어서 사용합니다.
비구조적 프로그래밍 언어임에도 불구하고 절차적 프로그래밍을 하고 있는 것이죠!

구조적/절차적 프로그래밍 언어, C

C는 구조적 프로그래밍이 편하도록 if/while 등의 구조를 언어 차원에서 문법적으로 지원합니다.
그리고 더 나아가 절차적 프로그래밍이 편하도록 함수를 언어 차원에서 문법적으로 지원합니다.

C로 비구조적 프로그래밍??

하지만 마찬가지로 C에서도 goto를 통해 아무 곳에서나 아무 곳으로 점프할 수는 있습니다.
함수나, if/while 등의 기능이 있는데도 goto를 남발한다면, 그건 비구조적 프로그래밍입니다.
int main(void) { loop_start: puts("Hello world!"); goto loop_start; // 반복문이 있는데 굳이? }
C
복사

결론

그 언어에 객체지향 프로그래밍 관련 기능이 있는지와는 별개로, 객체지향적으로 짜지 않는다면...
객체지향 프로그래밍 언어를 사용하더라도 그건 객체지향 프로그래밍이 아닙니다.