Instance vs Static Field

Static Field (일명 Class Field)
-전역 데이터, 공유 데이터로 클래스 로딩 시 공간을 할당
-한 클래스에 하나만 정적 필드가 할당됨
-클래스명.정적필드명으로 사용
-클래스 객체의 개수를 카운트하거나 유틸리티 값들을 저장하는 경우 사용함

Instance Field
-객체의 현재 상태를 저장할 수 있는 자료
-객체가 생성될 시 메모리 공간을 할당
-객체명.객체필드명으로 사용

class ValueClass
{
private int value = 0; // 인스턴스 필드
    public static int count = 0; // 정적 필드
    public ValueClass() { count++; }
    public void setValue(int value) { this.value = value; } // 인스턴스 메소드
public int getValue() { return this.value; } // 인스턴스 메소드
public void print() { Console.WriteLine(“value={0}”, this.value); } // 인스턴스 메소드
    public static void printString(string str) { Console.WriteLine(str); } // 정적 메소드
    public static int getCount() { return count; } // 정적 메소드
}
class Program
{
static void main(string[] args)
{
ValueClass c1 = new ValueClass();

        c1.setValue(10); // 인스턴스 메소드
c1.print(); // 인스턴스 메소드 value=10
        ValueClass.printString(“test”); // 정적 메소드 (클래스명.정적메소드명) test
        ValueClass c2 = new ValueClass();
        c2.setValue(20); // 인스턴스 메소드
c2.print(); // 인스턴스 메소드 value=20
        Console.WriteLine(“number of ValueClass: {0}”, ValueClass.getCount()); // 정적 메소드 (클래스명.정적메소드명) number of ValueClass: 2
Console.WriteLine(“number of ValueClass: {0}”, ++ValueClass.count); // 정적 필드 (클래스명.정적필드명) number of ValueClass: 3
    }
}

 

BankAccount Class

class BankAccount
{

double balance; // instance field
string name; // instace field
static double interest; // static field

public BankAccount() : this(1000, “HCI”) // default constructor
{
}

public BankAccount(double balance, string name) // constructor
{

this.balance = balance;
this.name = name;
BankAccount.interest = 0.7; // 0.7%

}

public void Deposit(double amount) // instance method
{

balance += amount;

}

public void Withdrawal(double amount) // instance method
{

balance -= amount;

}

public void Print() // instance method
{

double currentBalance = balance + balance * BankAccount.interest * 0.01;

Console.WriteLine(“{0}의 계좌 잔고는 {1}”, name, currentBalance);

}

public static void SetInterestRate(double interest) // static method
{

BankAccount.interest = interest;

}

}

 

class Program
{

static void Main(string[] args)
{

BankAccount b = new BankAccount(5000, “HCI222222222222”);
b.Print();

b.Deposit(1000);
b.Print();

b.Withdrawal(500);
b.Print();

BankAccount.SetInterestRate(1.5); // 1.5%
b.Print();

BankAccount b2 = new BankAccount();
b2.Print();

}

}

Local Variable vs Field vs Method

Local variables in C# must be initialized before they are used.

https://msdn.microsoft.com/en-us/library/vstudio/s1ax56ch(v=vs.100).aspx

class Test
{

static int test1; // static field test1 = 0 Warning CS0414: The field ‘Test.test1’ is assigned but its value is never used

int test2; // instance field test2 = 0 Warning CS0649: The field ‘Test.test2’ is never assigned to, and will always have its default value 0

public void Foo() // instance method
{

int test3;                 // Declaration only; Not initialized warning CS0168: The variable ‘test3’ is declared but never used
int test4 = test2;         // Ok
//int test5 = test3;         // Error CS0165: Use of unassigned local variable ‘test3’

}

public static void Foo2() // static method
{

test1 = 2;

}

}

class Program
{

static void Main(string[] args)
{

            // Declaration only
            float temperature; // warning CS0168: The variable ‘temperature’ is declared but never used
            string name; // warning CS0168: The variable ‘name’ is declared but never used
            Test myClass; // The variable ‘myClass’ is declared but never used

            // Declaration with initializers 
            double limit = 3.5;
            int[] source = { 0, 1, 2, 3, 4, 5 };
            var query = from item in source
                        where item <= limit
                        select item;

Test.Foo2(); // Static method
// Test.Foo();  // Error CS0120: An object reference is required for the non-static field, method, or property 

}

}