.Net is a for Web-Service.

COM 전략의 실패 - 레지스트리에 등록
-> 서비스 벤더 자체 프로토콜

JVM : .NET 플랫폼 - 미들웨어

App
M/W
Native

C++
Reference 형식 
형식 불안정

java .NET
형식안정적 -> 세대조사 0세대,1세대,2세대(세대조사 이유.성능저하)



.NET 3가지특징
- CTS Common type system 
- CLS Common Language Specification 공용언어를 사용시 최소한에 지켜야할 사항(외부로 노출된 것을 공용으로 사용할수 있는것으로)
- CIR Common Language Runtime 
핵심 -> jitter = Just It Tiem Complier , 공통라이브러리(COL)로딩

/////////////////////////////////////////////////////////////////////////////////
c#
형식(type)

value 
-구조체
- int
- char
- bool
   .
   .   
-열거형

reference
- Class
- delegate(암시적 Class)
- interface (Class로 취급해도 문제없음)
- string (동작은 value 처럼 사용해도 지장없음)

value 형은 Stack영역에 활당

reference 형은 Heap 영역에 활당
참조된 변수를 null로 바꿔주는 것 만으로도 효과적

objectClass
value type
reference type


int i = 7;
object o = i; // Boxing

int k = (int)o; // UnBoxing

제러릭(템플릿과 비슷)
제러릭 컬릭셕(성능에 향상) value 형식을 컨터이너에 보관할때 

foreach - 열거 가능한 형식에 대해서만 가능
 
Arraylist ar = new Arraylist();

ar.Add(3);
ar.Add(6);
ar.Add(8);

foreach(int i in ar)
{
Console.WiteLine(i.ToString());
}

OOP 3대속성
캡슐화
- 필드
- 상수
- 읽기전용
- 메소드
- 속성
- 등등등~

class stu
{
const int val = 7; (컴파일시)
readonly int num = 9; or 생성자에서만 초기화 가능! 
static readonly int num; // 가능 (런타임시)
}

상속(파생),다형성

abstract class stu
//클래스내에 순수가상함수가 하나도 없어도 해당 클래스를 생성할 수 없다
abstract 메소드 = 순수가상함수

BaseClass에 void Foo() 라는 메소드를 파생 클래스에서 무효화 하려면
파생Class 내에 new void Foo() 라 명시하면 BaseClass에 void Foo()는 무효화

sealed class stu  봉인 클래스
봉인된 클래스는 base클래스가 될 수 없다


다형성에서 주의사항

-기반 클래스는 하나만 명시가능 맨 앞에 명시 (다중상속 x) 
class MStu : Stu, IStudy //맨 앞이 기반 클래스 뒤로 인터페이스
{
}

구현약속
interface IStudy
{
void Study(); /// abstract,public
}


형식변환
RTTI

형식확인
is 연산 value 형식에 대해 사용을 많이 함
object o;
if(o is int)
if(o is char)

as 연산 //reference 형식만가능
int i = o as int;// 불가능
참이면 값대입 거짓이면 null 대입

Teacher t = o as Teacher;
if( t != null)
{
불라불라~
}


연산자 중복정의  
== 와 != 같이 정의해야됨~~
다른경우도 마찬가지
class Foo
{
int i;
public Foo(int _i){i = _i;}
public static bool operator == (Foo f, Foo f2)
{
return f.i == f2.i;
}
public static bool operator !=(Foo f, Foo f2)
{
return f.i != f2.i;
}
}

//명시적
class Foo
{
int i;
public static explicit operator int(Foo foo)
{
return foo.i;
}
public static explicit  operator Foo(int v)
{
return new Foo(v);
}
}

Foo foo = new Foo(3);
int i = (int)foo;

Foo foo2 =(Foo)i;


//위와 비슷
//암시적
class Foo
{
int i;
public implicit operator int(Foo foo)
{
return foo.i;
}
public implicit operator Foo(int v)
{
return new Foo(v);
}
}
Foo foo = new Foo(3);

int i = foo;

Foo foo2 =i;

