24.01.12 TIL - [C#] 기초 (1) : 객체 지향 프로그래밍

JJwoo·2024년 1월 12일
0

C#

목록 보기
1/20

C# : 객체 지향 프로그래밍 언어, 안전하고 형식이 분명

C#을 공부하기에 앞서 객체 지향이란 말을 처음 들었을 때 든 생각은 딱 하나다.

객체 지향이 뭔데...?

그래서 알아보았다.

👨‍👧‍👧 객체지향 프로그래밍

object-oriented programming(OOP)

명령형 프로그래밍의 한 분류로 프로그래밍을 더 쉽게 할 수 있기 위해 만들어진 개념, 프로그램 설계 방법, 패러다임

프로그램을 객체(object)라는 기본 단위로 나누고 객체들 간의 상호작용을 통해 프로그램의 기능을 유기적으로 수행.

절차 지향(아래 참조) 언어의 단점을 보완하기 위해 등장.

큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식 해결법.

객체를 일단 한번 독립성/신뢰성이 높게 만들어 놓기만 하면 
그 이후엔 그 객체를 수정 없이 활용이 가능하기에 개발 기간과 비용 절감

예를 들어, 절차 지향 프로그래밍에서는 프로그램이 순차적인 절차를 따르는 반면, OOP(객체 지향)는 데이터와 기능을 객체 단위로 묶어서 보다 유연하고 모듈화된 방식으로 접근

코드의 재사용성, 유지보수성, 확장성을 향상시키는 장점이 있지만, 때로는 설계가 복잡해지거나 처리 속도가 저하될 수 있는 단점도 있다.

Java, C++, Python, C# 등이 객체 지향 프로그래밍을 지원


1. 캡슐화

  • 데이터(변수)와 이를 처리하는 함수(메서드)를 하나의 객체로 묶어서, 객체의 세부 구현을 외부로부터 숨기는 방법

  • 객체의 내부 구조를 외부의 간섭으로부터 보호하고, 외부 코드의 잘못된 사용으로부터 객체를 안전하게 보호하기 위함.

2. 정보 은닉

  • 객체의 세부 사항을 숨기고, 접근 제어자(public, private, protected)를 통해 데이터와 메서드에 대한 접근을 제한한.

  • 이는 객체의 무결성을 유지하고 외부로부터 데이터를 보호하기 위해 필요

3. 상속

  • 한 클래스의 속성과 메서드를 다른 클래스가 이어받을 수 있게 하는 메커니즘.
  • 코드의 재사용성을 높이고, 중복을 최소화하여 효율적인 코드 관리를 가능하게 하기 위해 사용

4. 다형성

  • 같은 이름의 메서드가 다른 클래스에서 다양한 형태로 구현되어 동일한 인터페이스에 대해 다른 행동을 수행할 수 있게 합니다.

  • 이는 프로그램의 유연성을 증가시키고, 코드의 수정 없이 새로운 기능을 추가하거나 변경하기 위해 필요함.

각각의 개념은 객체 지향 프로그래밍을 통해 소프트웨어의 구조와 설계를 개선하고, 유지보수와 확장성을 향상시키는 데 중요한 역할이다.


📑 절차 지향

Procedural Programming

초기의 프로그래밍 방식.

유기적으로 연결되어 있어 순차적인 처리, 순서에 따라 처리되어 이해하기 쉬움. (처리 속도도 빠름)

간단하게 설명하고 넘어가서 이 정도지만, 조금 더 절차 지향에 대해 찾아보니 스파게티 코드 라는 것을 알게 되었다.

🥨 스파게티(spaghetti) 코드

구글링 해보니 대충 프로그램의 진행 로직이 복잡하게 뒤엉켜있는 모습이 마치 스파게티와 같아서 저리 부르나 보다.
참 재미있다.

물론 당연히 좋은 의미는 아니다.

겉으로 보기에는 멀쩡하나 유지보수가 어렵고
이로 인해 버그를 찾거나 코드를 변경, 수정하는 것도 어렵고
답이 없어서 아예 다시 만드는 경우도 있다고 하니..

대체적인 원인은 프로그래머의 구현 능력 부족, 인력 교체시 인수인계 부족.

함수/메서드가 여러 작업을 한다거나 (하나의 함수/메소드에서는 논리적으로 구분되는 가장 작은 단위의 작업을 처리하는 게 이상적이라 함.)

반대로 잘 이루어진 하나의 작업 단위를 억지로 분리 한다던가, 여러 함수/메서드 들이 과하게 이어져 엮여있다면 or if-else문이 과하게 얽혀 있다거나 하는 식.

한 마디로..

				                                           그거 나잖아?

⚖️ 절차지향 vs 객체지향 비교


구분절차 지향 프로그래밍객체 지향 프로그래밍 (OOP)
기본 구조함수 또는 절차의 연속으로 프로그램 구성, 순차적 실행데이터와 기능을 객체로 묶음. 서로 상호작용하는 객체들로 프로그램 구성
접근 방식하향식 (Top-Down) - 큰 문제를 작은 부분으로 나눔상향식 (Bottom-Up) - 작은 부분(객체)부터 시작해 전체 시스템 구축
주요 특징구현의 단순성, 순차적 접근. 작은 프로그램에 적합캡슐화, 상속, 다형성. 코드 재사용과 유지보수 용이
장점과 단점구현 단순, 처리 속도 빠름. 큰 시스템에서 유지보수 및 재사용성 낮음복잡한 시스템 관리 용이, 확장성 뛰어남. 설계 복잡 및 처리속도 느릴 수 있음
적합한 사용 사례작은 스크립트, 단일 기능 프로그램에 적합대규모 소프트웨어 시스템, 사용자 인터페이스, 게임 개발 등 복잡한 시스템에 적합



이제 C#을 알아보자.

🖥 C#

마이크로소프트에 의해 개발되고 .NET 프레임워크와 긴밀하게 통합된 고급 프로그래밍 언어.
2000년대 초에 안드레스 하일스베르그가 주도하여 설계.

1) 개발 배경

