관리 메뉴

새로운 시작, GuyV's lIfe sTyle.

닷넷 게시판 만들기 Part 6 - 지루한 이야기 ㅠㅠ 클래스 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 6 - 지루한 이야기 ㅠㅠ 클래스

가이브 2010. 12. 22. 16:31

2010/11/16 - [ⓟrogramming/.net] - 닷넷 게시판 만들기 Part 1
2010/11/18 - [ⓟrogramming/.net] - 닷넷 게시판 만들기 Part 2
2010/12/08 - [ⓟrogramming/.net] - 닷넷 게시판 만들기 Part 3
2010/12/16 - [ⓟrogramming/.net] - 닷넷 게시판 만들기 Part 4
2010/12/16 - [ⓟrogramming/.net] - 닷넷 게시판 만들기 Part 5

1. 닷넷 개발환경 준비, 테스트
2. 닷넷 알아보기 [4/..]
3. 게시판 글쓰기
4. 게시판 글목록
5. 게시판 글읽기
6. 다듬기


앞 시간에 이어, 메소드에 대해 알아보겠다.

사실, 우리 초보는 메소드를 사용할 일이 많이 없다. 그냥 막코딩으로 결과물만 내면 되니까.(사실이다) 그러나, 메소드를 다뤄야 하는 이유는 "가져다 쓰기 위해"서다. 닷넷에서는 기본적으로 제공하는 많은 클래스가 있다. 클래스에 함수라고 불리는 메소드와 속성이라 불리는 프로퍼티가 있다.

객체지향언어라는 닷넷 및 자바에서는 클래스를 객체(object) 라고 부르며, 이런 따위의 설명을 늘여놓는다.

"자동차"라는 베이스가 있고, 자동차의 종류는 승용차/버스/봉고차 등이 있다. 이런 것들이 기준이 되는 "자동차"를 상속받아 어쩌고 저쩌고...

늘 강조하지만, 우리는 초보라는 강력한 무기를 가지고 있다.
모르면 무식하다고 했던가. 여러분들께 아주 쉽게 사용하는 방법을 알려드리겠다.


Part 4 에서 다음과 같이 설명했었다.

namespace1
{
     class1
     {
             void method1()
             {
                      int property1 = 1;
                      string property2 = "안녕하세요";
             }
            string method2(string str1)
            {
                    return str1.ToUpper();
            }
     }

     class2
     {
     }
}


1. 네임스페이스는 클래스의 묶음이다. (내가 이 녀석을 사용하겠다~ 하고 선언하는 용도)
2. 클래스는 가져다 쓰는 녀석의 기본이다. (가져다 쓰는 용법만 알자)
3. 가져다 쓴 클래스에서 실질적인 기능을 하는 것들의 묶음을 메소드/프로퍼티 라고 한다.
예제와 1,2,3번을 엮어서 머리에 한번 그려보고 넘어가자.

닷넷에서 기본적으로 제공하는 클래스는 아주 많다. 우리가 결과물을 내는 ASP.NET에서도 여러 클래스들을 기본적으로 사용하고 있다. 선언을 하지 않아도 기본으로 선언이 되어 있는 상태이다.

실습을 위해, 기본 시작 파일을 열어보자. (쓰던 default.aspx를 수정)


default.aspx

<%@ Page Language="C#" runat="server" %>
<script language="C#" runat="server">

void Page_Load()
{
}

</script>

프로그램 코딩은, 만들려는 대상이 되는 프로그램이 먼저 정해져야겠다.
이번 메소드(클래스에 포함되었다고 했다) 예제로 우리가 만들 프로그램은 "방문객 카운터"이다. (오늘 몇 명 방문 어제 몇 명 방문 같은..)

실습에 앞서, 다음 페이지를 열어보자.

http://msdn.microsoft.com/library/default.aspx

괴롭지만 달고 사셔야되는 사이트이다. 닷넷을 만든 마이크로소프트에서 공식적으로 제공하는 문서이다. 여기에 모든 클래스가 있고, 메소드가 있으며 프로퍼티가 명세되어 있다. 사용 예제도 포함되어 있으므로 많은 도움이 된다. (이 사이트를 이하 MSDN이라 하겠다.)

좌측의 ".NET 개발" 카테고리를 클릭한다. 버전별 카테고리가 나오게 된다.




