==> 변환연산자.cs



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

namespace 변환연산자
{
    class Program
    {
        static void Main(string[] args)
        {
            //Car car;
            //car = new Car("에쿠스");
            //Car car = new Car("에쿠스");
            Car car = "에쿠스";

            Console.WriteLine("{0}", car.Name);

            Car myCar = "마이카"; // new Car("마이카");
        }
    }
}




==============================================================================================



==> Car.cs



using System;

public class Car
{
    private string name;
    public Car(string name)
    {
        this.name = name;
    }
    public string Name
    {
        get { return name; }
    }

    //[!] 변환연산자 구현
    public static implicit operator Car(string name)
    {
        // 생성자에게 재 전송
        return new Car(name);
    }
}

'.NET프로그래밍 > C# 3.5 SP1' 카테고리의 다른 글

74. 예외처리  (0) 2009.08.17
73 . 연산자오버로드  (0) 2009.08.17
71. 반복기(Iterator)  (0) 2009.08.17
70. 암시적으로 형식화된 로컬 변수  (0) 2009.08.17
69. 분할클래스(partial class)  (0) 2009.08.17
Posted by holland14
:


==>  반복기.cs



// Iterator : 내가 만든 객체를 foreach문으로
// 돌리고자할 때 반복기가 구현되어있어야 함..

using System;

public class 반복기
{
    public static void Main()
    {
        int[] data = {1, 2, 3 };
        foreach (var item in data)
        {
            Console.WriteLine(item);
        }
        Car hyundai; // Class
        hyundai = new Car(3); // Constructor
        hyundai[0] = "에쿠스"; // Indexer
        hyundai[1] = "제네시스";
        hyundai[2] = "그랜져";
        // Length Property

        for (int i = 0; i < hyundai.Length; i++)
        {
            Console.WriteLine(hyundai[i]);
        }

        // Iterator
        foreach (var item in hyundai)
        {
            Console.WriteLine(item);
        }
    }

}




==============================================================================================



==> Car.cs



using System;

public partial class Car
{
    public int Length { get; set; }
    private string[] names;
    public Car(int length)
    {
        this.Length = length;
        names = new string[length];
    }
    public string this[int index]
    {
        get { return names[index]; }
        set { names[index] = value; }
    }

    // Iterator : 반복기 : GetEnumerator
    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < names.Length; i++)
        {
            yield return names[i];
        }
    }
}


/*
yield : 나열하다

foreach문은 GetEnumerator함수를 호출한다.

'GetEnumerator()메서드'의 반환값은 'IEnumerator인터페이스'이다.
*/

Posted by holland14
:

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

namespace 암시적으로형식화된로컬변수
{
    class Program
    {
        static void Main(string[] args)
        {
            // 변수 선언
            int a = 10;
           
            // Nullable 형식
            int? b = null; //
           
            // 암시적으로 형식화된 로컬 변수
            var i = 1234; // 알아서 초기화되는 값으로 선언
            var s = "1234";

            // 타입 출력
            Console.WriteLine("{0}", i.GetType()); // Int32
            Console.WriteLine("{0}", s.GetType()); // String
           
        }
    }
}

Posted by holland14
:


==> 분할클래스.cs



// 분할클래스:
// 동일한 클래스를 여러개의 파일에 걸쳐 나눠서 설계
// 실제 빌드(컴파일)했을 때에는 단일 클래스로 합쳐짐...
using System;

public class 분할클래스
{
    public static void Main()
    {
        Car s = new Car("소나타");
        s.Run();
    }

}

public partial class Car
{
    // Constructor
    public Car(string name)
    {
        this.name = name;
    }
}




==============================================================================================



==> Car.cs



using System;

public partial class Car
{
    // Field
    private string name;
}

public partial class Car
{
    // Method
    public void Run()
    {
        Console.WriteLine("{0} 달리다", this.name);
    }
}

Posted by holland14
:

// 참조타입 관련 연산자
// is 연산자 : str is string : str변수가  string 형식인지 검사 : bool값
// as 연산자 : (str is string) ? str: null;    : is 연산자 + ?: 연산자
// ?? 연산자

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

