- C++ 과 C# 의 차이점 정리

1) C# 정의 및 장점

마이크로소프트에서 C++ 는 Naive Language 라 하고, C# 을 Managed Language 라고 표현한 것을 읽은 적이 있다. 분명 C# 은 개발자 입장에서 더 강력한 기능을 손쉽게 제공하고, 또 버그가 날 가능성을 줄여주는 파워풀한 현대적인 개발언어임에는 분명하다.

2) C# 단점

하지만 글에서 언급한 것과 같이 컴파일 한 바이너리가 커지는 문제, C++ 에 비해 느린 실행속도 등을 고려해 볼때 임베디드 시스템 개발용 언어로는 부적합 하다고 생각된다. 아무리 임베디드 시스템의 하드웨어 성능이 점점 좋아지고 있다고 해도... 리소스를 1byte 라도 절약하고 속도를 1milli sec 라도 줄여야 하는 상황에서 소프트웨어 개발 레벨에서 부터 이런 방식으로 리소스를 갉아먹는 건 매우 좋지 않다고 본다.

3) 개발자 생각

내가 아는 어느 팀에서는 임베디드 시스템의 OS 로 Windows CE 를 쓰고, 개발 언어로 C# 을 쓰는데, 여러가지 고민 끝에 선택한 결과겠지만, 내가 볼때 이 결정은 개발자가 편할수는 있지만 소비자나 회사의 입장에서는 불리하다고 판단된다.

4) Windows CE 장점

Windows CE 라는 플랫폼 자체가 제품 당 OS 라이센스를 지불해야 하는 금전적 부담이 있으며, Windows CE 가Linux 에 비해 갖는 장점은 개발자에게 친화적이고 소프트웨어 호환성이 좋다는 점 등인데, 진지하게 원가를 고려해 보고, 또 소프트웨어 변화가 적은 임베디드 환경을 생각해 본다면 좀 힘들더라도 Linux 에서 사용자가 편리한 UI 를 개발해서 서비스 하는 것이 맞다고 생각된다.

5) C++, C# 비교

개발언어 역시 마찬가지로, C# 으로 개발을 하게 되면 개발자 입장에서 최신 언어를 사용한다는 만족감과 개발의 편리성은 증대되겠지만 제품 입장에서 보면 리소스와 퍼포먼스 측면에서 손해를 보게 된다. 추가로, 디바이스 드라이버나 연동부분의 legacy code 는 대개 C/C++ 로 되어 있어 호환성에도 문제가 생기게 된다.

6) 결론

결론은... 상용화 과제에 있어서는 개발자가 유리한 방향으로 개발을 해서는 안되고 사용자가 유리한 방향으로 개발이 진행되어야 하는데... 그것이 사실 쉽지 않다. 사실, 만약 Windows 개발에 익숙한 나에게 Linux 환경에서 개발해야 하는 과제가 주어지면 나 역시 불평 불만이 많을 것이다... ㅋㅋ

사실, 개발 난이도의 증가에 따른 개발비용과 리스크의 증가등도 분명 중요한 고려사항이 될 수 있다. 하지만 기술적인 어려움을 논외로 하고, 비지니스 측면을 진지하게 고려한다면 힘들더라도 항상 사용자 위주로 생각하면서 개발을 해야 할 것이다.


'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
캡슐화  (0) 2009.08.28
상속  (0) 2009.08.28
다형성  (0) 2009.08.28

- TinyOS와 NesC

TinyOS는 미국 UC Berkeley 대학에서 개발된 무선 센서 네트워크를 위한 전용 운영체제 이다.

이름에서도 알 수 있듯이, TinyOS 기반의 프로그램들은 매우 작은 용량의 크기(대부분 30Kbytes 이하)로 컴파일되며, 무선 센서 노드의 일반적인 특징(최소한의 하드웨어, 작은 메모리, 낮은 CPU 성능 그리고 한정된 에너지)를 고려하여 최적화된 운영체제이다. TinyOS는 보다 편리한 프로그램 개발을 위해 클래스 형태의 컴포넌트(Componet) 구조를 가지는 NesC 언어로 구현되어 있다.

- NesC

NesC와 같은 컴포넌트 모델 언어는 여러 개의 컴포넌트 블록(Block)들을 컴파일 시 연결[와이어링wiring)]하여 하나의 애플리케이션 형태로 조합한다. 또한 센서 노드에 올라갈 하나의 애플리케이션을 위해, 꼭 필요한 라이브러리 및 커널 컴포넌트들만을 선택하여 컴파일하기 때문에 매우 효과적으로 코드 크기를 줄일 수 있다. NesC의 문법은 기존에 많이 사용되고 있는 C 언어와 비슷하지만 표 1-1과 같은 차이점이 있다.

표 1-1 NesC의 특징 분석

NesC 특징

형태

컴포넌트 기반

개발

기존 C에 비해 편리함 - 필요한 컴포넌트들만 연결해 주면 원하는 프로그램 작성 가능