1. 객체 지향 프로그래밍 지원

  • C#은 객체 지향 개념을 기반으로 개발 되었으며, 소프트웨어의 모듈성, 유지 보수성 및 확장성을 향상시키는 데 중요한 역할을 한다.
  • 캡슐화, 상속, 다형성 등의 개념을 사용하여 개발자가 보다 강력하고 유연한 소프트웨어를 설계할 수 있게 하였다.

2. NET 플랫폼과의 통합

  • 마이크로소프트는 .NET 플랫폼을 개발하면서, 이 플랫폼을 위한 주력 프로그래밍 언어로 C#을 설계했다.
  • NET 플랫폼은 다양한 애플리케이션 개발을 위한 강력한 프레임워크를 제공하며, C#은 이 플랫폼의 강점을 최대한 활용하도록 설계 되었다.

3. 현대적 프로그래밍 요구사항 충족

  • C#은 현대의 소프트웨어 개발 요구사항을 충족하기 위해 설계되었으며, 이러한 요구사항에는 강력한 타입 시스템, 간결하고 읽기 쉬운 문법, 메모리 관리(가비지 컬렉션), 네트워크 통신, 다중 스레딩 지원 등이 포함 됨.

4. 유연성과 접근성

  • C#은 다양한 유형의 애플리케이션 개발에 적합하도록 설계되었습니다. 이는 데스크톱 애플리케이션, 웹 애플리케이션, 클라우드 서비스, 게임 개발 등 다양한 분야에서의 활용을 가능케 한다.

5. 개발자 커뮤니티와 지원

  • 마이크로소프트는 C# 및 .NET 플랫폼에 대한 강력한 지원과 지속적인 업데이트를 제공한다.
  • 전 세계적으로 활발한 개발자 커뮤니티를 보유하고 있어, 광범위한 지원과 자료를 쉽게 접할 수 있다.

2) 주요 장점

1. 객체 지향 프로그래밍 지원

  • C#은 객체 지향 언어로, 캡슐화, 상속, 다형성과 같은 핵심적인 객체 지향 개념을 지원한다. 이를 통해 개발자는 모듈화, 유지보수, 코드 재사용성이 용이한 소프트웨어를 개발할 수 있다.

2. 안정적이고 강력한 형식의 명확성

  • 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입의 안전성과 정확성을 보장한다. 이는 개발 중 타입 관련 오류를 줄이고 코드의 가독성 및 유지보수성을 향상시킨다.

3. 가비지 컬렉션

  • C#은 자동 메모리 관리 기능인 가비지 컬렉션을 제공한다. 이는 더 이상 사용되지 않는 메모리를 자동으로 회수하여 메모리 누수를 방지하고, 메모리 관리를 단순화한다.

4. .NET 프레임워크 통합

  • C#은 .NET 프레임워크와 긴밀하게 통합되어 있어, 광범위한 라이브러리와 API, 개발 도구의 이점을 활용할 수 있다. 이를 통해 다양한 유형의 애플리케이션을 효율적으로 개발할 수 있다.

5. 크로스 플랫폼 지원

  • .NET Core를 사용함으로써 C#은 윈도우, 맥, 리눅스 등 다양한 플랫폼에서 실행될 수 있다. 이는 애플리케이션의 이식성과 접근성을 크게 향상시킨다.

6. 강력한 IDE 지원

  • C#은 Visual Studio와 같은 강력한 통합 개발 환경(IDE)를 지원한다. 이는 개발자에게 디버깅, 코드 완성, 프로젝트 관리 등의 편리한 기능을 제공한다.

7. 활발한 커뮤니티와 지원

  • C#은 전 세계적으로 활발한 개발자 커뮤니티를 가지고 있으며, 다양한 학습 자료, 라이브러리, 프레임워크가 지속적으로 개발 및 공유되고 있다.

C#이나 객체 지향이 뭔지 궁금해서 찾아 보며 정리해보았는데,

이 후 개념은 빠른 학습을 위한 문법 공부 위주로 해야 할 듯 하다.

profile
개발 모코코

0개의 댓글