namespace 추가연산자
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 10; // 값형식은 사용 불가

            string s = "안녕";
            object o = s;
            int? num = null; // ?? 연산자는 Nullable

            Console.WriteLine("{0}", (o is string) ); // True
            Console.WriteLine("{0}", (o as string) ); // (o is string) ?  o : null;
            Console.WriteLine("{0}", (num ?? 1234) ); // 의미 -> (num is null) ? 1234 : num;
        }
    }
}

Posted by holland14
:

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

namespace 값형식과참조형식
{
    class Program
    {
        static void Main(string[] args)
        {
            // 값 형식 : Value Type : 닷넷이 관리하는 메모리의 스택에 보관
            int i = 1234;

            // 참조 형식 : Reference Type : 닷넷의 힙 메모리에 보관
            string s = "안녕\0하세요"; // 리터럴(Literal)
            Console.WriteLine("{0}", s); // "안녕"만 출력된다.

            // 박싱(Boxing)과 언박싱(UnBoxing)
            string su = "1234";
            int num = Convert.ToInt32(su); // 힙 -> 스택 : 언박싱
            su = i.ToString(); // 스택 -> 힙 : Boxing
            su = null; // GC엔진활동

            // 구조체는 값형식, 클래스는 참조형식
            // Car car = new Car(); // 생성
            // car.Run(); // 사용
            // delete car; // 이런 명령어 없다...
        }
    }
}


/*
박싱과 언박싱은 최소로 하는게 좋다.(= 되도록 하지 않는게 좋다.)
속도가 늦어지기 때문이다.
 
\0  =>  종결문자열을 나타낸다.(= 문자열의 끝) 원칙적으로 \0이후의 문자열은 출력되지 않는다.
*/

Posted by holland14
:

// 널(Null) 가능 형식
// 정수형 등의 변수는 반드시 초기화해서 사용해야 한다.
// 변수 선언시 ?를 붙이면 null 값으로 초기화할 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nullable형식
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 100;
            int? ni = null;
            double? nd = 12.34;

            if (ni.HasValue) // 널값이면 false, 값이 있으면 참
            {
                Console.WriteLine("{0}", ni.Value);
            }
            else
            {
                Console.WriteLine("널값입니다.");
            }
        }
    }
}

Posted by holland14
:

// 명령줄인수(Command Line Prompt) :
// dir c:\ 식으로 명령어(exe) 뒤에 따라오는 문자열
// 예)
// 명령줄인수.exe 1 100 3  =>  1부터 100까지 3의 배수의 합을 구하는 프로그램
// 명령줄인수.exe 1 50 2  => 1부터 50까지 2의배수(짝수)의 합
// MyCalc.exe 1 + 3 엔터 => 1 + 3 = 4
// MyCalc.exe 3 * 7 엔터 => 3 * 7 = 21
// MyCalc.exe 6 - 2 엔터 => 6 - 2 = 4
// MyCalc.exe 8 / 4 엔터 => 8 / 4 = 2

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


namespace 명령줄인수
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 3)
            {
                Console.WriteLine("명령줄인수는 3개 이상 필요합니다.");
                return;
            }
            int first = Convert.ToInt32(args[0]);
            char op = Convert.ToChar(args[1]);
            int second = Int32.Parse(args[2]); // Int32의 Parse메서드를 사용해서 쓸수도 있다. Convert.ToInt32(args[0]);와 값은 똑같다.
            int num = 0;
            //int sum = 0;
            //for (int i = first; i <= second; i++)
            //{
            //    if (i % num == 0)
            //    {
            //        sum += i;
            //    }
            //}
            //Console.WriteLine("{0}~{1}까지 {2}의배수의 합: {3}", first, second, num, sum);

            if (op == '+')
            {
                num = first + second;
                Console.WriteLine("{0} {1} {2} == {3}", first, op, second, num);
            }
            if (op == '-')
            {
                num = first - second;
                Console.WriteLine("{0} {1} {2} == {3}", first, op, second, num);
            }
            if (op == '*')
            {
                num = first * second;
                Console.WriteLine("{0} {1} {2} == {3}", first, op, second, num);
            }
            if (op == '/')
            {
                num = first / second;
                Console.WriteLine("{0} {1} {2} == {3}", first, op, second, num);
            }
        }
    }
}