동시성 모델 지원 - “Task"와 "H/W Event Handler" 두 스레드(thread) 사용

데이터 경쟁 조건 - 두 종류의 스레드 사이의 선점(preemption)으로 발생할 수 있는 데이터 경쟁 조건(data race condition)을 컴파일 시에 감지 가능

코드크기

매우 작음 - 소규모 임베디드 장비에 최적화

제한점

동적 메모리 없음

컴포넌트는 어려운 개념이 아니고, C++나 자바와 같은 객체 언어에서 사용하는 클래스와 비슷한 의미라고 생각하면 이해하기 편할 것이다. NesC에서 사용하는 컴포넌트 관련 용어들은 표 1-2에 기술되어 있다.

표 1-2 NesC에서 사용하는 용어

용어 및 내용

application

하나 이상의 컴포넌트로 구성되며, 실제 센서노드에서 실행 가능한 하나의 프로그램

interface

2개의 컴포넌트 사이를 연결하기 위해 정의된 포트로, 컴포넌트는 여러 개의 interface를 사용할 수 있으며, 이 interface를 이용하여 command 및 event가 처리된다. 두 컴포넌트 사이의 연결 통로(인터페이스)를 연결하는 것을 와이어링(wiring)이라고 한다.

component

component - NesC application을 구성하는 기본 블록으로, 컴포넌를 정의하는 configuration과 module로 구분된다.

configuration - 하나의 NesC application에 사용되는 컴포넌트들을 선언하고, 이들 간을 연결(와이어링)을 어떻게 정의할 것인가에 대한 기술한다. configuration도 하나의 컴포넌트로서 정의된다.

module - 새로운 컴포넌트의 동작 및 다른 컴포넌트들과의 연동을 실제로 구현하는 곳이다.

- interface 일반적인 형태

interface identifier {

command result_t function_name prototype

event result_t function_name prototype

}

identifier : 이 인터페이스를 제공하는 컴포넌트의 이름을 의미한다.

function_name : 이 인터페이스가 제공하는 함수 이름을 의미한다.

command, event : 인터페이스 형태

인터페이스의 선언형

command

event

command로 정의된 함수는 현 컴포넌트의 module 부분에 구현된 함수로서, 현 컴포넌트를 사용하는 상위 컴포넌트에서 'call' 명령을 통해 호출된다.

event로 정의된 함수는 현 컴포넌트를 사용하는 상위 컴포넌트에 구현되어야 하는 함수로서, 특정 인터럽트나 조건이 만족되었을 경우, 현 컴포넌트가 어떤 정보를 상위 컴포넌트에게 전달하기 위해 'signal' 명령을 통해 호출된다.

- 컴포넌트 일반적인 형태

configuration identifire{

prvoides{

interface interface_name1

}

}

implementation{

components identifierM, com1, com2 ...

interface_name1 = identifierM.interface_name1

identifierM.interface_name2 -> com1.interface_name3

com1.interface_name3 <- identifierM.interface_name2

}

identifier : 선언된 컴포넌트 이름을 의미하며, 그 안에는 현 컴포넌트에서 제공하는 인터페이스(interface_name1)가 선언되어 있다.

implementation : 현 컴포넌트에서 사용할 하부 컴포넌트들(identifierM, com1, com2...)이 차례대로 선언된다. 그 중 identifierM이라는 이름의 컴포넌트는 현 컴포넌트의 실제 구현 부분인 module 파일을 나타내고 있는 것으로 다른 하부 컴포넌트인 com1, com2와 구별된다.

와이어링 : 와이어링은 모듈 사이의 인터페이스 간 연결 방법을 나타내는 것으로, 그들 간의 인터페이스 이름이 같아야 한다. 컴파일 시 인터페이스 함수의 매개변수가 다음 조건에 해당하면 에러가 발생한다.

1. 매개변수가 정수가 아닌 경우

2. 한쪽의 인터페이스만 매개변수를 가진 경우

3. 매개변수 값이 원하는 값보다 크거나 작은 경우

4. 타입이 맞지 않을 경우

일단 와이어링이 되면 인터페이스에 정의된 command, event 함수의 사용이 가능하게 된다.

interface1 = interface2

2개의 interface가 같음을 의미하며, 양쪽 interface가 서로 같은 제공자이거나 사용자인 경우와 한쪽은 제공자이고 다른 쪽은 사용자인 경우를 의미한다.

interface1 -> interface2

interface의 구성 함수가 링크되어 있음을 의미한다. 즉, interface1에서 사용한 함수가 interface2에 구현되어 있음을 나타낸다.

interface1 <- interface2

interface2 -> interface1과 동일한 표기 방법이다.


가) 초기 셋팅
======================================================
            lst.View = View.Details;
            lst.LabelEdit = false;
            lst.CheckBoxes = true; // 삭제시 사용
            lst.FullRowSelect = true;
            lst.GridLines = true;
            lst.Sorting = SortOrder.Ascending;
======================================================

나) 항목 추가
======================================================
ListViewItem item1 = new ListViewItem(i + "_" + "번호");
item1.SubItems.Add(i + "_" + "장소");
======================================================

