static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. - 스택틱 변수는 객체를 선언만 해도 메모리가 할당되며 일반적인 변수들이 객체가 새로 생성될 때 메모리가 초기화 되는 것과 다르게 해당 객체를 계속 반복적으로 생성해도 메모리가 유지 된다는 특징이 있다.
인스턴스(객체) 생성 없이 바로 사용 가능하다.
객체를 생성하지 않아도 되니까 편리하고 속도도 빠르다.
# static 키워드를 사용하는 이유?
자주 변하지 않는 일정한 값(정적 값) 혹은 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩 혹은 값을 읽어 들이는 것보다 일종의 '전역 변수'와 같은 개념을 통해서 접근하는 것이다.
인스턴스 생성 없이 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용한다.
클래스의 일반 멤버 변수는 클래스의 객체가 생성될 때, 각 객체마다 따로 생기지만, 정적 변수는 해당 클래스가 처음으로 사용되는 때에 한번만 초기화되어 계속 동일한 메모리를 사용하게 된다.
# static (정적) 메서드
정적(Static) 메서드는 인스턴스 메서드와는 달리 클래스로부터 객체를 생성하지 않고 직접 [클래스명.메서드명] 형식으로 호출하는 메서드이다.
메서드 앞에 static C# 키워드를 적어주며, 메서드 내부에 클래스의 인스턴스 객체 멤버를 참조해서는 안된다.
static 메서드는 인스턴스 객체로부터 호출될 수 없으며, 반드시 클래스명과 함께 사용된다.
* 예제코드
public class MyClass
{
private int val = 1;
// 인스턴스 메서드
public int InstRun()
{
return val;
}
// 정적(Static) 메서드
public static int Run()
{
return 1;
}
}
public class Client
{
public void Test()
{
// 인스턴스 메서드 호출
MyClass myClass = new MyClass();
int i = myClass.InstRun();
// 정적 메서드 호출
int j = MyClass.Run();
}
}
# static (정적) 속성, 필드
클래스 내의 Non-static 필드들은 클래스 인스턴스를 생성할 때 마다 메모리에 매번 새로 생성되게 되는 반면, static 필드는 프로그램 실행 후 해당 클래스가 처음으로 사용 될 때 한번 초기화되어 계속 동일한 메모리르 사용.
* 예제코드
// static 필드
protected static int _id;
// static 속성
public static string Name { get; set; }
# static 클래스
static 클래스는 모든 클래스 멤버가 static 멤버로 되어 있으며, 클래스명 앞에 static 이라는 C# 키워드를 사용.
static 클래스는 public 생성자(Constructor)를 가질 수 없지만, static 생성자를 가질 수 있다. - static 클래스는 객체를 생성할 수 없기 때문이다.
static 생성자는 주로 static 필드들을 초기화 하는데 사용한다.
static 생성자는 액세스 한정자를 사용할 수 없으며, 매개변수 역시 가질 수 없다.
* 예제코드
// static 클래스 정의
public static class MyUtility
{
private static int ver;
// static 생성자
static MyUtility()
{
ver = 1;
}
public static string Convert(int i)
{
return i.ToString();
}
public static int ConvertBack(string s)
{
return int.Parse(s);
}
}
// static 클래스 사용
static void Main(string[] args)
{
string str = MyUtility.Convert(123);
int i = MyUtility.ConvertBack(str);
}
# 스태틱의 장, 단점
장점
- 프로그램이 종료되기 전까지 메모리를 해제 하거나 객체를 생성하지 않아도, 멤버에 접근이 가능하다는 장점이 있다.
단점
- 여러곳에서 스태틱 멤버를 동시에 참조하게 될 경우에는 객체 지향에 벗어난 개념이 안좋다.
프로그래밍 구조상 call by Value를 하면 복사가 되기 때문에 메모리량이 늘어난다.
요즘은 기기의 성능이 종아져서 상관이 없다지만 많은 계산이 들어간다면 과부하의 원인이 된다.
하지만 복사처리가 되기 때문에 원래의 값은 영향을 받지 않아서 안전하다.
함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (c++의 경우 stack frame) 함수가 종료되면 해당 공간은 사라진다.
스택 프레임(Stack Frame): 함수 호출 시 할당되는 메모리 블록(지역변수의 선언으로 인해 할당되는 메모리 블록)
call by Value 값에 의한 호출방식은 함수 호출 시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다.
따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되는 않는다.
Java의 경우 함수에 전달되는 인자의 데이터 타입에 따라서(원시자료형 / 참조자료형)함수 호출 방식이 달라진다. - 원시 자료형(primitive type) : call by Value 로 동작 (int, short, long, float, double, char, boolean) - 참조 자료형(reference type) : call by reference 로 동작 (Array, Class Instance)
장, 단점
장점: 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존 된다.
단점: 복사를 하기 때문에 메모리 사용량이 늘어난다.
# Call by reference (참조에 의한 호출)
인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.
함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. (예: stack frame)함수가 종료되면 해당 공간은 사라진다.
call by Reference 참조에 의한 호출방식은 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.)
따라서 함수 안에서 인자의 값이 변경되면, Arguement 로 전달된 객체의 값도 함께 변경된다.
XAML 상에서 각각의 Item 들에게 이름을 붙여줄 수 있는 Attribute로서, 단순히 이름을 붙여줌과 동시에 핵심 기능은 Code-behind 에서 해당 Item을 참조할 수(사용할 수)있는 Field)를 만들어주는 것이다. 당연히 Field의 이름은 x:Name에다가 사용자가 지정한 이름이다. 그래서 우리가 XAML에서 선언한 UIElement를 Code-behind에서도 손쉽게 Refer 하여 쓸 수 있었던 것이다.