2010년 12월 현재 닷넷 프레임워크(이하 닷넷)은 4.0 버전까지 나와있다. ASP.NET은 닷넷 3.5까지 2.0 베이스로 돌렸는데, 4.0에는 4.0 기반으로 돌아간다. (이 강의의 목적인 게시판 만들기는 2.0을 기준으로, 아주 기초적인 구문으로 설명할 것이다. 알아서 공부하시게 될 테니까.)

좌측 카테고리에서 .NET Framework SDK 2.0 을 클릭하고, 그 하위 메뉴중 Class Library Reference를 클릭하자.


위와 같은 화면을 볼 수 있다.

여러분이 클릭한 클래스 사전, 즉 닷넷(2.0)에서 기본적으로 제공하는 클래스의 모음(네임스페이스, namespace)이다. 정말 많다. 우측에는 하나하나 해당 네임스페이스의 설명이 나와있다. 가볍게 읽어보도록 하자.

다시 말하지만, 절대 외울 생각은 말자. 이 페이지가 이제 초보인 우리가 닳도록 들어와야 하는 곳이다. 즐겨찾기에 추가하는 것을 잊지말자. 노력은 결코 배신하지 않는다. 언제나 클래스를 사용할 때마다, 이 클래스에 어떤 메소드가 있는지, 프로퍼티가 있는지를 확인하는 버릇을 들이자.

다시 우리가 만들고자 하는 카운터에 대해..
카운터는 방문객을 누적 저장하는 기능을 한다. 방문객이 올 때마다 카운터는 하나씩 올라가게 된다. (현재 방문객에서 +1)

개발자 입장에서 정리해보자.

1. 방문객이 왔다.
2. 카운터로 계산된 파일을 연다. (Open)
3. 파일에서 카운트를 읽고(Read), 파일을 닫는다. (Close)
4. 읽은 카운트에서 +1을 한다.
5. 누적된 카운트를 파일에 저장(Open, Save) 후, 닫는다. (Close)

잠시 컴퓨터 기초를 조금 생각해보자. 컴퓨터가 무언가를 저장하기 위해서는 무엇을 이용할까? 메모리와 보조기억장치라는 하드디스크,DVD,USB메모리 등을 이용한다. 메모리는 컴퓨터가 꺼지거나, 해당 웹서버가 중단되면 다시 사용할 수 있게 반환되어 기억하고 있는 자료는 삭제된다. 그러므로 우리는 파일들을 하드디스크 등에 주로 넣는다.

카운터도 마찬가지이다. 웹서버가 365일 24시간 아무런 문제 없이 잘 돌아간다고 하면, 귀찮게 파일로 저장하지 않고, 메모리에 넣어두면 된다.

// 초기화
int COUNT = 0;

// 방문객 발생시
COUNT++;
또는
COUNT = COUNT + 1;

// 출력
...

위와 같은 코드처럼 그냥 변수에다가 누적시키고 뿌려주면 될 것이다.
그러나, 웹서버를 재시작할 수 있고, 시스템 오류로 멈춰버릴 수 있으니 정확하고 자료의 누실을 막기위해 파일로 저장하는 것이다. 당연한 말이다.

어떻게 카운터를 만들지 생각해봤으니, 파일처리 관련된 클래스를 찾아서 가져다 쓰는 방법을 알아야겠다. 

아차, 그 전에 화면 디자인(Design)을 먼저 해보자. 단순하게 갔으면 한다. =)


<%@ Page Language="C#" runat="server" %>
<script language="C#" runat="server">
void Page_Load()
{
}
</script>

<html>
<head>
 <title>방문자는?</title>
</head>
<body>
<center><font color="red">392</font> 번째 방문객입니다.</center>

</body>
</html>


default.aspx 파일을 다음과 같이 디자인했다. 결과는, 태그문을 보는 것처럼 예상대로 다음과 같다.



필자나 독자나 똑같은 개발자 아닌가? 만족하며 넘어가도록 하자 (-_-)

어떻게 만들것인지 생각 했고, 디자인까지 나왔으니, 이제 잘 돌아가는 프로그램으로 만들면 되겠다. 

