본문 바로가기

C#

C#- Main메서드

반응형

 

프로그램은 CPU에 의해 순차적으로 생행되는 특징을 지난다 C #으로 만든 프로그램도 역시 순서되로 명령어가 실행되는데 그렇다면 가장 처음 실행되는 명령어라 뭘까? 다른 말로 진입점 entry point 이라고도 하는데 c#은 다음과 같은 약속을 따르는 메서드를 최초로 실행될 메서드라고 규정한다.

1. 메서드 이름은 반드시 main이고 

2.정적 메서드여야 하고 

3.main메스드가 정의 된 클래스의 이름은 제한이 없다 하지만 2개 이사의 클래스에서 main메서드를 정의하고 있다면 c#컴파일러에게 클래스를 지정해야함

4.main메서드의 반환값은 void 또는 int만 허용됨

5. main메서드의 매개변수는 없거나 string배열만 허용됨

 

클래스 안에 행위가 있고 속성 행위는 메소드로 나타내고 속성은 변수로 나타낸다.

요렇게 해가지고 요타입에 맞게끔 번역을 해준다  c#

컴파일 디버그 , 런타임 에러 

클래스를 정의하는게 됩니다. 

인간이라는 글은 인간이라는 단어를 정의 한거죠. 

정의해 놓은걸를 실제로 생성한 것을 인스턴스 또는 객체 라고 부른다. 

틀만 잘 만들면 대량 생산할 수 있다 . 인간이라는 클래스를 만든다면 인간의 생물학적 구조는 머리 팔 

팔을 객체로 따로만들건가 객체와 객체를 조합해서 새로은 객체를 만들 수 있다. 

쌍용에서 벤츠 엔진을 가져와서 차를 만들었는데 엔진을 모든곳에서 호환이 가능하다면 

차체 객체 엔진 객체 따로따로 만들면 팔아 먹기 좋다 . 

바퀴가 대표적인 객체 타입. 프로그래밍 기술이 발전하며 발전 할 수로 각각의 객체를 만들어서 해당 객체를 조합해서 

작성할 수 있다. 이렇게 되면 코드를 쉽게 업그레이드 할 수 있다. 

종료자 (종결자) 접근 속성 

생성자 한번만 호출 =  stsatic 생성자 

 

디폴트 생성자를 호출해도 스테틱 생성자가 먼저 호출 되기 때문에 출력하면 스테틱 생성자가 먼저 나온다,

그리고 스테틱 생성자는 한번만 나온다 

new로 객체를 생성하면 일반 생성자가 호출 된다.

 

네임스페이스 

동일한 이름의 변수 메소드를 사용할때 다른 네임스페이스를 사용하면 충돌 없이 사용 가능하다. 

 

캡슐화

한마디로 모든 정보를 캡슐 안에 넣어서 추상화  안을 들여다 볼 수 없게 만드는 방식 

 

 public 예약어를 쓰지 않으면 된다 .

접근 제한자  

private 내부에서만 접근을 허용한다. -- 금고 class안에서만 마음대로 사용가능 

protected 내부에서의 접근과 함계 파생 클래스에서만 접근을 허용한다 ?  혈족관계 ? 

public 내부및 파생 클래서에서의 접근 뿐만 아니라 외부에서 접근을 허용한다 우리말로 보통 공용이라는 표현을 쓴다.

internal 동일한 어셈블리 내에서는 public에 준한 접근을 허용한다. 다른 어셈블리에서는 접근할 수 있다.

internal protected 동일 어셈블리 내에서 정의된 클래스이거나 다른 어셈블리라면 파생 클래스인 경우에 한해 접근을 허용한다.

static 생성자

정적 생성자는 클래스의 어떤 맴버든 최초로 접근하는 시점에 단 한번만 실행된다는 점을 기억해 두자 정적 맴버를 처음 호출할 경이거나 인스턴스 생성자를 통해 객체가 만들어지는 시점이 되면 그 어떤 코드보다도 우선적으로 실행된다. 

 

디버그를 잘 쓰면 코딩 프로세스를 이해하는데 도움이 된다. 

f9 - stop point

f5 - 실행

f11- 하나씩 실행 

 

정보 은닉

 객체지향에서 캡슐화를 다룰 떄면 언제나 정보은닉이라는 개념이 함꼐 등장한다. 

캡슐화를 잘했다면 정보 은닉도 함께 지켜지는 것이 보통이지만 그 역은 성립하지 않을 수 있다. 

즉 온갖 잡다한 기능을 넣은 클래스에서도 멤버 변수를외부에 노출시키지 않는다면 정보 은닉이 성립하기 떄문이다.

 

멤버 변수를 무조건 감추는 것이 능사는 아니다 왜나하면 멤버 변수 자체가 틀래스의 고유특성을 반영하고 있다면 외부에서 그변수의 값에 접근할 필요가 있기 때문이다. 여기서 접근이라는 단어에는 일기와 쓰기라는 두가지 의미가 있는데 필드에 일고 쓰기가 적용될 때눈 관례적으로  get set이라는 단어를 각각 사용한다 그리고 멤버 변수에 대해 get/set기능을 하는 메서드를 특별히 접근자 메서드(getter) 설정자 메서드(setter)라고 한다.

 

프로퍼티

접근자 설정자 메서드를 뒤서 필드 접근에 대한 단일 창구를 제공하는 것은 바람직하지만 호출을 위한 메서드 정의를 일일이 코드로 작성하자면 분명 번거로울 것이다 .