Posted by holland14
:

프로그래밍 언어


1. IDE(Integrated Development Environment) 설치
     a. Windows Server
     b. SQL Server
     c. Visual Studio
     d. Office System

2. 기본구조
     a. Hello World 프로그램

3. 기본입출력문
     a. Console.WriteLine()
     b. Console.ReadLine()
     c. Console.ReadKey()
     d. 자리표시자/자리채움자/PlaceHolder : {n}
     e. 이스케이프 시퀀스(Escape Sequence)/특수 기호/이스케이프 문자
          i. \n, \b, \t
          ii. \0 : 널(NULL) 문자, 값이 없다???, 종결 문자열

4. 데이터형식(DataType)/변수(Variable)/상수(Constant)
     a. 데이터 형식(Data Type) : C#은 데이터 형식이 풍부
          i. 정수 : int
          ii. 실수 : double, float
          iii. 문자 : char
          iv. 문자열 : string
          v. 객체 : object
          vi. 불린 : bool
     b. 변수 : 메모리 상의 임시 데이터 저장 공간
     c. 상수 : 한번 설정 후 값이 변하지 않는 변수

5. 연산자
     a. 산술 : +, -, *, /, %
     b. 대입 : =, +=, -=
     c. 비교 : ==, !=
     d. 논리 : &&, ||, !
     e. 증감 : ++, --
     f. 조건(3항) : ?:
     g. 시프트 : <<, >>
     h. 비트 : &, |, ^
     i. 기타 : 닷넷에서만 제공하는 연산자

6. 제어문
     a. 조건문
          i. if
          ii. switch
     b. 반복문
          i. for : 구간반복
          ii. while : 조건반복
          iii. do : 실행반복
          iv. foreach : 배열/컬렉션 반복
     c. 기타(점프)
          i. break
          ii. continue
          iii. goto
          iv. return

7. 배열(Array) :
     a. Variable : (데이터 저장 관점)하나의 이름으로 하나의 데이터형식을 가지는 하나의 데이터만 저장
     b. Array : 하나의 이름으로 동일한 데이터형식을 여러 개 저장할 수 있는 구조
     c. 종류
          i. 1차원 배열
          ii. 다차원 배열(2차원, 3차원, …)
          iii. 배열의 배열

8. 함수(메서드)(Function/Sub Procedure/Method) : 자주 사용하는 코드블록(패턴)을 하나의 이름으로 만들어 놓은 코드의 집합, 사용 목적 : 재 사용
     a. 매개변수(Parameter)가 없는 함수
     b. 매개변수(Argument)가 있는 함수 : Sub Procedure
     c. 반환값(Return Value)가 있는 함수 : Function

9. 구조체(Struct)
     a. 설명
          i. 변수(Variable) : 하나의 이름으로 하나의 데이터형식을 하나만 저장
          ii. 배열(Array) : 하나의 이름으로 하나의 DataType(int, string)을 여러 개 저장
          iii. 구조체(Struct) : 하나의 이름으로 여러 개의 DataType을 한 개/여러 개 저장
               1) static 붙이면 : 정적 접근이 가능, 쩜 찍었을 때 멤버가 노출
               2) static 빼면 : 인스턴스(변수 선언해야 사용) 접근이 가능
          iv. 클래스(Class) : 구조체의 모든 기능 + 함수(메서드;동작;기능)
     b. 내장 구조체 : 이미 만들어져 있는
          i. 날짜/시간차 관련 구조체 : DateTime, TimeSpan
          ii. 문자(Char) 구조체
          iii. …
10. 열거형(Enumeration)
     a. C#에서 열거형은 기억하기 어려운 상수들의 집합을 기억하기 쉬운 하나의 이름으로 묶어서 관리하는 표현 방식이다. 열거형은 enum 키워드를 사용한다. 참고로, 이미 만들어져 있는 열거형을 편리하게 자주 사용하나, 우리가 만들어서 작성하는 경우는 초반에는 적다…