속성 
   class stu
    {
        int score;
        public int socre
        {
            get
            {
                return socre;
            }
            protected set //비대칭 속성
            {
                if (AvailSocre(value))
                {
                    socre = value;
                }
            }
        }

        private bool AvailSocre(int value)
        {
            return (value <= 100);
        }
    }


static 

    static class MyGeneral //모든 맴버 가 static 이여야 한다.
    {
        static public int Add(int a, int b)
        {
            return a + b;
        }
    }

    class MyGeneral
    {
        static int num;
        static MyGeneral() //  static 생성자 입력 매개변수 접근 사용자를 명시할수 없음. static 생성자는 .NET 스스로 호출
        {
            num = 0;
        }
    }


class Book
    {
    }
    class MyGeneral
    {
        const int num = 5;
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }

    class Book
    {
    }
    class MyGeneral
    {
        static const Book book2 = new Book();
        static readonly Book book;
        static MyGeneral() 
        {
            book = new Book();
        }
    }



상속
    class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }        
    }
//입력매개변수가 없는 생성자는 구조체에 선언 할 수 없다.
순수 가상함수 상속 abstract

 abstract class BaseClass
    {
        public BaseClass(int a)
        {
        }
        public abstract void soo();

        public virtual void Foo()
        {
        }
       
    }

    class Derived : BaseClass
    {
        public Derived() : base(8)
        {
        }
        public override void Foo()
        {
            base.Foo();
        }
        public override void soo()
        {
            throw new NotImplementedException();
        }
    }


강제 소멸자
    abstract class BaseClass : IDisposable
    {
        bool check;
        public BaseClass(int a)
        {
        }
        public abstract void soo();
        public void Dispose()
        {
            if (check == false)
            {                
                GC.SuppressFinalize(this);
                check = true;
            }
        }


입력 매개변수 전달 유형

return , in, out , ref

ref

       void Foo()
        {
            int i = 2;
            Soo(ref i);
        }
        void Soo(ref int i)
        {
            if ((i % 2) == 0)
            {
                i = 3;
            }
        }

out

    class BaseClass
    {
        public void Foo()
        {
            int i = 3;
            int j = 9;
            int max;
            int u = Add(i, j, out max);
            Console.WriteLine("{0},{1}",u,max);
        }
        int Add(int a, int b, out int v)
        {
            v = b;
            if (a > b)
            {
                v = a;
            }
            return a + b;
        }
    }


배열

Array 클래스에서 부터 파생
int [ ] arr = new int[7];
int[ , ] arr = new int[3,4];
int [][] arr = new int [3][]; 제그드배열~~~~~~~~지그제그지그제그
arr[0] = new int [2];
arr[1] = new int[10];
arr[2] = new int[5];

foreach(int []ar in arr)
{
foreach(int i in ar)
{
Console.WiteLine(i.ToString);
}
}


Arrage.Sort(arr); // 비교가 가능한 대상이라면 정렬가능

string

string s = string.Empty; // 습관처럼 이용

문자열은 char의 읽기전용 컬렉션이다!

조합을 사용할때
StringBuilder sb = new StringBuilder("hello");
사용이 효율적
string s;
s = string.format("{0}{1}","asdasd",asdasdasdasd"); 이런식으로



인터페이스

 interface IStudy
    {
        void Study();
        void Work();
        int Num // 이런것도 가능
        {
            get;
            set;
        }
    }
    interface ITeach
    {
        void Teach();
        void Work();
    }
    class Man
    {
    }
    class Stu : Man, IStudy,ITeach
    {        
        public void Study()
        {
        }
        public void Teach()
        {
        }
        void ITeach.Work()
        {
        }
        void IStudy.Work()
        {
        }
        int IStudy.Num
        {
            get;
            set;
        }

    }


'Programing > C#&.Net' 카테고리의 다른 글

형식 메타데이터  (0) 2016.11.30
c# 프로그램 연습  (0) 2016.11.30
Delegate(대리자)  (0) 2016.11.30
dll만들기 명령 프롬프트 사용  (0) 2016.11.30
마샬링(marshalling)  (0) 2016.11.30

+ Recent posts