All posts by kpark
Operator & Statement & Method
Arithmetic Operator
Temperature Converter
Break Statement vs. Continue Statement
Recursive Method
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;
}
#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 }
String.Substring Method
http://msdn.microsoft.com/ko-kr/library/system.string.aspx
Substring(Int32) | 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작됩니다. |
Substring(Int32, Int32) | 이 인스턴스에서 부분 문자열을 검색합니다. 부분 문자열은 지정된 문자 위치에서 시작하고 길이도 지정되어 있습니다. |
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-비교
HW0
HW0-Your First C# Program 실행 리포트
(Due by 9/14)
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