클래스 멤버를 정의할 때 사용된다.

static으로 정의된 멤버는 객체 인스턴스에 속하는 것이 아닌 클래스 자체에 속하게 된다.

즉, 객체가 인스턴스화되기 전에도 해당 멤버에 접근이 가능한데 클래스 자체에 속하기 때문에 클래스 이름을 통해서 직접 호출이 가능하다.

 

class MyClass
{
	public static int myStaticVariable;
    public static void myStaticMethod(){}
}

class OtherClass
{
	public void SomeFunc()
    {
    	MyClass.myStaticVariable = 10;
    	MyClass.mySaticMethod();
    }
}

 

static 멤버는 모든 인스턴스에 공유되기 때문에 한 객체에서 static 멤버에 대한 수정이 있는 경우 다른 객체에서도 동일한 값을 가지게 된다. 따라서 static 멤버는 클래스의 인스턴스와 관련이 없는 작업을 수행할 때 사용되며 일반적으로 유틸리티 클래스의 메서드나 상수 특정 클래스에서 공통으로 사용하는 변수 등을 정의할 때 static 키워드가 사용된다.

 

주의할 점은 모든 객체에서 공유되므로 서로 다른 스레드에서 동시에 static 멤버를 수정하는 상황이 발생할 수 있는 즉, thread-safe 하지 않기 때문에 멀티스레드 환경에서는 문제가 발생할 수 있다.

 

이러한 특징 때문에 static을 사용할 때는 몇가지 당연한 규칙이 있다.

 

우선 static 클래스의 모든 멤버는 static으로 선언되어야 한다.

클래스가 static이라는 것은 별도의 인스턴스를 생성하지 않아도 해당 클래스를 어디서든 사용이 가능하고 항시 메모리에 올라가 있는 상태라는 뜻이므로 인스턴스가 생성될 때 변수 할당이 이루어지는 일반 변수의 선언은 허용되지 않게 된다.

 

public static class MyStaticClass
{
	// 불가능
    public int number_1;
    // 가능
    public static int number_2;
    static int number_3;
}

 

하지만 반대로 static 클래스가 아니어도 내부의 멤버가 static으로 선언되는 것은 가능하다. 

 

public class MyClass
{
	public static int MyStaticVar = 0;
    public int MyVar = 0;
}

 

정리

static은 처음 선언된 이후 메모리에 상주하기 때문에 언제든 접근 가능하다.

따라서 빈번하게 사용되는 공통적인 변수의 경우 정적으로 선언해서 사용하는 것이 좋을 수 있지만 너무 많은 static을 사용하게 되면 그만큼 상주하는 메모리가 많아지는 것이기 때문에 적절한 사용이 필요하다.

728x90
반응형

readonly

변수 앞에 위치하면 해당 변수는 읽기 전용이 되어 해당 변수가 정의된 클래스나 구조체, 메서드 등에서만 수정이 가능하며 readonly로 선언된 변수는 선언할 때 또는 생성자에서 값을 할당해야한다.

 

public class MyClass
{	
	readonly int myReadOnlyInt;
    public MyClass(int value)
    {
    	myReadonlyInt = value;
    }
}

위 코드에서 myReadOnlyInt는 읽기 전용으로 선언되었기 때문에 생성자에서 값을 할당한 이후에는 변경이 불가능하다.

 

상수를 선언한다는 점에서 const와 비슷한데 둘의 차이를 비교할 필요가 있다.

 

const vs readonly

초기화 방법

const와 readonly는 초기화 방법에서부터 차이가 있다.

// 반드시 선언과 동시에 초기화 필요
const int constNum = 10;

// 선언에서 뿐만 아니라 생성자에서 값을 할당해서 초기화 할 수 있다.
readonly int readonlyNum_1 = 10;
readonly int readonlyNum_2;
public MyClass(int value)
{
	readonlyNum_2 = value;
}

 

사용 범위

