Person Struct (in C#)


// Person.cs
using System;


namespace PersonStructCsharp
{
    struct Person
    {
        // instance member field
        public string name;
        public int age;


        // constructor & destructor
        public Person(string n, int a) { this.name = n; this.age = a; }


        // method
        public void SetName(string n) { this.name = n; }
        public void SetAge(int a) { this.age = a; }


        public void Print() { Console.WriteLine(“Name={0} Age={1}”, this.name, this.age); }        


        public string GetName() { return this.name; }
        public int GetAge() { return this.age; }


    }
}




// PersonStructCsharp.cs
using System;

namespace PersonStructCsharp
{
    class PersonStructCsharp
    {
        static void Main(string[] args)
        {
            Person p1; // 멤버변수가 public일경우 Person p1으로 사용가능하나
            p1.name = “고소영”; // 반드시 모든 멤버변수의 값을 초기화해야함
            p1.age = 5;         // 멤버변수가 모두다 초기화되지 않음 사용불가능
            p1.Print();           // 멤버변수가 초기화가 되야 비로소 멤버함수도 사용가능


           // 일반적으로 C#에서 struct을 사용하는 형태
           // 단 default construct 경우, string은 null로, int는 0으로 초기화를 함
            p1 = new Person();            
            p1.Print();
            p1.SetName(“이나영”);
            p1.SetAge(10);
            p1.Print();


           // 더욱 일반적으로 C#에서 struct을 사용하는 형태
            Person p2 = new Person(“소간지”, 20);
            p2.Print();
        }
    }
}

Person Struct (in C++)


// person.h
#ifndef __PERSON_H__
#define __PERSON_H__
#include <string>


struct Person 
{
public:
 // constructor & destructor
 Person() : name(“”), age(0) {}
 Person(std::string n, int a) : name(n), age(a) {}
 ~Person() {}


 // member function
 void SetName(std::string n);
 void SetAge(int a);
 void Print();


protected:
 // member variable
 std::string name;
 int age;
};


#endif




// person.cpp
#include <iostream>
#include “Person.h”


void Person::SetName(std::string n)
{
 name = n;
}


void Person::SetAge(int a)
{
 age = a;
}


void Person::Print()
{
 std::cout << “Name=” << name << ” Age=” << age << std::endl;
}



// main.cpp
#include <iostream>
#include “Person.h”
void main()
{
 Person p1(“고소영”, 5);  // 인스턴스 생성 (초기화)
 Person *p2;
 p1.Print();     // 고소영, 5 출력

 p1.SetName(“이나영”);  // 이름 지정
 p1.SetAge(10);    // 나이 지정
 p1.Print();     // 이나영, 10 출력

 std::cout << std::endl;
 p2 = new Person;  // dynamic allocation
 if (p2) {
  p2->SetName(“소간지”);
  p2->SetAge(20);
  p2->Print();   // 소간지, 20 출력
 }
 delete p2;
}

Person Struct (in C)


/* person.h */
#ifndef __PERSON_H__
#define __PERSON_H__


typedef struct _Person
{
 char name[256];
 int age;
} Person;


void SetPersonName(Person * p, char * n);
void SetPersonAge(Person * p, int a);
void PrintPerson(Person p);


#endif




/*
person.cpp: implementation of the Person struct.
*/
#include <stdio.h>
#include <string.h>
#include “Person.h”


void SetPersonName(Person * p, char * n)
{
 strcpy((*p).name, n);
}


void SetPersonAge(Person * p, int a)
{
 (*p).age = a;
}


void PrintPerson(Person p)
{
 printf(“Name=%s Age=%d\n”, p.name, p.age);
}




/* main.cpp */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “Person.h”


void main()
{
 Person p1;  /* 변수 값 초기화 필요 */
 Person * p2;


 strcpy(p1.name, “고소영”);
 p1.age = 5;
 PrintPerson(p1);    /* 현재 값 출력 */
 SetPersonName(&p1, “이나영”); /* 변수 값 지정 */
 SetPersonAge(&p1, 10);   /* 변수 값 지정 */
 printf(“\n”);
 printf(“p1.name = %s, p1.age = %d\n”, p1.name, p1.age);


 /* dynamic memory allocation */
 p2 = (Person *) malloc(sizeof(Person));
 if (p2) {
  SetPersonName(p2, “소간지”);/* 변수 값 지정 */
  SetPersonAge(p2, 20);  /* 변수 값 지정 */
  PrintPerson(*p2);   /* 현재 값 출력 */
  printf(“\n”);
  printf(“p2->name= %s, p2->age = %d\n “, p2->name, p2->age);
 }
 free (p2);
}


C# Struct

C++에서는 struct와 class간에 차이가 거의 없으며, 차이점은 아무런 명시를 하지 않았을 때 class는 멤버가 private 권한을 가지고, struct는 멤버가 public 권한을 가진다.

C#에서는 struct와 class가 유사하나 매우 다른 특징을 가진다.
-C# struct는 Value Type (값 형식)으로, 즉 stack영역에 데이터를 생성해서 사용함
-C# struct는 Default Constructor (기본생성자)나 Destructor(소멸자)선언할 수 없음
-C# struct는 다른 struct/class를 상속받을 수 없으며 파생시킬수도 없음 (따라서, protected는 선언할 수 없음)
-C# struct는 interface를 구현할 수 있음
-C# struct는 nullable type으로 사용할 수 있음
-C# struct는 일반적으로 new를 사용해서 객체를 생성하나 (예: Person p = new Person();),
stack영역에 데이터를 생성해서 사용함

public struct Point
     {
         int x = 1;  //Illegal: cannot initialize field
         int y;

         public Point() { } //Illegal: cannot have parameterless constructor
         public Point(int x) { this.x = x; } //Illegal: must assign field y
     }

  http://www.codeproject.com/Articles/8612/Structs-in-C

String.Substring Method

http://msdn.microsoft.com/ko-kr/library/system.string.aspx





Substring(Int32) 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작됩니다.





Substring(Int32, Int32) 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작하고 길이도 지정되어 있습니다.

string str = “Hi, Welcome to HCI Programming II! Hi”;
Console.WriteLine(“str의 substring(3) {0}”, str.Substring(3)); // ” Welcome to HCI Programming II! Hi” 3번째 위치에서 떼어냄

Console.WriteLine(“str의 substring(14, 20) {0}”, str.Substring(14,20)); // ” HCI Programming II!” 14번째 위치에서부터 20개 만큼 떼어냄

C# DataType

Stack vs Heap
http://dis.dankook.ac.kr/lectures/hci10/entry/Stack과-Heap-비교
http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap

C# ValueType vs Reference Type
http://dis.dankook.ac.kr/lectures/hci10/entry/Value-Type과-Reference-Type의-비교

C# Boxing vs Unboxing
http://dis.dankook.ac.kr/lectures/hci10/entry/Boxing과-Unboxing-비교

C# Convert.ToInt32 vs Int32.Parse vs Int32.TryParse
http://dis.dankook.ac.kr/lectures/hci10/entry/ConvertToInt32와-Int32Parse와-Int32TryParse-비교

Stack vs Heap

스택(Stack)은 Last-In, First-Out(LIFO) 방식으로 아이템을 저장하는 메모리의 자료 구조이다.
스택(Stack)은 지역변수(local variable)와 함수 리턴주소를 저장한다. C#에서 값형식(Value Type) 데이터는 스택에 저장된다.

힙(Heap)은 프로그램 코드 영역과는 별도로 유지되는 자유 메모리 공간이다.
힙(Heap)은 C#에서 new를 사용하여 메모리 할당하여 이 공간을 사용할 수 있다.
힙에 할당된 데이터는 전역변수(global variable)처럼 프로그램이 종료될 때까지 유지된다.
C#에서는 더이상 참조하지 않는 데이터를 자동으로 해제해준다 (gabage collection).
C#에서는 참조형식(Reference Type)은 스택에 메모리 주소를 저장하고 힙에 실질적인 데이터가 저장된다.

http://en.csharp-online.net/Stack_vs._Heap

http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap