.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;
}
}