C# : 객체 지향 프로그래밍 언어, 안전하고 형식이 분명
C#을 공부하기에 앞서 객체 지향이란 말을 처음 들었을 때 든 생각은 딱 하나다.
객체 지향이 뭔데...?
그래서 알아보았다.
object-oriented programming(OOP)
명령형 프로그래밍의 한 분류로 프로그래밍을 더 쉽게 할 수 있기 위해 만들어진 개념, 프로그램 설계 방법, 패러다임
프로그램을 객체(object)라는 기본 단위로 나누고 객체들 간의 상호작용을 통해 프로그램의 기능을 유기적으로 수행.
절차 지향(아래 참조) 언어의 단점을 보완하기 위해 등장.
큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식 해결법.
객체를 일단 한번 독립성/신뢰성이 높게 만들어 놓기만 하면
그 이후엔 그 객체를 수정 없이 활용이 가능하기에 개발 기간과 비용 절감
예를 들어, 절차 지향 프로그래밍에서는 프로그램이 순차적인 절차를 따르는 반면, OOP(객체 지향)는 데이터와 기능을 객체 단위로 묶어서 보다 유연하고 모듈화된 방식으로 접근
코드의 재사용성, 유지보수성, 확장성을 향상시키는 장점이 있지만, 때로는 설계가 복잡해지거나 처리 속도가 저하될 수 있는 단점도 있다.
Java, C++, Python, C# 등이 객체 지향 프로그래밍을 지원
데이터(변수)와 이를 처리하는 함수(메서드)를 하나의 객체로 묶어서, 객체의 세부 구현을 외부로부터 숨기는 방법
객체의 내부 구조를 외부의 간섭으로부터 보호하고, 외부 코드의 잘못된 사용으로부터 객체를 안전하게 보호하기 위함.
객체의 세부 사항을 숨기고, 접근 제어자(public, private, protected)를 통해 데이터와 메서드에 대한 접근을 제한한.
이는 객체의 무결성을 유지하고 외부로부터 데이터를 보호하기 위해 필요
같은 이름의 메서드가 다른 클래스에서 다양한 형태로 구현되어 동일한 인터페이스에 대해 다른 행동을 수행할 수 있게 합니다.
이는 프로그램의 유연성을 증가시키고, 코드의 수정 없이 새로운 기능을 추가하거나 변경하기 위해 필요함.
각각의 개념은 객체 지향 프로그래밍을 통해 소프트웨어의 구조와 설계를 개선하고, 유지보수와 확장성을 향상시키는 데 중요한 역할이다.
Procedural Programming
초기의 프로그래밍 방식.
유기적으로 연결되어 있어 순차적인 처리, 순서에 따라 처리되어 이해하기 쉬움. (처리 속도도 빠름)
간단하게 설명하고 넘어가서 이 정도지만, 조금 더 절차 지향에 대해 찾아보니 스파게티 코드 라는 것을 알게 되었다.
구글링 해보니 대충 프로그램의 진행 로직이 복잡하게 뒤엉켜있는 모습이 마치 스파게티와 같아서 저리 부르나 보다.
참 재미있다.
물론 당연히 좋은 의미는 아니다.
겉으로 보기에는 멀쩡하나 유지보수가 어렵고
이로 인해 버그를 찾거나 코드를 변경, 수정하는 것도 어렵고
답이 없어서 아예 다시 만드는 경우도 있다고 하니..
대체적인 원인은 프로그래머의 구현 능력 부족, 인력 교체시 인수인계 부족.
함수/메서드가 여러 작업을 한다거나 (하나의 함수/메소드에서는 논리적으로 구분되는 가장 작은 단위의 작업을 처리하는 게 이상적이라 함.)
반대로 잘 이루어진 하나의 작업 단위를 억지로 분리 한다던가, 여러 함수/메서드 들이 과하게 이어져 엮여있다면 or if-else문이 과하게 얽혀 있다거나 하는 식.
한 마디로..
그거 나잖아?
구분 | 절차 지향 프로그래밍 | 객체 지향 프로그래밍 (OOP) |
---|---|---|
기본 구조 | 함수 또는 절차의 연속으로 프로그램 구성, 순차적 실행 | 데이터와 기능을 객체로 묶음. 서로 상호작용하는 객체들로 프로그램 구성 |
접근 방식 | 하향식 (Top-Down) - 큰 문제를 작은 부분으로 나눔 | 상향식 (Bottom-Up) - 작은 부분(객체)부터 시작해 전체 시스템 구축 |
주요 특징 | 구현의 단순성, 순차적 접근. 작은 프로그램에 적합 | 캡슐화, 상속, 다형성. 코드 재사용과 유지보수 용이 |
장점과 단점 | 구현 단순, 처리 속도 빠름. 큰 시스템에서 유지보수 및 재사용성 낮음 | 복잡한 시스템 관리 용이, 확장성 뛰어남. 설계 복잡 및 처리속도 느릴 수 있음 |
적합한 사용 사례 | 작은 스크립트, 단일 기능 프로그램에 적합 | 대규모 소프트웨어 시스템, 사용자 인터페이스, 게임 개발 등 복잡한 시스템에 적합 |
이제 C#을 알아보자.
마이크로소프트에 의해 개발되고 .NET 프레임워크와 긴밀하게 통합된 고급 프로그래밍 언어.
2000년대 초에 안드레스 하일스베르그가 주도하여 설계.
C#이나 객체 지향이 뭔지 궁금해서 찾아 보며 정리해보았는데,
이 후 개념은 빠른 학습을 위한 문법 공부 위주로 해야 할 듯 하다.