본문 바로가기
컴퓨터/C#

[C#] 종료자, 정적멤버와 인스턴스멤버, 정적 메서드, 접근제한자, 싱글톤

by 아기상어  2020. 5. 29.

 

 

종료자(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);
            }

        }

 

네임스페이스

이름이 중복되어 정의되는 것을 구분하려는 의도에서 나온것.
현재는 클래스를 분류하는 방법으로 더 많이 사용되고있다.