const는 클래스 멤버 또는 데이터 형식 멤버로 선언할 수 있지만 클래스 멤버 중에서도 인스턴스 멤버는 const 키워드를 사용할 수 없다. 즉 인스턴스 변수, 인스턴스 메서드 등에서는 const 키워드 사용이 불가능하다.

public class MyClass
{
    public const int number = 10;
    public void Test()
    {
        int test = number;
    }
}

public static class MyStaticClass
{
    public const int number = 20;
    public static void Test()
    {
        int test = number;
    }
}

public class OtherClass()
{
    public void TestMethod()
    {
        MyClass instance = new MyClass();
        // 접근 불가능함
        int test1 = instance.number;
        
		// static 클래스 인스턴스화 안됨
        //MyStaticClass staticInstance = new MyStaticClass();
        // 직접 호출가능
        int test2 = MyStaticClass.number;
    }
}

 

실행시간

const는 컴파일 시간에 값이 결정되기 때문에 런타임 성능이 상대적으로 좋다.

readonly는 런타임에 값을 할당할 수 있기 때문에 const보다는 조금 더 느릴 수 있다. 

그렇기 때문에 런타임에 값을 결정해야할 경우에만 readonly를 사용하고 그 이외에는 const를 사용하는게 낫다.

 

public class MyClass
{
    public const int number = DateTime.Now.Year; // 컴파일 에러 발생
    public readonly int year = DateTime.Now.Year; // 실행 시간에 값이 결정됩니다.
}

 

const와 readonly의 가장 큰 차이점은 값이 결정되는 시점이다.

const는 컴파일 타임 readonly는 런타임

 

따라서 애초에 고정된 값이라면 const를 사용하지만 인스턴스가 생성될 때 값을 할당하고 그 이후에 변경되지 않도록하려면 readonly를 사용하면된다.

728x90
반응형

마이크로소프트사에서 개발한 프로그래밍언어이다. 특정 프레임워크내에서 사용하도록 만들어졌으며 다루기 쉽고 편리한 기능들을 지원한다.

 

Feature

- .Net 프레임워크내에서 사용되는 언어이다.

- 다중 패러다임을 지원한다.

- C, C++, Java와 문법이 비슷하다.

- 자동으로 메모리를 관리한다.

- 모든 메서드와 변수는 클래스내에서 선언된다.

 

.Net Framework 정리글

 

Object-Oriented Programming

객체지향 프로그래밍

C# 은 모두 클래스 단위로 만들어지고 사용된다.

사용하려는 함수, 변수를 하나의 객체로 만들어 사용하는것이 특징이며 전역 변수나 전역 함수와 같은 방식은 허용되지 않으며 어디서든 사용하기 위한 함수나 변수를 선언하기 위해서는 정적 클래스를 선언하고 그 내부에 함수와 변수를 선언하고 해당 정적 클래스를 통해 접근해서 사용하는 방식을 권장한다.

 

Multi-Paradigm Programming

하나의 프로그래밍 언어에서 하나의 패러다임에 국한되지 않고 여러 가지 프로그래밍 패러다임을 지원하는 것을 의미한다. 이 패러다임이란 사고 방식이나 문제 해결을 위한 접근 방식 그리고 특정 언어의 디자인 패턴과 같은 것을 말한다,

* Paradigm : 어떤 분야에서의 일관된 이론적 모델이나 철학적 접근 방식을 말한다.

 

Structed Programming

구조적 프로그래밍은 선택 및 반복 그리고 블록 구조 및 서브루틴의 구조화된 제어 흐름을 광범위하게 사용하여 컴퓨터 프로그램의 명료성, 품질 및 개발 시간을 향상시키는 것을 목표로한다.

 

Imperative Programming

명령형 프로그래밍은 프로그램의 상태를 Statements를 사용해 변경시키는 것을 말하며 명령적 프로그래밍은 컴퓨터가 수행할 명령으로 구성된다. 프로그램의 예상 결과에 대한 높은 수준의 설명보다 단계별로 프로그램이 작동하는 방식을 설명하는데 중점을 둔다.

 

