종료자(finalizer)
디폴트 생성자에 틸드(~)를 붙인다
~생성자명()
{
}
특수한 경우에만 쓰인다.
생성자가 두개 생성되고 동시에 사라질때 나중에 선언된 생성자가 먼저 소멸한다.
stack과 비슷하다고 생각하면됨.
{
Console.WriteLine("현재 속도는 {0}Km입니다.", _iSpeed);
Console.WriteLine("Car 종료자 호출");
}
정적멤버, 인스턴스 멤버
Static
클래스이름.정적필드
정적(static) 동적(Dynamic)
실체화 한 것을 객체 또는 인스턴스라고 한다. new 연산자를 거쳐서 할당된 객체 멤버를 인스턴스 멤버 라고 한다.
static 변수는 컴파일 할 때 생성된다(파일에 존재). new는 프로그램이 실행될 때 생성되므로(램에 존재)
즉, new로 만든 메서드, 필드, 생성자는 인스턴스 멤버
static은 정적 멤버이다.
그렇다면 static은 언제쓰이는가? new로 50개의 객체를 선언했다 생각했을때,
50개의 객체가 공통으로 쓰는 변수가 필요할 때 유용하게 쓰인다.
ex) public static int CountOfInstance; // 객체의 갯수를 저장
폰 노이만이 만든 프로그램 적재 방식. 연산 -> cpu, 기억공간 -> 램, hdd
Main문도 클래스 안에 있기 때문에 접근하려면 static이 붙어야함.
class Person
{
public static string _name; // 인스턴스 필드
public Person(string name)// 인스턴스 생성자
{
_name = name;
}
public void OutputYourName() // 인스턴스 메서드
{
Console.WriteLine(_name);
}
}
class Program
{
static void Main(string[] args)
{
// Person person = new Person("홍길동");
// person.OutputYourName();
// Console.WriteLine(person._name); // static변수는 Person으로만 참조, 사용가능
Person._name = "홍길동";
Console.WriteLine(Person._name); // Person으로 접근해야함
//static은 실행파일이 생성될때 미리 생성된다.
//new는 런타임 일때 생성되서 아직 생성되지 않았기 때문에 static 변수에 접근할때 에러가 뜸
}
}
정적메서드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200529_002
{
class Person
{
public string _name; // 인스턴스 필드
static public int CountOfInstance;
public Person(string name)// 인스턴스 생성자
{
_name = name;
CountOfInstance++;
}
public void OutputYourName() // 인스턴스 메서드
{
Console.WriteLine(_name);
}
static public void OutputCount()
{
Console.WriteLine(CountOfInstance);
}
}
class Program
{
static void Main(string[] args)
{
Person.OutputCount();
Person person1 = new Person("홍길동");
Person.OutputCount();
Person person2 = new Person("홍길순");
Person.OutputCount();
person1.OutputYourName();
person2.OutputYourName();
}
}
}
Console.WriteLine(_name); // Console 타입에 정의된 정적메서드 사용
정적생성자
생성자 앞에 static을 붙일수있다. 주로 static을 초기화 할떄 쓰인다.
일반생성자가 처음 호출할 경우나 인스턴스 생성자를 통해 객체가 만들어 질 때 어떤코드보다 우선적으로 실행되고,
정적생성자는 단 한번만 실행된다. 객체참조변수(Person person1;)를 호출할땐 호출되지 않고
매개변수도 포함할 수 없다.
접근제한자
private - 내부에서만 접근 가능(내방), 아무것도 선언하지 않은 class 내부의 멤버는 private
protected - 내부, 파생클래스 에서 접근 가능(집)
public - (도로)
internal - 동일한 어셈블리(C# 내부에 있음 언어아님)
internal protected -
싱글톤
특정 클래스의 인스턴스를 의도적으로 단 한개만 만들고 싶은 경우.
이 클래스의 밖에서 해당 클래스의 인스턴스를 만들지 못하게끔 생성자를 private로 선언하고
단 하나의 인스턴스만 클래스 내부에 미리 생성하면 된다.
class Person
{
static public Person President = new Person("대통령");
string _name;
private Person(string name)
{
_name = name;
}
public void DisplayName()
{
Console.WriteLine(_name);
}
}
네임스페이스
이름이 중복되어 정의되는 것을 구분하려는 의도에서 나온것.
현재는 클래스를 분류하는 방법으로 더 많이 사용되고있다.
'컴퓨터 > C#' 카테고리의 다른 글
[C#] 캡슐화, 상속 (0) | 2020.06.01 |
---|---|
[C#] Main문 매개변수 args 사용해보기, ERRORLEVEL 환경변수로 return값 확인 (0) | 2020.05.31 |
[C#] 메모장에 소스적어 컴파일 하기 (0) | 2020.05.29 |
[C#] 클래스 (0) | 2020.05.28 |
[C#] 구조체와 배열 (0) | 2020.05.27 |