11. 클래스(Class)
     a. 구조체의 모든 기능 + 메서드(함수) 포함
     b. 현실세계 : 자동차의 설계도 역할
     c. 프로그램세계 : public class Car { }
     d. 클래스 : 자동차 설계도
     e. 개체(객체;Object;오브젝트) : 자동차 설계도로부터 생성(조립;인스턴스화)된 하나의 단위(변수)
          i. Instance : 클래스로부터 만들어진 하나의 개체, 새로운 실체 => 개체
          ii. 개체, 객체, 오브젝트, 인스턴스, 컨트롤, => 컴포넌트, 프레임워크
     f. 구조체와 마찬가지로 하나의 Data Type(데이터 형식)이 된다.
     g. Static과 Instance
          i. 정적 접근 : 개체 생성하지 않고도 멤버에 접근 : 작은 개념
          ii. 인스턴스 접근 : 반드시 new 연산자를 통해서 객체 생성 후 멤버에 접근
               1) 클래스명 개체명 = new 클래스명();
12. 필드(Field)
     a. 자동차의 부품 역할 : 부품은 꽁꽁 숨겨라… 캡슐화(Encapsulation)
     b. 클래스내에 선언된 멤버 변수(Member Variable) : 전역 변수(Global Variable)와 비슷
     c. 필드는 초기화하지 않아도 자동 초기화
          i. Int형 : 0으로
          ii. String형 : String.Empty로
          iii. 필드는 public 접근 한정자(Access Modifier)를 붙여도 되지만, 개념상 private 접근 수식자를 붙인다.
               1) public string name; => private string name;
     d. 현재까지 교재 학습 : 171페이지~182페이지 내용 읽어보세요…

13. 생성자(Constructor) : 182페이지
     a. 자동차 시동걸기/조립 등의 행위(메서드)
     b. 클래스명과 동일한 이름의 반환값이 없는 메서드
     c. 클래스의 필드 초기화시키는 역할
     d. 개체생성시 제일 먼저 실행되는 메서드
     e. 종류
          i. Public 생성자 : 개체의 인스턴스 생성시 호출
          ii. Static 생성자 : static 접근시 호출, 매개변수를 가질 수 없음

14. 소멸자(Desctructor) : 188페이지까지… 정독
     a. 자동차 폐차, 주차 및 시동끄기
          i. 싼 개념 : 본인이 직접 주차 및 시동끄기
          ii. 비싼 개념 : 주차요원(GC)이 대신
     b. GC 엔진에 의해서 사용하므로, 개발자가 건드릴 일 없다.
     c. 클래스에서 제일 마지막에 실행되는 메서드

15. 메서드(Method):205~209페이지
    a. 자동차의 동작 : 전진(), 후진(), 좌회전()
    b. 클래스의 기능 : 개체가 수행할 수 있는 기능/동작/행위 등
    c. 매개변수 전달 방식 4가지 비교(메서드 호출, 메서드 선언)
 i. 값 전달 방식(val) : call by value, 값만 전달
        ii. 참조 전달 방식(ref) : call by reference, 데이터는 호출쪽에만 저장
        iii. 반환형 전달 방식(out) : 변수를 초기화하지 않고, 함수에서 초기화시켜준다.
        iv. 가변형 전달 방식(params) : 여러 개의 매개변수가 필요할 때
    d. 메서드 오버로드/오버로딩(Overload): 다중 정의
 i. 클래스내에 동일한 이름의 메서드를 매개변수를 달리해서 여러 개(다중) 선언

16. 속성(Property) : 210~217p
    a. 클래스 내의 필드의 내용을 설정(set)하거나 참조(get)할 때 사용하는 코드 블록
    b. 개체의 성질/특징/색상/크기/모양 등등의 정의할 때 사용
    c. 빨간색, 바퀴 4개 등의 속성을 가지는 자동차 개체
    d. private한 필드를 public한 속성으로 외부에 공개
    e. C/C++에서는 주로 GetXXX(), Set() 함수를 사용