Object-Oriented Programming

객체 지향 프로그래밍은 데이터와 코드를 포함할 수 있는 객체의 개념을 기반으로 하는 프로그래밍 패러다임이다.

데이터는 필드의 형태이고 코드는 절차의 형태를 한다. 객체는 일반적으로 프로시저나 메서드가 붙어있고 그것들을 통해서 객체의 데이터에 접근하고 수정하는 형태를 가진다.

 

Event-Driven Programming

이벤트 기반 프로그래밍은 마우스 클릭, 키 입력같은 사용자 동작이나 센서 출력, 메시지 전달 등의 이벤트에 의해 프로그램의 흐름이 결정되는 방식이다.

 

Asnychronous Method Invocation

비동기 메서드 호출, 멀티스레드 컴퓨터 프로그래밍에서 호출된 코드가 끝나기를 기다리는 동안 다른 호출이 차단되지 않는 설계 패턴이다. 응답이 도착하면 호출 스레드가 알려지고 응답에 대한 폴링은 되지 않는다.

* Polling

스레드에 플래그를 놓아 값이 준비되면 플래그를 메인 프로그램에 전달해주는 것을 말한다. 메인 프로그램에서는 주기적으로 스레드에 값이 준비되었는지 확인하는 작업이 필요하다.

 

Functional Programming

함수형 프로그래밍은 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임이다. 자료처리를 수학적 함수의 계산처럼 취급한다.

 

Generic Programming

범용 프로그래밍은 하나의 코드를 통해 다양한 타입을 처리하는 것을 말한다.

 

Reflective Programming

Reflection을 활용하는 프로그래밍 패러다임이다.

* Reflection

런타임 시점에서 자신의 구조와 행위를 관리하고 수정할 수 있는 프로세스를 뜻한다. 

행위 관리(Type Introspection) 은 런타임에서 객체의 타입을 결정할 수 있는 능력을 의미한다.

 

Concurrent Computing

동시 컴퓨팅, 프로세스에 대해 별도의 실행 지점 또는 제어 스레드가 있는 시스템 속성이다. 동시 시스템은 다른 연산이 완료될 때까지 기다리지 않고 연산이 진행될 수 있는 시스템이다.

모듈러 프로그래밍의 한 형태로 전체적인 계산은 동시에 실행될 수 있는 서브 컴퓨터에 반영된다.

 

Garbage Collection

C#이 다른 언어들과 가장 큰 차이를 보이는 부분은 메모리 관리에 있다. 메모리는 GC(Galbage Collector)를 통해서 관리된다. GC는 동적으로 할당된 메모리에 대해서 특정 시점에 특정 조건을 통해서 더 이상 사용되지 않는다고 판단되는 할당된 메모리를 해제하는 작업을 한다. 

 

GC는 사용자로 하여금 메모리 관리에 신경쓰지 않아도 되는 편의성을 제공하지만 동시에 메모리에 대해서는 사용자가 관리할 수 없다는 단점도 가지고 있다. 

 

Static

C#에서는 모든 메서드나 변수의 선언은 클래스 내부에서 가능하다. 즉 다른 언어처럼 전역으로 선언하고 어디서든 호출할 수 있게 만드는게 불가능하다.

애초에 C#은 어떤 클래스든 다른 클래스에서 호출하는것이 가능하기 때문에 전역으로 선언이 사용될 필요가 없게 되는데 이때 매번 인스턴스를 생성하는게 불편하다면 정적 클래스를 생성하고 그 내부에 메서드와 변수를 선언하여 사용하면 된다.

 

 

 

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 비동기화 키워드 : async, await  (0) 2023.01.31
C# 클래스 추상화 키워드 : abstract  (0) 2023.01.25
Main method  (0) 2023.01.19
테스트 환경  (0) 2023.01.17
.Net Framework  (0) 2023.01.17

+ Recent posts