|
2006년 11월 04일
CLS(Common Language Specification) .NET프레임워크의 특징의 하나는 다중언어를 지원한다는 것이다. 이러한 것이 가능한 것은 CLS라는 공개된 규칙이 존재하기 때문이다. 이 규칙을 준수한다면 어떠한 언어라도 동일하게 컴파일된 MSIL(Microsoft Intermediate Language)를 만들어 낼 수 있다. CTS(Common Type System) 마이크로소프트의 .NET프레임워크에서는 많은 프로그래밍 언어를 지원한다. 그러나 Java Virtual Machine(이하 JVM)은 java라는 한 가지 언어만을 지원한다. 사실 어떤 언어라도 Java Byte Code로 생성하여 JVM을 통해 실행 할 수 있는데 썬은 그러한 시도를 하지 않고 있다. 썬의 이러한 전략은 “하나의 프로그래밍언어가 모든 것을 할 수 있다.”는 생각에서 나온 것이다. .NET에서 지원하는 언어는 VB.NET, C#.NET, J#.NET, C++.NET가 있다. 이들 언어로 작성된 프로그램들은 모두 MSIL(Microsoft Intermediate Language)로 변환되어 CLR(Common Language Runtime)에 의해 실행된다. 이러한 것을 프로그래밍 언어의 상호운영성이라고 하는데 이는 .NET에서 지원하는 모든 언어가 동일한 데이터 타입을 갖지 않는다면 이루어 질 수 없다. 예를 들어 int라는 데이터 타입은 VB.NET, C#.NET, J#.NET, C++.NET에서 모두 같은 의미로 정의되어야 한다는 것이다. 모든 데이터 타입에 대해서도 모두 같은 방식으로 정의되어야 하며 이를 가능케 한 것이 바로 CTS이다. CTS는 Java와 마찬가지로 모든 데이터 타입을 클래스로 정의하였다. 이것은 오로지 객체지향언어만이 CTS를 추종할 수 있다는 것을 의미한다. 아래의 표는 CTS가 지원하는 데이터 타입의 리스트이다.
BCL (Base Class Library) Visual C++로 작성한 아래의 코드를 살펴보기로 하자. CView myView; myView.MessageBox("Hello World", ".NET Article", MB_OK); :: MessageBeep(MB_ICONHAND); 첫 번째 줄의 코드는 CView의 객체 myView를 생성하는 코드이다. CView는 MFC에 정의된 하나의 클래스이다. 두 번째 줄의 코드는 다이얼로그 박스를 보여주기 위해 CView의 메쏘드인 MessageBox()를 호출하는 것이다. 다이얼로그박스는 OK버튼을 가지고 있고 “Hello World"라는 메시지를 뿌릴 것이고 다일얼로그 박스의 제목은 ”.NET Article"이라고 보일 것이다. 세 번째 줄의 코드는 MessageBeep()이라는 윈도우 API를 직접 호출하는 코드이다. 메쏘드알의 ::심볼은 API를 직접 호출하는 것을 의미한다. MessageBeep() 시스템에서 정의된 “MB_ICONHAND"파일을 사용하여 적절한 소리를 낼 것이다. 위의 예제에서는 두가지 형태의 함수를 사용하고 있다. 하나는 MFC에서 제공하는 것이고 다른 하나는 O/S가 제공하는 것이다. MFC란 단순히 API를 포함하고 있는 클래스들의 집합이라고 할 수 있다. 똑 같은 프로그램을 Visual Basic으로 작성 하려면 어떻게 해야 할까? Visual Basic에서 MFC와 같은 역할을 하는 것은 VBRun이다. 우리는 VB에서도 VB의 API인 MessageBeep()함수를 사용할 수 있다. 그러나 CView클래스는 VBRun에 존재하지 않는다. CView와 동일한 기능을 하는 함수를 VB에서 찾기위해서는 많은 노력이 필요 할 것이다. 이러한 현상은 다른 프로그래밍 언어 사이에도 존재한다. MFC는 마이크로소프트의 C++을 위한 클래스들 이고, 볼랜드는 그들만의 클래스를 가지고 있고 이는 Java도 마찬가지이다. 이러한 문제점을 해결하기 위하여 .NET에서는 Base Class Library라는 공용의 클래스 라이브러리를 만들었다. BCL은 .NET프레임워크에서 지원하는 모든 언어들이 공통으로 사용할 수 있는 통합된 클래스라이브러리를 제공한다. 다시말하면 MFC, VBRun, WFC와 같은 특정언어에 종속적인 라이브러리를 없애고 BCL이라는 통합 라이브러리를 만들게 된 것이다. BCL에는 수많은 클래스들이 존재하는데 이들은 네임스페이스(Namespace)단위로 묶여져 있다. 자주 사용되는 네임스페이는들의 예를 들면 System, System.Collection, System.Data, System.Drawing등이 있다. # by 한스러브 | 2006/11/04 20:45 | 트랙백
2006년 11월 04일
VB.NET에서의 객체지향 프로그래밍 VB.NET은 JAVA처럼 완벽한 객체지향을 지원한다. VB.NET에서 어떠한 식으로 객체지향프로그래밍이 이루어지는지 예를 들어 살펴보기로 하자. 1-1. 네임스페이스, 클래스, 객체, 모듈 ✱ 네임스페이스 VB.NET에서는 특정한 목적을 가진 클래스나 데이터 구조체들을 네임스페이스의 형태로 묶는다. 프로그래머는 단순하게 네임스페이스를 임포트(Import)함으로써, 네임스페이스의 클래스들을 사용할 수 있다. Imports라는 키워드를 사용하여 네임스페이스를 프로젝트에 임포트 한다. .NET프레임워크는 다양한 네임스페이스를 통하여 많은 클래스들을 지원하고 있다. 본 예제에서는 System이라는 네임스페이스를 사용한다. Imports System ✱ 클래스 우리는 이미 클래스와 객체에 대하여 잘 알고 있다. 간단히 말하자면 클래스는 실생활에 존재하는 객체(Object)의 정의이다. 예를 들면 Human이라는 클래스는 인간을 표현하는 클래스이고, Dog이라는 클래스는 모든 개들을 표현하는 클래스이다. VB.NET에서는 아래의 예처럼 클래스를 정의한다. VB.NET에서의 클래스는 함수(Function), 변수, 속성(Property)등을 포함할 수 있다. Imports System Namespace Animals Class Dog Function Bark() Console.Writeline ("Dog is barking") End Function End Class End Namespace ✱ 객체 객체는 클래스의 인스턴스(사례)이다. 예를 들면 Jimmy는 Dog의 한 개체이다. 클래스란 하나의 틀이고, 이틀을 이용하여 객체를 찍어내어 사용한다고 볼 수 있다. 다음과 같이 객체들을 생성하고 사용한다.. Public Module modMain Sub Main() Dim Jimmy as Animals.Dog Jimmy = new Animals.Dog() Dim Merry as Animals.Dog Merry = new Animals.Dog Jimmy.Bark() ‘ --> Dog 클래스내의 Bark함수 호출 Merry.Bark() End Sub End Module 마치 변수를 선언하듯 Dog이라는 형태의 Jimmy변수와 Merry변수를 선언한다. Animals란 네임스페이스내의 Dog이라는 클래스가 있기 때문에 Animals.Dog이라는 표현을 사용하였다. Jimmy = new Animals.Dog와 Merry = new Animals.Dog에서 객체를 생성한다. ✱ 모듈 앞의 예제에서 우리는 모듈을 이미 사용하였다. 우리는 공통 함수(Function과 Sub)을 작성하기 위하여 모듈을 사용한다. 즉 모듈은 함수들의 집합체이다. public으로 선언된 함수들은 어디서든지 사용될 수 있다. 모듈에 작성된 여러 함수들 중 Main()함수를 제일 먼저 실행한다. 1-2. 접근형식 주된 접근형식으로는 Public, Private, Friend 그리고 Protected가 있다. 앞에서 언급 했듯이 클래스는 함수와 변수 등을 포함할 수 있는데, 우리는 함수와 변수 앞에 접근형식을 선언할 수 있다. 만약 접근형식이 Public으로 선언되었다면, 객체를 생성함으로써 해당 함수나 변수를 사용할 수 있다. Private나 Protected로 선언된 함수나 변수는 클래스 내의 함수들만 사용할 수 있다. Private와 Protected의 다른점은 Protected는 클래스를 상속하면 사용할 수 있다는 것이다. Friend는 동일 프로젝트내에서는 접근이 가능하다. 아래의 예는 Public과 Private의 사용 예를 보여준다. Imports System Namespace Animals Public Class Dog Public AgeOfDog as Integer ‘ --> Public변수 Public Function Bark() ' --> Public 함수 Bark Console.Writeline ("Dog is barking") End Function Private Function Walk() ' --> Private 함수 Walk Console.Writeline ("Dog is walking") End Function End Class End Namespace Public Module modMain Sub Main() ourFunction() Function ourFunction() Dim Jimmy as Animals.Dog Jimmy = new Animals.Dog() Jimmy.Bark '--> Bark가 Public으로 선언되어 있기 때문에 실행된다. Jimmy.AgeOfDog = 10 ‘ --> AgeOfDog이 Public으로 선언되어 있으므로 실행된다. Jimmy.walk ‘ --> walk가 Private로 선언되어 있으므로 오류 발생 End Function End Module 1-3. Shared 함수 클래스내의 Shared멤버는 객체를 생성하지 않고도 사용할 수 있다. Imports System Namespace Animals Public Class Dog Public Shared Function Bark() ' --> Public 함수 Bark Console.Writeline ("Dog is barking") End Function Private Function Walk() ' --> Private 함수 Walk Console.Writeline ("Dog is walking") End Function End Class End Namespace Public Module modMain Sub Main() Animals.Dog.Bark() ‘--> Bark함수가 Shared로 선언되었기 때문에 객체를 생성하지 Dim Jimmy as Animals.Dog Jimmy = new Animals.Dog() Jimmy.walk() ' --> walk는 shared로 선언되지 않았기 때문에 객체생성후 사용 End sub End Module 우리가 지금 까지 사용한 Writeline함수는 Shared함수 이기 때문에 객체를 생성하지 않고 사용할 수 있다. 1-4. 오버로딩 오버로딩이란 동일한 이름을 갖는 함수를 파라미터를 다르게 줌으로써 각각 다른 함수처럼접근할 수 있도록 해주는 기술이다. Imports System Class Adder Overloads Public Sub Add(A as Integer, B as Integer) Console.Writeline ("Adding Integers: " + Convert.ToString(a + b)) End sub Overloads Public Sub Add(A as String, B as String) Console.Writeline ("Adding Strings: " + a + b) End sub Shared Sub Main() Dim AdderObj as Adder AdderObj = new Adder AdderObj.Add(10, 20) AdderObj.Add("hello", " how are you") End sub End Class 위의 예제를 보면 Add라는 이름을 갖는 두개의 함수가 존재하나 각각의 인자(Parameter)가 서로 다르기 때문에 별개의 함수로 인식된다. 오버로딩을 사용하기 위해서는 함수 앞에 Overloads라는 키워드를 사용하여야 한다. Main함수를 클래스 내부에 작성할 때는 Shared키워드를 사용하여 객체를 생성하지 않고 실행될 수 있도록 해 주어야 한다. 1-5 상속 상속이란 프로그램의 재사용성을 높이기 위한 객체지향프로그래밍의 핵심적 기술이다. 다시 말하면 이미 만들어진 클래스를 다시 이용하는 방법을 말한다. 클래스를 상속받은 클래스(Derived Class)는 부모클래스(Base Class)의 속성을 그대로 물려받는다. Imports System Class Human Public sub Walk() Console.Writeline ("Walking") end Sub End Class Class Programmer Inherits Human Public sub Programming() End Sub End Class Class MainClass Shared Sub Main() Dim Tom as Programmer Tom = new Programmer Tom.walk() '--> Programmer클래스가 Human클래스를 상속했으므로 Human클래스의 ‘--> 함수를 이용할 수 있음 Tom.Programming() End Sub End Class 1-6. 오버라이딩 기본적으로 상속받은 클래스는 부모클래스(Base Class)의 함수를 상속 받는다. 상속받은 함수를 재정의 하여 사용할 수도 있는데 이를 오버로딩이라고 한다. Imports System Class Human Overridable Public Sub Speak() Console.Writeline ("Speaking") End Sub End Class Class Korean Inherits Human Overrides Public Sub Speak() Console.Writeline ("Speaking Korean") End Sub End Class Class MainClass Shared Sub Main() Dim Lee as Human Lee = new Human Dim Kim as Korean Kim = new Korean Lee.Speak() Kim.Speak() End Sub End Class 1-7. 생성자(Constructor)와 소멸자(Destructor) 생성자는 객체가 생성될때 자동으로 실행되는 특별한 함수의 하나이다. 생성자도 오버로딩하여 사용할 수 있는데 생성자에서는 Overloads란 키워드를 사용하지 않는다. 소멸자는 객체가 소멸될 때 자동으로 실행되는 특별한 함수이다. Class Dog Private Age as Integer Public Sub New() ' --> 생성자 Console.Writeline ("Dog is created with age zero") Age = 0 End Sub Public Sub New (Val as Integer) Console.Writeline("Dog is Created with age " + Convert.ToString(Val)) Age = Val End Sub Overrides Protected Sub Finalize() ' --> 소멸자 Console.Writeline("Dog is destroyed") End Sub Shared Sub Main() Jimmy = new Dog '--> 디폴트 생성자를 실행 Jacky = new Dog(10) ‘--> 인수를 갖고있는 생성자를 실행 End Sub ‘ --> 프로그램 끝날 때 소멸자 실행 End Class 1-8. 속성(Property) 객체에 정보를 저장하기 위해 속성과 필드를 사용한다. 필드는 단순한 Public변수를 의미하나, 속성은 Get/Set키워드를 사용한다. Imports System Public Class Dog Private AgeOfDog as Integer Public Property Age() As Integer Get Console.Writeline("Getting Property") Return AgeOfDog End Get Set(ByVal Val As Integer) Console.Writeline("Setting Property") AgeOfDog = Val End Set End Property End Class Class MainClass Shared Sub Main() Jimmy = new Dog Jimmy.Age = 30 '--> AgeOfDog변수를 직접 핸들링할 수 없다(Private) 그래서 ‘--> Age() Property루틴을 사용한다. Dim curAge = Jimmy.Age() ‘--> Age Get루틴이 실행된다. End Sub End Class # by 한스러브 | 2006/11/04 20:40 | 트랙백(1)
|