다) 항목 삭제
체크박스를 이용하였다.
체크한 항목만 삭제해 보장
======================================================
            int i=0;
            int Count;

            ListView.CheckedListViewItemCollection checkedItems = lst.CheckedItems;
            foreach (ListViewItem item in checkedItems)
            {
                Count = lst.CheckedIndices[i];
                lst.Items.RemoveAt(Count);
            }
======================================================

라) 결론
  간만에 컨트롤을 이용해 보았는데 잘 안돼서 혼났다 역시 코딩은 자주해보고 경험을 많이 쌓아야 하는거 같다. 뭐 다른것도 마찬가지 겠지만...

- WinMain()  함수를 통해 윈도우 응용프로그램이 시작된다.
- 사용자의 입력 이벤트는 모두 메세지로 전환된다.
- 윈도우 운영체제는 이벤트에 따른 메시지를 메시지큐에 추가한다.
- 메인 메시지 루프는 메시지 큐에서 메시지를 꺼내서(GetMessage() 함수) 처리(DispatchMessage()함수)하는 핵심코드이다.
- 윈도우 종료 메시지를 처리하면 메인 메시지 루프가 끝나고 응용 프로그램이 종료된다.

발췌 : Visual C++ 2008 MFC 윈도우 프로그래밍

'객체지향언어 > MFC' 카테고리의 다른 글

콤보박스 초기화 부분에서 CString에 안먹는 바람에 애를 먹어서  (0) 2009.09.28
메모리에서 데이터 관리  (0) 2009.08.23
COM의 등장과 용어  (0) 2009.08.21
MFC 책 목록  (0) 2009.08.05
Visual C++ 구성  (0) 2009.07.29

델리게이트에 이런 강력한 기능은 c#만에 매력인거 같다. 만약 이 기능이 없었더라면 우리는 더 많은 코딩을 했을것이다.
아래는 좋은 예이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Client
{
    delegate int IntOp(int a, int b);

    class Program
    {
        public static int Add(int a, int b) { return a + b; }
        public static int Mul(int a, int b) { return a * b; }

        static void Main(string[] args)
        {
            IntOp[] arOp = {Add, Mul};
            int a=3, b=5;
            int o;

            Console.Write("어떤 연산을 하고 싶습니까?(1:덧셈,2:곱셈)");
            o = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("결과는 {0} 입니다.", arOp[o-1](a,b));
        }
    }
}

아래는 책의 나온 내용 입니다~ ㅎㅎ
좋은 예제 인거 같아서 올려 봅니다. 참고하세요.

"익명메서드는 코드를 정의하기는 하지만 일종의 값으로 분류되므로 델리게이트 객체에 대입할 때 제일 끝의 세미콜론을 빼먹지 않도록 주의해야 한다."

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Server;

namespace Client
{
    delegate int dele(int a, int b);

    class Program
    {
        static void Main(string[] args)
        {
            dele d = delegate(int a, int b) { return a + b; };
            int k = d(2, 3);
            Console.WriteLine(k);
        }
    }
}

'객체지향언어 > C#' 카테고리의 다른 글

listview를 이용해 보자  (0) 2009.08.11
델리게이트 - 참조  (0) 2009.08.10
DllImport 어트리뷰트 사용 예제.  (0) 2009.08.10
배틀넷 아뒤와 방제를 가지고 온다.  (0) 2009.08.09
FileWatcher 예제  (0) 2009.08.09

win32 api 함수중 messagebox를 호출하는 예제 입니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

using System.IO; // 파일 스트림 처리
using Microsoft.Win32; // 레스트리 콘트롤

using System.Runtime.InteropServices; // DllImport 어트리뷰트가 정의됨

namespace OpenFile
{
    public partial class Form1 : Form
    {
       
        [DllImport("User32.dll")] // 윈도우 시스템 파일 User32.dll 참조
        public static extern int MessageBox(int hwnd, string lpText, string lpCaption, int uType);

        public Form1()
        {
            InitializeComponent();
        }
       
        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox(0, "Win32 MessageBox 호출", "DllImport 사용하기", 3);

        }

    }
}

'객체지향언어 > C#' 카테고리의 다른 글

델리게이트 - 참조  (0) 2009.08.10
델리게이트 - 익명메소드 예제.  (0) 2009.08.10
배틀넷 아뒤와 방제를 가지고 온다.  (0) 2009.08.09
FileWatcher 예제  (0) 2009.08.09
GetFiles 예제  (0) 2009.08.09
레지스트리 공부하면서 심심해서 만들어 보았습니다.


'객체지향언어 > C#' 카테고리의 다른 글

델리게이트 - 익명메소드 예제.  (0) 2009.08.10
DllImport 어트리뷰트 사용 예제.  (0) 2009.08.10
FileWatcher 예제  (0) 2009.08.09
GetFiles 예제  (0) 2009.08.09
이진파일 저장 예제  (0) 2009.08.08

+ Recent posts