17. 인덱서(Indexer) // ==> "속성의 확장판"
    a. 개체를 배열형식으로 표현
    b. 자동차 개체의 카탈로그(?)
         i. 현대[0] = "에쿠스"; 현대[1] = "소나타"; => 정수형 인덱서(서수 사용)
             1) 현대.FirstCar = "에쿠스"; 현대.SecondCar = "제네시스"; 
             2) 현대.GetName(0) = "'에쿠스"; 현대.GetName(1) = "제네시스";
         ii. 현대["첫번째"] = "에쿠스"; 현대["신차"] = "제네시스"; => 문자열 인덱서
         iii. 출력 : 첫번째 자동차를 출력한다면???
             1) 현대.GetName(0); // 메서드 호출
             2) 현대.FirstCar; // 속성 호출
             3) 현대[0]; // 정수형 인덱서
             4) 현대["첫번째"]; // 문자열 인덱서
    c. 반복기(Iterator)
         내가 만든 객체를 foreach문으로 돌리고자할 때 반복기가 구현되어있어야 함.
         foreach문은 GetEnumerator함수를 호출한다. 'GetEnumerator()메서드'의 반환값은 'IEnumerator인터페이스'이다.

18.대리자(Delegate) : 317~332페이지(332페이지는 나중에)
    a. 대리자, 위임, 델리게이트
    b. 한번 호출로 하나 이상의 메서드를 대신해서 호출하는 개념
 i. 다중 메서드 호출
    c. 메서드 -> (확장) -> 대리자 ->(확장) -> 이벤트
    d. 대리자는 이벤트를 만들기 위한 중간 단계로만 사용된다.
    e. 자동차로 따지면, 말 그대로 대리운전
 i. 집으로 갑시다()
     1) 전진() -> 좌회전() -> 우회전() -> 후진()
    f. 무명(익명:Anonymous) 메서드 : 대리자에 등록되는 메서드 중 간단한 기능이면 생략해서 사용하고자 할 때

19. 이벤트(Event)
    a. 개체가 수행할 수 있는 동작(메서드)의 수행 결과(사건/사고/이벤트)
    b. 윈도우 응용프로그램에서 마우스 클릭 이벤트, 마우스 오버 이벤트, 더블클릭 이벤트
    c. 자동차로 예로 들면,
 i. 자동차설계도(클래스)로부터 하나의 빨간색 스포츠카(속성) 자동차(개체)를 만들어서, 시동걸고(생성자) 전진 및 좌회전(메서드)을 하면서, 가끔은 대리운전(대리자)도 부르고, 그러다가 과속(메서드)이라는 기능 수행 결과 교통사고(이벤트) 사고가 발생해서, 그나마 멀쩡한 카오디오(필드) 중고로 팔고, 폐차(소멸자)했다.

20. 네임스페이스(Namespace) :  교재62페이지
    a. 자동차 브랜드
 i. 현대자동차
        ii. 삼성자동차
    b. 서로 관련있는 클래스를 묶어서 관리
    c. 중첩가능
 i. System.Web.UI
        ii. System.Collection
 iii. RedPlus.Library.Menu.dll
 iv. RedPlus.Library.Board.dll

21. 인터페이스(Interface)
    a. 추상 클래스와 같이 다른 클래스에게 멤버명을 미리 강제로 사용토록 할 때
    b. 인터페이스는 몀버명만 갖는반면, 추상클래스는 다름 멤버도 가질 수 있다.
    c. 인터페이스는 자동차로 따지면, 전세계표준(ISO), 국내표준㉿ 등의 의미를 지닌다.
    d. C#은 다중상속이 불가능하지만(C++가능), 인터페이스 다중 상속은 가능하다.
    e. 자동차 규격, 예를들어 배터리 충전(점프선)

22. 특성(Attribute) : 코드에 대한 설명문(메타데이터)
    a. 멤버 앞에 [특성(특성값)] 식으로 붙여서 사용
    b. 분야(Web,XML, ...)에 따라서 많은 내장 특성이 있다.
    c. 사용자 정의 특성을 만들고자할 때에는 System.Attribute를 상속받아 설계
    d. 특성을 통해서 런타임시에 추가적인 기능을 부여 가능
    e. 자동차로 따지자면, 자동차 액세서리

'.NET프로그래밍 > C# 3.5 SP1' 카테고리의 다른 글

66. Nullable형식(=Null가능형식)  (0) 2009.08.17
65. 명령줄인수  (0) 2009.08.17
"상속(Inheritance)" 필기  (0) 2009.08.14
64. 봉인클래스(Sealed)  (0) 2009.08.14
63. 인터페이스(Interface)  (0) 2009.08.14
Posted by holland14
:
 