즐겨찾기 해놓은(...? 해놓읍시다!) MSDN 사이트로 다시 이동하자.
"파일처리"에 관련된 네임스페이스를 찾아보자. 우측에 설명이 있으니 Ctrl+F(찾기) 기능으로 본문을 "파일"검색어로 검색해보자.

이십여개 검색 중에 설명문을 잘 보면, 다음을 찾을 수 있을 것이다.

System.IO 데이터 스트림 및 파일에 대한 동기 및 비동기 읽기와 쓰기를 가능하게 하는 형식을 포함합니다.

설명을 읽어보면 좀 난해하다. 대부분 이런 식이다. 용어가 많이 보여서 처음에는 많이 힘들것이다. 그러나 MSDN 참고하는 버릇을 절대 포기하지 말자.

여튼, 저 말을 쉽게 풀이해보자면

"데이터 스트림 및 파일"이라는 것을 "동기,비동기"로 "읽기와 쓰기"를 가능하게 하는 네임스페이스

이렇게 표현할 수 있겠다.

데이터스트림은 우리가 동영상이나 음악을 실시간으로 들을 때, 즉 다운로드 과정중에 보고 하는 것을 "스트리밍"이라는 단어가 익숙할 것이다. 쉽게 "연속적인 데이터"라 생각하자.

동기,비동기는 요즘 많이 사용하시는 스마트폰(필자는 없지만 ㅜㅜ)에서 "동기화한다"라는 말을 많이 쓰는 것 같은데, "동기"는 말 그대로 같이 맞춘다는 말이고, 비동기는 반댓말이다.

가위바위보를 예를 들자. 가위바위보에서 가장 큰 이슈는 무엇인가?

"너 늦게 냈어. 다시다시"

자.. 이게 동기식이다. 상호 합의에 의해 규칙을 맺어서 전송하는 방식이다. 
비동기는, 가위바위보에서 누가 먼저 내든 가위바위보가 성립하면 된다는 의미로 보자.

그럼, System.IO 네임스페이스에 들어있다는 파일 관련 클래스를 한번 살펴보자.
클릭해서 링크로 들어가보면, 해당 네임스페이스에 속한 클래스들이 많이 존재한다. 클래스 이름만 봐도 대충 유추할 수 있는 것들이다. 


그 중 File 이라는 클래스가 있다. 설명을 보아하니 우리가 만들려는 프로그램인 카운터에 적합한 것 같지 않은가?

"System.IO 에 있는 File 클래스를 사용한다" 라고 생각하고 File 클래스 링크 페이지로 들어가보자.
다음 화면을 볼 수 있다.



MSDN의 해당 클래스(메소드,프로퍼티 등 포함) 설명문의 형식을 볼 수 있다. 

개요


구문


설명

파일 복사, 이동, 이름 바꾸기, 만들기, 열기, 삭제 및 추가와 같은 일반적인 작업을 수행하려면 File 클래스를 사용할 수 있습니다. 또한 파일 만들기, 액세스 및 쓰기와 관련된 DateTime 정보나 파일 특성을 가져오고 설정하는 경우에도 File 클래스를 사용할 수 있습니다.

많은 File 메서드가 파일을 만들거나 열 때 다른 I/O 형식을 반환합니다. 이러한 형식을 사용하여 보다 세부적으로 파일을 조작할 수 있습니다. 자세한 내용은 OpenText, CreateText 또는 Create와 같은 특정 File 멤버를 참조하십시오.

모든 File 메서드가 정적이기 때문에 한 작업만 수행하는 경우에는 해당하는 FileInfo 인스턴스 메서드보다 File 메서드를 사용하는 것이 더욱 효율적일 수 있습니다. 모든 File 메서드에는 조작하는 파일의 경로가 필요합니다.

File 클래스의 정적 메서드는 모든 메서드에 대해 보안 검사를 수행합니다. 따라서 개체를 여러 번 다시 사용해야 하는 경우 정적 메서드에 대응되는 FileInfo 인스턴스 메서드를 사용할 수 있으며, 이 메서드는 보안 검사가 필수적이지 않습니다.

기본적으로 모든 사용자에게 새 파일에 대한 모든 읽기/쓰기 권한이 부여됩니다.

..
..
(후략)

설명문을 읽어보면 클래스에서 어떤 것을 하는지, 어떻게 이용해야 하는지 상세하게 설명한다. 닷넷 관련 서적을 집필한 분들도 이 문서를 토대로 바이블을 만들고, 예제를 만든다. 프로그래머들도 마찬가지다.

