pass by value vs pass by reference vs pass by output

http://dis.dankook.ac.kr/lectures/hci10/entry/pass-by-value와-pass-by-reference와-pass-by-output-비교

pass value type by value (값형식을 값에 의한 전달)
pass reference type by value (참조형식을 값에 의한 전달)
-copy of reference가 전달

pass value type by reference (값형식을 참조에 의한 전달)
ref 키워드 사용
pass reference type by reference (참조형식을 참조에 의한 전달)
ref 키워드 사용

pass value type by output (값형식을 output에 의한 전달)
out 키워드 사용
pass reference type by output (참조형식을 output에 의한 전달)
out 키워드 사용

static class vs singleton design pattern

공용 데이터를 저장하여 사용하고자 할 때, singleton 패턴이나 static 클래스를 사용한다.

싱글톤 패턴 (Singleton design pattern)
-싱글톤 패턴이란 single instance object(해당 클래스의 인스턴스 하나)가 만들어지고, 어디서든지 그 싱글톤에 접근할 수 있도록 하기 위한 패턴

정적 클래스 (Static class)
-static 키워드를 사용한 정적 클래스는 정적 멤버만 포함 가능
-정적 클래스는 new 키워드를 사용하여 정적 클래스의 인스턴스를 생성할 수 없음
-정적 클래스는 봉인 클래스 (sealed class) 임
-static 클래스는 single-instance, global 데이터를 저장하여 사용하는 용도로 적당
-그러나, 싱글톤은 인자(parameter)나 객체(object)로 사용가능하나 정적클래스는 불가능

http://dis.dankook.ac.kr/lectures/hci10/entry/singleton-pattern과-static-class-비교

Instance Field vs Static Field

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

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

class ValueClass
{
private int value = 0; // 인스턴스 필드
private 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(); // 인스턴스 메소드
ValueClass.printString(“test”); // 정적 메소드 (클래스명.정적메소드명)
ValueClass c2 = new ValueClass();
c2.setValue(20); // 인스턴스 메소드
c2.print(); // 인스턴스 메소드
Console.WriteLine(“number of ValueClass: {0}”, ValueClass.getCount()); // 정적 메소드 (클래스명.정적메소드명)
}
}

C# Class

protected
-protected 접근 지정자를 사용한 멤버 필드와 메소드는 파생 클래스에서는 사용가능하나 클래스 외부에서는 호출하지 못함

static
-static field는 전역 데이터로 클래스당 하나만 할당됨
-클래스명.정적필드명 형태로 사용
-static method는 class method나 static member field 조작을 위한 메소드
-static method는 instance field는 접근 불가능

constructor
-default constructor (기본 생성자)
-constructor overloading (생성자 오버로딩) 생성자를 여러 가지 형태로 정의
-constructor initializer (생성자 초기화 목록) 생성자들 사이의 정의가 비슷한 경우 코드를 간략하게 만들기 위해 사용

-private constructor (private 생성자) 정적 멤버만 포함하는 클래스에서 사용하며 클래스가 인스턴스화 될 수 없음을 분명히 하기 위해 private 접근 지정자를 사용
-static constructor (static 생성자) 정적 데이터 멤버를 초기화하는데 사용

destructor
-객체가 소멸될 때 필요한 정리 작업을 정의하는 부분    

TodayCurrencyExchangeRate

        // 네이버 오늘의 환율 시세 출력 (C#)
        public void PrintTodayCurrencyExchangeRates()
        {
            WebClient client = new WebClient();
            client.Headers.Add(“Referer”, “http://blog.naver.com/usback“);
            Stream xmlDataStream = client.OpenRead(
                        “http://www.naver.com/include/timesquare/widget/exchange.xml“);
            XmlReader reader = XmlReader.Create(xmlDataStream);
            reader.MoveToContent();
            while (reader.ReadToFollowing(“currency”))
            {
                reader.ReadToFollowing(“hname”);
                string hname = reader.ReadElementContentAsString(“hname”,
                                                  reader.NamespaceURI);
                reader.ReadToFollowing(“standard”);
                double standard = reader.ReadElementContentAsDouble(“standard”,
                                                  reader.NamespaceURI);
                reader.ReadToFollowing(“buy”);
                double buy = reader.ReadElementContentAsDouble(“buy”,
                                                  reader.NamespaceURI);
                reader.ReadToFollowing(“sell”);
                double sell = reader.ReadElementContentAsDouble(“sell”,
                                                 reader.NamespaceURI);
                reader.ReadToFollowing(“sign”);
                string sign = reader.ReadElementContentAsString(“sign”,
                                                 reader.NamespaceURI);
                Console.WriteLine(“{0}\t{1}\t{2}\t{3}\t{4}”, hname, standard, buy, sell, sign);
            }
        }