상속(Inheritance) : 클래스들간의 관계

 

클래스 상속

  • 개체 지향 프로그래밍의 장점 중의 하나는 이미 만들어져 클래스를 재사용 하는 것이다. 재사용에 대한 핵심개념이 바로 상속이다.
  • 부모의 재산을 자식에게 상속하듯이 부모클래스(기본클래스) 모든 멤버를 자식클래스(파생클래스)에게 재사용토록 허가하는 기능을 의미한다.
  • 여러 클래스들 간의 관계를 설정함에 있어서 수평 관계가 아닌 부모와 자식간의 관계처럼 계층적인 관계를 표현하고자 사용하는 개념을 상속이라 한다.

 

Object 클래스 : 교재347~348페이지

  • 모든 클래스들의 부모 클래스
  • 닷넷에서 가장 높은 층에 속하는 시조격 클래스
  • 새롭게 만들어지는 모든 클래스들은 Object 클래스로부터 상속 받음(생략 가능)

 

기본(Base) 클래스

  • 다른 클래스의 부모 클래스가 되는 클래스
  • Base 클래스 또는 부모(Parent) 클래스로 표현

 

파생(Derived) 클래스 : Sub

  • 다른 클래스로부터 멤버를 물려받은 클래스
  • Derieved 클래스 또는 자식(Child) 클래스로 표현

 

접근 한정자 :  Access Modifier

public : 공용, 외부에 공개

private : 전용, 내부에서만 사용

protected : 제한적인, 자식에게만 공개

internal : 어셈블리(DLL) 파일 내에서만 공개

 

(다시) 정의 : 오버라이드(Override) : 부모와 자식간의 멤버명이 충돌???

  • 부모와 자식이 동일 : 인스턴스 생성시 사용한 클래스의 멤버
  • 부모에는 아무것도 안붙이고, 자식에는 new키워드를 붙여서 하위(자식클래스)에서 새롭게 정의한다.
  • 부모 virtual, 자식에는 override : 제일 좋은 형태
  • 부모 abstract, 자식에는 override

 

ToString() 메서드 오버라이드

  • Object 클래스에 정의되어 있는 ToString() 메서드는 기본적으로 클래스의 이름값을 반환시켜준다.
  • 또는 정수형과 같이 대표가 되는 값이 들어있는 경우는 값을 문자열로 변환해서 출력해준다.
  • 내가 만든 클래스의 대표가 되는 속성 또는 값을 외부에 인스턴스명으로 사용해서 출력하고자 때에는  ToString() 메서드를 재정의(Override)해서 사용해야 한다.

 

추상 클래스(Abstract)

  • 클래스 설계시 부모 클래스 역할을 하면서, 강제로 자식 클래스에게 특정 멤버명을 물려주고자 정의
  • 추상클래스는 멤버의 실제 내용을 구현하지 않고, 자식 클래스에서 멤버를 구현
  • 주로 선임이 추상클래스, 후임이 추상클래스를 상속받은 클래스 구현

 

인터페이스(Interface)

  • 추상 클래스와 같이 다른 클래스에게 멤버명을 미리 강제로 사용토록
  • 인터페이스는 몀버명만 갖는반면, 추상클래스는 다름 멤버도 가질 있다.
  • 인터페이스는 자동차로 따지면, 전세계표준(ISO), 국내표준㉿ 등의 의미를 지닌다.
  • C# 다중상속이 불가능하지만(C++가능), 인터페이스 다중 상속은 가능하다.
  • 자동차 규격, 예를들어 배터리 충전(점프선)

 

봉인클래스(Sealed) : 최종 클래스, 마지막 클래스

  • 이상 상속되지 않는 클래스
  • Sealed 키워드를 붙여서 상속금지시킨다.

'.NET프로그래밍 > C# 3.5 SP1' 카테고리의 다른 글

65. 명령줄인수  (0) 2009.08.17
C# 프로그래밍 관련 단어정리  (0) 2009.08.14
64. 봉인클래스(Sealed)  (0) 2009.08.14
63. 인터페이스(Interface)  (0) 2009.08.14
62. 추상클래스(Abstract)  (0) 2009.08.14
Posted by holland14
: