클래스 설명
제가 썼던 책에서 클래스가 잘 이해가 되지 않는다는 질문이 있어서,
기본 질문, 클래스가 뭐죠 ?
; https://www.sysnet.pe.kr/3/0/1217
간단히 답하려 했지만, 쓰다 보니 이야기가 길어져 아예 독립적인 글로 쓰게 되었습니다. ^^
클래스가 무엇인지 이해하는데는 클래스가 없는 경우를 생각해 보면 쉽습니다. 클래스가 없고 함수 정의만 지원된다면 어떻게 프로그램이 될까요? 예를 들어, 로그를 남기는 프로그램을 하나 만들어 보겠습니다. 일단 디스크에 파일로 남기는 작업을 정의하면,
void LogToDisk() { }
함수의 이름부터 벌써 로그를 남긴다는 것에 대한 의미를 두고 지어야 합니다. 이 상태에서 네트워크 및 화면에 로그를 남기는 기능도 추가해 보면 상황이 좀 더 명확하게 드러납니다.
void LogToDisk() { }
void LogToNetwork() { }
void LogToScreen() { }
실제로 클래스가 지원되지 않던 C언어에서는 저런 식으로 정의를 했었습니다.
C++에서는 그럼 어떻게 바뀔까요? class라는 것을 정의해 하나의 "구심점"을 만들어 사용할 수 있습니다.
class Log
{
void ToDisk() { }
void ToNetwork() { }
void ToScreen() { }
};
어떠세요? 관리하기가 좀 편해진 것 같지 않나요? LogToDisk, LogToNetwork, LogToScreen 함수를 기억하라고 하는 것보다는 Log 클래스 하나만 기억하고 나머지 기능은 그 내부에 있다고 인식시키는 것이 더 직관적입니다.
아직 이것이 충분히 효용성이 없다고 판단되면 여기에 "데이터"를 추가해봐야겠군요. ^^
로그를 기록하기 위해 파일, 네트워크, 화면에 대한 핸들을 C 언어에서는 다음과 같이 정의해야 합니다.
void *pFile;
void *pNetwork;
void *pScreen;
void WriteTextToDisk() { }
void WriteTextToNetwork() { }
void WriteTextToScreen() { }
이렇게 정의하면 pFile, pNetwork, pScreen 변수는 해당 소스코드에 포함된 모든 코드에서 접근이 가능합니다. 게다가 어느 변수가 어디에서 사용되는지 제대로 된 '구심점'이 파악되지 않습니다. 어쨌든 파일의 모든 코드에서 사용하는 것입니다. 심지어 C언어의 경우 extern 예약어를 추가하면 해당 소스코드 뿐만 아니라 프로젝트에 포함된 모든 소스코드의 함수에서 접근하는 것이 가능합니다. 이렇게 되면 개발자들의 머릿속은 혼돈속에 헤매게 됩니다.
하지만 클래스를 이용하면 이런 문제가 간단하게 해결됩니다.
class Log
{
private:
void *pFile;
void *pNetwork;
void *pScreen;
public:
void ToDisk() { }
void ToNetwork() { }
void ToScreen() { }
};
이렇게 정의하면 pFile, pNetwork, pScreen 변수는 외부 코드에서 접근하는 것이 불가능합니다. 오로지 Log 클래스 내에 정의된 메서드에서만 접근이 됩니다. 즉, 데이터를 보호할 수 있기 때문에 클래스만 제대로 정의해 놓는다면 전체적인 프로그램의 기능 조립이 한결 쉬워집니다.
책에서도 썼지만 클래스는 예약어일 뿐 엄밀히 OOP(Object Oriented Programming) 개념으로 봤을 때 타입(Type)이 더 직관적인 단어입니다.
타입은 말 그대로 '형(식)'이죠. 개발자들이 흔히 알고 있는 타입이라면 int, double 등이 있습니다. 그런데 그렇게 형식이 개발 언어에 의해 정해져 버리면 표현의 자유가 없어집니다. 좀 더 '사람의 사고 방식'에 맞는 프로그래밍이 가능해지려면 개발 언어에서 자유롭게 '형'을 정의할 수 있도록 하는 것이 좋습니다.
그래서 나온 대표적인 예약어가 'class'입니다. 아마도 'type'이라는 예약어는 그리 직관적이지 않았나 봅니다. 클래스(또는 형식)을 마음대로 정의할 수 있게 해주는 언어들에는 C++, Java, C# 등이 있습니다.
실제로 OO(Object Oriented)적인 사고방식에 익숙한 사람의 뇌에 형식 정의가 자유로운 OOP 언어들은 좀 더 쉽게 프로그램을 개발할 수 있게 도와줍니다.
예를 들어, 쇼핑몰 사이트를 개발한다면 다음과 같이 대표적인 클래스들을 정의해 놓고 그것들을 조합해 전체 프로그램을 완성할 수 있게 됩니다.
class Product { }
class Consumer { }
class Producer { }
이렇게 클래스는 현실 세계의(사람의 두뇌에서 생각되는 직관적인) 형식을 프로그램 코드로 대응할 수 있게 도와줍니다.
그럼, '인스턴스(instance)'는 또 뭘까요?
"사람"이라는 클래스를 정의해 보면,
class Person
{
}
그 사람이라는 클래스로 찍혀져 나온 개체 하나하나가 인스턴스가 되는 것입니다. 즉, '영희', '철이'와 같은 개체(object)들은 '사람'이라는 클래스에 속한 인스턴스인 것입니다.
혹시 이 정도면 설명이 되었을까요? 사실 이것도 설명만 다를 뿐 책에 모두 있습니다. ^^
이 정도로 클래스에 대한 설명을 마치고 "
기본 질문, 클래스가 뭐죠 ?" 글에 나온 다른 질문에 대해 하나씩 답을 달아 보겠습니다.
질문: VBA만으로는 좀 부족할 것 같은 아쉬움에, 솔직히 좀 짜증도 납니다.
VBA로는 한 줄이면 되는 간결한 작동 코드가..
씨샵 ? 닷넷? 언어로는 열줄은 뭐 가볍게 넘어가더군요..
이게 발전이야 ? 어이구, 아무런 개념도 없는 사람에게..
이게 무슨 날벼락이야..
일단, 공식적으로 Office 2013에서도 여전히 VBA가 지원되고 있기 때문에 현재까지는 부담 없이 쓰시면 됩니다. 물론 나중에는 어떻게 될지는 알 수 없으나 마이크로소프트 입장에서도 그동안 만들어진 VBA의 하위 호환성을 생각하면 쉽게 버릴 수는 없을 것입니다. (물론, 앞날은 알 수 없습니다. ^^)
단지, 닷넷 언어를 아신다면 조금 더 응용력이 높아질 뿐입니다.
VBA로는 한 줄이면 작동하는 코드가 닷넷으로는 열줄이 가볍게 넘는 것은 언어마다의 특성일 뿐입니다. 그렇기 때문에 세상에는 각각의 특성에 따라 사용하는 언어가 다양하게 존재할 수 있는 것입니다. (그러게요. 제발 모든 요구 사항을 만족하는 언어가 나와서 프로그래머들이 하나만 배워도 좋을 날이 오기를 저 역시 간절히 원합니다. ^^)
그리고 여기서 생각을 달리 하실 것이 있습니다. VBA로 한 줄이면 작동하는 이면에는 닷넷과 같은 식의 언어가 만들어 놓은 기반이 있었다는 점입니다. 예를 들어, 엑셀에서 만든 간단한 VBA 매크로를 볼까요?
Sub 매크로1()
Range("B5").Select
ActiveCell.FormulaR1C1 = "5"
Range("B5").Select
With Selection.Font
.Color = -16776961
.TintAndShade = 0
End With
ActiveWorkbook.Save
End Sub
VBA는 저렇게 쉽게 프로그램을 하고 있지만 가령 ActiveCell이라는 것도 Cell이라는 타입(클래스)이 사용된 것입니다. 즉, 위의 VBA로 만든 모든 코드가 클래스를 은연중에 사용하고 있는 것입니다. 만약, 클래스 개념을 엑셀에서 제공하지 않았다면 VBA에서는 다음과 같은 식으로 프로그램을 만들어야 했을 것입니다.
Sub 매크로1()
RangeSelect("B5")
ActiveCell_FormulaR1C1("5")
RangeSelect("B5")
Selection_Font_Color(-16776961)
Selection_Font_TintAndShade(0)
ActiveWorkbook_Save()
End Sub
저런 식으로 함수를 외워야 한다고 하면 VBA가 그다지 쉽게 퍼지지 않았을 수도 있겠지요? ^^
게다가 VBA 자체도 클래스가 있습니다. 잘 사용하지 않았을 뿐이죠.
VBScript/ASP User-Defined Class Objects
; http://classical-asp.blogspot.kr/2011/04/vbscriptasp-user-defined-class-objects.html
지금 당장 C#의 클래스가 낯설다면 VBA의 클래스를 한번 써보시고 C#의 것을 보시면 더욱 쉽게 이해가 되실 것입니다.
질문: 멤버는 또 뭐고 ?
멤버(Member)는 말 그대로 클래스에 소속된 것들을 의미합니다. 다음과 같이 클래스가 정의되어 있다면,
class Person
{
string Name;
int Height;
int Weight;
void Run() { }
}
Name, Height, Weight 속성과 Run과 같은 메서드를 모두 Person 클래스의 멤버라고 합니다.
질문: 씨샵 공부해도 좋을까요(효율적일까요) ?
C# 책을 쓴 사람에게 이런 질문을 하시면 예상되는 답변은 하나입니다. ^^ 그런데, 특히나 질문하시는 분의 경우 다음과 같이 이야기를 하셨는데요.
Windows만 주구장장 사용할 사람이라면
절대로 보아야 할 언어가 아니라는 걸 깨닫는 데
시간이 너마나도 많이 걸렸더군요.. 깨끗이 포기..
확신하건데, 적어도 이런 상황에서의 개발 언어라면 C#만큼 효율이 뛰어난 것은 없습니다. 공부할 만한 가치가 충분합니다.
하지만, 바로 아래의 질문에서 걸리는데요. ^^
질문: 저와 같이 구체적인/협소한 목적을 지닌 초보자가 ?
글의 내용으로 봐서는 지금까지 VBA, AutoHotkey 정도를 만지시고 그 이상 개발 관련한 것에 뛰어들지는 않으실 듯 싶은데 이런 상황이라면 굳이 C#을 배워야 할 이유가 있을까 저도 의문이 듭니다.
C#을 배우는 것은 어찌 보면 '영어'를 배우시는 것과 별반 다르지 않을 수 있습니다. 영어도 해외 여행이나 어쩌다 만나게 될지도 모르는 외국인과 소통할 때 빼고는 실제로 그리 써먹을 만한 경우는 많지 않습니다. 단지, '준비가 된 사람'으로서 '영어'라는 응용력을 하나 갖게 되는 것에 불과하지요.
현재 삶에서 딱히 취미 삼아 배우고 있는 것이 없다거나, 별도로 목표를 두고 공부하시는 것이 없다면 C#을 지금 시기에 배워두시는 것도 좋을 듯 싶습니다. 그렇지 않은 경우라면, 책을 덮으시고 ^^ 좀 더 우선 순위가 높은 것에 집중하시는 것이... 좋겠고.