System.IO 네임스페이스의 File 클래스는 "정적 메소드"이다.
구문을 보자. 우리는 닷넷에서 사용할 수 있는 여러가지 언어 중 C#으로 하고 있다.



public static class File 

static 은 "정적"이라는 말로 불린다. "정적 클래스"는, 네임스페이스 선언시 어디서든 바로 사용할 수 있게 메모리에 얹어놓게 된다. 

그래서 우리는 파일처리를 위한 File 클래스는

System.IO.File.파일관련메소드();
System.IO.File.파일관련프로퍼티();

이렇게 바로 사용할 수 있다.


여기서 잠시, 클래스에 대해 얘기를 해보자.
일반적으로, "클래스는 인스턴스 화" 되어야 한다. (인스턴스(Instance)는 많이 쓰이는 용어이므로 알아놓도록 하자)

인스턴스란, 쉽게 말하면 "클래스를 가져다 사용하기 위해 사용하는 변수"이다.

System.IO.ABC 라는 클래스가 있고, 이 클래스가 앞의 File클래스와 다르게 static 이 아닌 일반 클래스일 때, 이를 이용하기 위해서는 "인스턴스 화"를 해야하는데, 다음과 같이 한다.

System.IO.ABC abc = new System.IO.ABC();

진하게 밑줄친 abc 가 인스턴스 화된 변수이다. 이제 abc라는 이름으로 System.IO.ABC 클래스의 메소드와 속성을 사용할 수 있는 것이다. 즉, 다음과 같이 말이다.

사용할클래스 변수명 = new 사용할클래스();

아주 일반적으로 이렇게 이용한다는 것을 알자. 

System.IO.File 과 같이 static 클래스(정적클래스)는 인스턴스화를 하지 못하며, 할 필요가 없고, 다이렉트로 사용한다고 생각하자.

정리해보자.
예로, 다음의 클래스가 존재하다고 하자. (실제 존재하지 않는다)

네임스페이스 : System.Text
public class ABC

클래스 사용을 위해 인스턴스 화는 다음처럼 선언하고,

System.Text.ABC temp = new System.Text.ABC();

temp 이름으로 System.Text.ABC 클래스의 메소드, 프로퍼티를 다음처럼 호출한다.

temp.메소드명();
temp.프로퍼티명;

다음처럼 정적클래스는,

네임스페이스 : System.Text
public static class DEF

클래스 사용을 위해 인스턴스 화는 필요없으며, 바로 사용한다.

System.Text.DEF.메소드명();
System.Text.DEF.프로퍼티명;


(많이 길어졌는데 조금만 힘내서..)
그렇다면, System.IO.File 클래스를 이용해서, 파일을 열고 읽어온 후 닫는 기능을 해보자.

Editplus 등으로 텍스트 파일을 하나 만들어서 저장한다. 당연히 웹서버에 저장하는 것이 좋다. 
필자의 웹서버의 폴더는 d:\homeasp 이며, 텍스트파일의 이름은 opentest.txt 이다.

opentest.txt

클래스를 이용하는 방법을 공부하고 있습니다.
재밌게 공부합시다.


이렇게 opentest.txt 파일은 두 줄의 내용이 들어있는 텍스트파일이며, d:\homeasp 웹서버에 지정된 폴더에 들어있다.

준비되었으면, 다시 MSDN을 열어서, 좌측을 보자. 


File 클래스 하단에 "멤버"와 "메소드"가 보인다.

멤버는 "클래스에 해당하는 모든 것"이라고 보면되고, 메서드는 괄호붙은 그것들이다. (앞으로 메서드라 부르겠다 -_-;) 그리고 이 클래스는 없지만, 클래스의 프로퍼티도 포함될 수 있다.

메서드를 클릭해서 목록을 보자. 여러가지 사용가능한 메서드를 볼 수 있다.
설명을 보면 "텍스트 파일을 읽는 목적"으로 사용할만 한 메서드가 있을 것이다.


ReadAllText() 라는 메서드가 그것이다. (메서드명에 괄호가 붙지 않으나, 모든 메서드는 괄호가 붙는다) 

오버로드되었습니다. 텍스트 파일을 열고 파일의 모든 줄을 문자열로 읽어 들인 다음 파일을 닫습니다. 