프로퍼티 문법 

마지막으로 프로퍼티는 메서드의 특수한 변형에 불과하다는 사실을 알아두자 일례로 car class에서 정의한 ispeed프로퍼티는 c#컴파일러가 빌드하는 시점에 자동으로 다음과 같은 메서드로 분리해서 컴파일한다.  

 

상속

코드 관점에서 본다면 기존에 만든 코드를 당겨 받아서 코드를 재 생산할 필요가 없다 ,

 

현실 세계를 다시 한번 관찰해 보자 인간과 침팬지는 영장류에 속한다 그리고 영장류와 고래, 기린 등은 포유류에 속한다 이런 식으로 현실 세계는 어떤 공통적인 특징이 있고 그 특징을 상속받아 다른 세부적인 항목을 정의 하는데 일상적인 많은 객체가 이러한 계층적인 관계를 따르고 있다. 만약 상속이라는 개념이 없다면 노트북 데스크톱 넷북 클래스는 다음과 같이 각각 개별적으로 메서드 

protected 로 잠겨 있는 걸 풀었다.

프로그래밍으로 상속을 의도적으로 막고 싶을 떄도 있다. sealed 

키워드를 직접제공

c#은 단일 상속만 가능하다. 자바가 그렇다 c++은 다중 상속이 가능하다. 

상속 받게 되면 상속된 데이터는 부모의 데이터로써 부모의 데이터 기반 위에 자녀의 데이터가 있다고 생각하면 된다.

부모 클래스의 생성된 객체에 자식의 객체를 대입하여도 전혀 문제가 없다 에러가 발생하지 않는다 . 

 

꺼꾸로는 허용 되지 않는다 이경우 cast를 통해 컴파일 만이 가능하다. 

 

 

인텔 CPU는 Littele Endian

연산에 적합한 -- 오락용

슈퍼 컴퓨터는 Bing Endian

대소 비교를 통한 복합연산에 적합한 --- 계산용

 

참조 한부분을 줄줄이 늘여써 보았다. 

이렇다.

 

 as,is연산자 

as는 형변환이 가능하면 지정된 타입의 인스턴스 값을 반환하고 가능하지 않으면 null을 반환하기 떄문에   

 

 

 

 복습

상속 코드의 재사용 -> 시간 절약 /시간은 돈/ 비용감소

상속된 코드는 검증된 안정적인 코드  -> 하지만 복잡한 문제가 많인 생긴다. (형변환) -이부분 다시 공부하기 

 

참조변수

A    aRef ----------------------> cObj abc  ,bObj ab  ,aObj a

B    bRef ----------------------> cObj abc  ,bObj ab    

C    cRef------------------------>cObj abc  

 

as is 연산자

Computer 

     +

NoteBook

 

pc as NoteBook

----------------- NoteBook 이 Computer가 될 수 있는지 물어보는 거 

하지만 역은 성립 안할 수 있다. 

pc is NoteBook 

----------------- pc 가 NoteBook에 귀속이되는가? 

성립가능 pc가 조상급이면 

// is as는 객체를 비교하는 언어로 값을 비교할 수 는 없다.

 

DATA TYPE 자료형 ------------- 값    ---- 기본형, 구조체 (int,char,struct)

                         ------------- 참조 ---- 객체 

 

 

모든 타입의 조상 :  System.Object

클래스를 정의할 떄 부모 클래스를 명시하지 않는다면 c#컴파일러는 기본적으로 object라는 타입에서 상속 받는다고 가정하고 자동으로 코드를 생성한다. 따라서 다음 코드는 완전히 동일하게 취급된다.

그런데 부모 클래스를 지정하더라도 그 부모 클래스는 어떤 클래스를 다시 상속받았을 것이고 결국에는 최초의 클래스가 object 타입을 상속 받는 것으로 끝난다. 결국 c#에서 정의되는 모든 클래스의 부모는 object가 된다.

 

 

 

상속의 상태를 확인할 수 있다. 상위의 객체일 수록 많은것을 아우를 수 있다.

 

무조건 Object을 상속 받고 있는데  지금 위 화면에서 볼 수 있는4가지는 무조건 상속되는 메소드이다.

ToString

 

public virtual string ToString

 

문자열 500 +1

숫자열 500 + 1 = 501

아스키코드 0~9

GetType

클래스에 대해 생각해보자 아니 클래스를 다시 객체지향 관점으로 바로보는 것은 어떨가? 

클래스 역시 속성으로 클래스의 이름을 담고 있으면 필드 메서드 프로퍼티와 같은 멤버를 담고있는 또 다른 타입을 ㅗ볼 수 있다 c#에서는 개발자가 class로 타입을 정의하면 내부적으로 패상 class 타입의 정보를 가지고 있는 SystemType

 

 

 

 

 

HASH CODE

일대일 대응 -- 은행 /고유번호 발행

식별자 : ID -- 객체의 고유번호를 가져 올때 

GetHashCode 메서드는 특정 인스턴스를 고유하게 식별할 수 있는 4바이트 int 값을 반환하다. 한가지 기억해 둬야할 점은 GetHashCode 가 Equals메서드와 연계되는 특성이 있다는 점이다 . Equals 의 반환값이 True 인객체라면 서로 같음을 의미하고 그렇다면 그 객체들을 식별하는 고윳 값또한 같아야 한다 반면 반대라면  GetHashCode 의 반환 값도 달라야 한다. 

 

 

long 8

int  4

반응형