-
C# 종료자, 정적 멤버, 인스턴스 멤버, 정적 필드,정적 생성자, 네임스페이스(교육10일차)C# 2020. 5. 29. 18:02
종료자
생성된 객체에 할당된 메모리를 없앨 경우 사용한다. 하지만 C#에서는 가비지 콜렉터라고 하는 개념이 알아서 없애준다.
잘 쓰지 않으니 특별한 경우에만 사용하자. 만든 객체의 개수만큼 호출된다. 객체 간의 종료자가 호출되는 순서는 스택을 따른다. 먼저 생성된 것이 나중에 종료된다.
~ 디폴트 생성자()
{
}하지만 접속률이 높은 서버 같은 경우 CPU가 한참 바쁠 때, 가비지 콜렉터로 쓰레기 주우러 다니면 CPU의 부하가 올라갈 수 있으므로로, 많이 쌓이면 한꺼번에 처리하면 효율적이다. 자동과 수동의 장단점이 있지만 C#은 자동을 채택했다.
정적 멤버, 필드
스택 영역 Heap
참조 변수 ------------------------------------>>> Person 홍길동 Person
Main_name
참조 변수정적 (static) <-> 동적 (dynamic)
***
static을 적게 되면 컴파일(Compile Time) 할 때 실행되고, new는 실행(Run Time) 될 때 실행된다. 둘 다 버그가 발생한 경우, 컴파일할 때 오류가 나면 컴파일 에러, 실행할 때 오류가 나면 런타임 에러라고 한다.
new를 써서 만드는 객체는 런타임 시점에서 만들고 메모리에만 존재하지만, static을 적게 되면 실행파일 내에 위치한다.
똑같이 A를 만들어라는 프로그램이 있을 때, 일반적으로 A를 만드는 건 A를 만드는 명령이 실행파일에 포함되어 있고, 앞에 static을 이용하면 컴파일할 때 A를 만들어서 실행파일에 집어넣는다. 따라서 전자의 경우에는 실행 도중에 A 메모리를 만들고, 후자는 실행파일 내에 A가 있어서 A를 복사해서 메모리에 넣는다.
int A; -------> 컴파일 번역 -----> 실행 파일(A를 만들어라).exe -> 실행 (로딩(SSD, RAM) ->Run(RAM, CPU, GPU)
Static int B; --> 컴파일 번역 -----> 실행 파일(B). exe -> 실행 (로딩(SSD, RAM) -> Run(RAM,CPU,GPU)
CPU BUS Memory 시작 주소를 받는다.왔다 갔다하면서 실행
A를 만들어라.
(B는 실행할 게 없다.)
A에 3을 넣어라.
B에 5를 넣어라..(시작주소)A를 만들어라 B = 5 A에 3을 넣어라 B에 5을 넣어라 Stack 영역 A = 3 정적 필드 예제
필드 부분에서 _name은 객체 매다 하나씩 만들어진다. 만약 객체를 100개 만든다면 _name은 100개가 만들어진다. 하지만 static을 선언한 CountOfInstance는 딱 하나가 만들어진다. 마치 공용 변수 같은 느낌이다. 따라서 결과가 객체가 선언될 때마다 Count가 1씩 증가한다. 하지만 static을 뺀다면 객체마다 하나씩 CountOfInstance를 가지므로 1이 출력된다.
Main 메서드 또한 앞에 static을 사용한 정적 메서드이다. Console.WriteLine도 Console 클래스에 정의된 WriteLine 정적 메서드를 가리킨다.
C# APP | CLR | .Net Win OS0 HW Static Method는 Static 멤버 (변수, method)만 접근 가능
메인 메서드 인자 사용
위 예제는 Dos환경에서 메인 메서드의 매개변수인 string [] args를 사용해보는 방법이다. 저번에 했던 방식으로 Program.cs파일을 csc Program.cs 명령으로 컴파일해서 실행파일을 만든다. 실행파일을 명령행 환경에서 실행시키는 방법은 두 가지이다. Program.exe 명령 또는 Program (인자)로 string타입인 args에 인자를 줄 수 있다.
위 예제는 args.Length를 활용해서 입력하는 개수대로 좌표와 값을 출력하는 예제이다.
Main 메서드도 리턴 값을 줄 수 있는데, 보통 정상적인 종료를 할 경우 0을 리턴한다. 이 내용을 보려면 'echo % ERRORLEVEL%'라는 명령을 주면 0 이외의 다른 값은 오류의 종류에 따라 다른 숫자를 할당한다. 보통 프로젝트를 진행할 때 미리 숫자와 오류 내용을 매칭 해서 프로그래밍할 경우, 문제가 생겼을 때 무슨 문제인지 빠르게 알 수 있다.
정적 생성자
정적 생성자는 클래스의 어떤 멤버든 최초로 접근하는 시점에 단 한 번만 실행된다. 주로 정적 멤버를 초기화하는 기능을 하기 때문에 형식 이니셜 라이저(type initializer)라고도 한다.
위 예제를 보면 처음에 생성된 person1은 생성자와 정적 생성자 모두 실행이 되는 것을 볼 수 있지만, 두 번째 person2는 그냥 생성자만 실행되는 것을 볼 수 있다. 정적 생성자는 최초로 접근하는 시점에 한 번만 생성되고 그 어떤 코드보다 우선적으로 실행되므로 위와 같은 결과가 나온다. 또한 정적 생성자는 어떤 생성자보다 순서가 우선적으로 생성된다.
접근 제한자
Private 내부에서만 접근을 허용한다. 우리말로 "사설","개인"."전용"이라고 상황에 따라 섞어서 표현하기도 한다. Protected 내부에서의 접근과 함께 파생 클래스에서만 접근을 허용한다. public 내부 및 파생 클래스에서의 접근뿐만 아니라 외부에서도 접근을 허용한다. 우리말로 보통 "공용" 이라는 표현을 쓴다. internal 동일한 어셈블리 내에서는 public에 준한 접근을 허용한다. 다른 어셈블리에서는 접근할 수 없다. internal protected 동일 어셈블리 내에서 정의된 클래스이거나 다른 어셈블리라면 파생 클래스인 경우에 한해 접근을 허용한다.(protected internal로도 지정 가능). 즉, internal 또는 protected 조건이다. 아무것도 안 적으면 private
네임스페이스
같은 의미의 두 단어 배(ship) 배(pear)를 우리는 쉽게 이해할 수 있지만, 컴퓨터는 차이점을 이해하지 못한다 컴퓨터는 똑같은 이름에 대해 충돌이 일어난다.
또한 지구라는 두 개의 행성이 있다고 생각해보자. 우리 은하의 지구와 안드메다은하의 지구. 똑같은 지구인데 어떻게 구별을 할 것인가. 이 문제를 네임스페이스가 해결한다.
namespace 우리은하
{
class 지구
{
}
}
namespace 안드로메다 은하
{
class 지구
{
}
}
그렇다면 표현을 할 때는 우리 은하.지구, 안드로메다.지구로 구분할 수 있을 것이다. 하지만 이렇게 되면 적어야 할 문자가 많아져서 가독성이 떨어지고 프로그래밍할 때 시간이 늘어나게 될 것이다.
System.Console.WriteLine("Hello World!");
우리가 실습 중에 많이 사용한 이 명령어도 네임스페이스의 예제이다. 하지만 위 줄을 보면 평소 사용하던 예제와 한 가지가 다른 것을 알 수 있다. 바로 System.이다. System의 네임스페이스에 Console의 클래스 안에 WirteLine이라는 메서드를 사용하겠다는 의미인 것이다. 여기서 System이 생략된 이유는 제일 앞줄에 Using System 이 선언된 것을 볼 수 있다. 이렇게 네임스페이스를 사용하게 되면 프로그래밍을 할 때 적어야 될 줄이 적어지는 효과를 볼 수 있다. 또한 고유한 네임스페이스를 선언하면 대규모 프로그래밍 프로젝트에서 클래스 및 메서드 이름의 범위를 제어할 수 있다.
'C#' 카테고리의 다른 글
C# Object Class(조상)+메서드 4종세트, 배열의 조상(System.Array) base, 다형성 (교육 12일차) (0) 2020.06.02 C# 캡슐화, 정보 은닉, 상속, 클래스 형변환 (교육 11일차) 메모리 주소확인 (0) 2020.06.01 C# 명령행 컴파일러, *클래스* (교육9일차) (0) 2020.05.28 C# 객체지향, 구조체, 배열(교육8일차) (0) 2020.05.27 C# 반복문 (교육 7일차) (0) 2020.05.26