"오버로드되었습니다" 문구에 주목하고, ReadAllText를 클릭해서 자세한 사용법을 보자.


설명문에서 "오버로드되었습니다"라고 붙어있는 메서드 링크를 클릭하면, 언제나 이 페이지를 한번 거치게 된다. 오버로드되었기 때문이다.

오버로드(overload)의 사전적 의미는 '과부하'인데, 메서드에는 괄호가 있다고 했었다.

System.IO.File.ReadAllText();

이것에 메서드의 원형이라고 볼 수 있다. 그러나 설명을 보니, 

System.IO.File.ReadAllText(String)
System.IO.File.ReadAllText(String, Encoding)

이렇게 두 가지 방법으로 이 메서드를 사용해야 된다는 것을 알 수 있다.


(휴.. 드디어 메서드에 대해 알아보자)
메서드는 다음과 같은 형식을 가진다.

[접근권한] (static) [자료형] 메서드명(받을인수1, 받을인수2 ... )
{
          .. 메서드내용
}


어떻게 보면, 형식은 클래스와 비슷하다.

[접근권한] : 생략가능. public, private, protected 등. 생략시 private 형식이라고 보면 된다.
(static) : 생략가능. 클래스가 static 일 때 같이 static 으로 지정해야 함.
[자료형] : 이 메서드가 처리를 끝낸 후 반환(return)할 자료형(data type)
메서드명 : 일반적으로 영문자로 시작하는 이름
받을인수1~n : 메서드에서 필요로하는 자료


예를 들면,

public string GetBook(int code) 
{
     string book = "";
      .. 
     return book;
}

private int StudentAge(string student_code, int student_name)
{
     int age = null;
     ..
     return age;
}

bool IsReally()
{
    return false;
}


이렇게 만들어서 이용한다. 

메서드의 목적은, 특정 기능을 하는 녀석의 묶음이라고 보면 된다. 예를 들자. 빵을 만든다. 클래스로 표현하자. (알아보기 쉽게)

public class 빵기계
{
     public void 탁구빵()
     {           
          // 빵기계 전원 구동
          // 예열
          // 아주 맛있는 모드로
          // 굽고, 튀기고, 어쩌고 저쩌고...
     }

     public void 엠비시()
     {           
          // 빵기계 전원 구동
          // 예열
          // 아주 맛없는 모드로
          // 굽고, 튀기고, 어쩌고 저쩌고...
     }

}

(참고로 필자는 빵 만드는 과정을 잘 알지 못한다 -_-)

이렇게, 빵기계 클래스에 빵을 굽고 튀기는 모든 과정을 다 넣는다고 하면, 이 빵인 오직 이 빵기계에서만 사용할 수 밖에 없다. 다른 빵기계에 사용하려면, 빵기계 소스 코드를 붙여넣어야 한다. 

두개의 메서드를 보면, 중복되는 기능이 3개라고 보면, 딱 하나만 기능이 다르다.
그럼, 중복되는 기능을 메서드로 따로 빼어, 함께 사용할 수 있게 하면 어떨까?

public class 빵기계
{
     public void 탁구빵()
     {           
          빵기계전원구동();
          예열();
          // 아주 맛있는 모드로
          굽고튀기고어쩌고();
     }

     public void 엠비시()
     {           
          빵기계전원구동();
          예열();
          // 아주 맛없는 모드로
          굽고튀기고어쩌고();
     }

      
     private void 빵기계전원구동()
     {
     }
     private void 예열()
     {
     }
     private void 굽고튀기고어쩌고()
    {
    }

}



메서드는 특정 기능을, 종속되지 않고 단독으로 사용될 수 있게 만들어야 한다.
그래야지 어떤 빵을 넣더라도 그 빵이 모두 거쳐야 하는 "굽는", "익히는", "설탕을 뿌리는" 등의 행위를 할 수 있지 않겠는가?

전자렌지에 우유데우기, 국데우기 등의 기능이 함께 되는 것 처럼 말이다. 몇 초간 설정할 것인지는 뭘 데우든 해당 시간설정 메서드에 "몇 초"의 정보만 바꾸며 던져주면 된다. 강/약 설정도 비슷할 것이다.


다음 시간에...










 

반응형
Comments