Instance Method vs Static Method

Static Method (일면 Class Method)
-메서드 선언에 static 한정자가 있는 경우 해당 메서드를 정적 메서드라고 한다.
-정적 메서드는 class method나 static member field 조작을 위한 메소드이다.
-정적 메서드 내에서 클래스의 instance field나 method는 접근 불가능하다.
-정적 메서드는 특정 인스턴스에서는 작동되지 않으므로, 정적 메서드 내에서 this를 참조하면 컴파일 타임 오류가 발생한다.

Instance Method
-인스턴스 메서드는 클래스의 지정된 인스턴스에서 작동한다.
-인스턴스 메서드 내에서는 this로 액세스할 수 있다.

class ValueClass
{
private int value = 0;
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); }
}
class Program
{
static void main(string[] args)
{
ValueClass c = new ValueClass();
c.setValue(10); // 인스턴스 메소드
c.print(); // 인스턴스 메소드
ValueClass.printString(“test”); // 정적 메소드 (클래스명.정적메소드명)
}
}

 

C# Array/ArrayList

Person[] pArray = new Person[5];

// 만약 Person 객체를 하나만 생성한 후 for문에서 공유해 사용할 경우
// 마지막으로 입력된 데이터로 모든 데이터값이 치환됨
Person p = new Person();
for (int i = 0; i < 5; i++) {
p.Name = Console.ReadLine();           // 입력정보
p.age = int.Parse(Console.ReadLine()); // 입력정보
pArray[i] = p;  // 리스트에 들어간 모든 원소는 동일한 p
}

 

Person[] pArray = new Person[5];
// 아래와 같이 for문 안에 Person p = new Person()와같이
// 새로운 객체를 생성해야 각자 다르게 입력된 정보가 들어가게 됨
for (int i = 0; i < 5; i++) {

Person p = new Person();
p
.Name = Console.ReadLine();           // 입력정보
p.age = int.Parse(Console.ReadLine()); // 입력정보
pArray[i] = p; // 이때 p는 새로운 Person객체

}


http://dis.dankook.ac.kr/lectures/hci10/entry/C-ArrayList
 (ArrayList 사용예)

HW1

단국대학교 멀티미디어공학전공 HCI프로그래밍2 (2015년 가을학기) 실습

과목코드 : 300890

날짜: 2015년 9월 15 일

강사 : 박경신

9/29까지 online.dankook.ac.kr 이러닝으로 source code, executable file, solution/project VC# file, 보고서(12-font 2~3 page)를 학번_이름_Ex1.zip으로 묶어서 이러닝에 제출한다.

보고서 (30%)  프린트는 10/2 수업 시간에 제출한다. 그리고 보고서와 함께 ‘직접 손으로 쓴 본인 프로그램 소스코드’를 제출한다.

 

– 실습번호 : lab-01 (Due by 9/29)

– 실습제목 : nullable, enum, if/switch, do/while, for/foreach, ReadLine()/WriteLine()

– 실습요약 : 평면 도형의 넓이 구하기 (AreaCalculator)

– 준비자료 : http://www.mathsisfun.com/area.html

http://www.onlinemathlearning.com/areas-of-polygons.html

http://tip.daum.net/question/65401509

– 실습문제

  1. AreaCalculator 클래스를 작성한다.

 

  1. enum Figure {Triangle, Square, Rectangle, Parallelogram, Rhombus, Trapezoid};

Figure? GetFigureFromName(string str)은 사용자 입력(예: 삼각형)에서 도형(Figure.Triangle)을 판별한다.

 

2. void Print()는 각 도형마다 여러 가지 색(color)을 추가하여 도형의 넓이 값을 콘솔창에 출력한다.

+도형에 입력된 값에 따른 넓이 공식과 값을  출력

+double CalculateArea(Figure type)는 도형의 넓이를 계산함.

+foreach 와 for(int i=1; i<=10; i++)를 사용하여 크기에 따른 각 도형의 넓이를 표로 출력함.

+Console.ForegroundColor = ConsoleColor.Red 는 Red 폰트 색으로 지정하는 것임.

 

3. void GetKeyboardInput()는 콘솔창에서 키보드로 입력 받아서 처리한다.

+ 예시: 먼저 도형을 선택하고 나면 (e.g. 삼각형/Triangle), 각 도형에 따른 추가적인 입력을 받음. (e.g., 삼각형의 밑변/base와 높이/height)

+ while 문을 사용하여 잘못 입력된 도형일 경우, 다시 사용자 입력을 받음. 마찬가지로 while 문을 사용하여 잘못 입력된 값이면 다시 입력을 받음.

+ Console.ReadLine()는 string을 반환하므로, double로 변환하기 위하여 TryParse 사용함 => boolValue = double.TryParse(string, out doubleValue)

4. 본인의 원하는 메소드나 루틴을 더 추가한다. 예를 들어 다른 도형의 넓이(또는 부피) 계산 등. 위의 코드로 하나의 완성된 프로그램을 작성하고, 실행 화면과 코드를 첨부하시오.

 

0부터 100까지 숫자만 입력받기

int value; // needed for TryParse
string str; // needed for ReadLine

Console.Write(“0부터 100까지 숫자를 입력하세요: “);
str = Console.ReadLine();
while ((!int.TryParse(str, out value)) || (value < 0 || value > 100))
{

Console.Write(“다시 0부터 100까지 숫자를 입력하세요: “);
str = Console.ReadLine();

}
int result = int.Parse(str);
Console.WriteLine(“입력된 숫자=” + result);

ESCAPE 키가 눌린게 아니면 프로그램이 계속 실행되기

static double Add(double a, double b)
{

return (a + b);

}

static void Main(string[] args)
{

do
{

Console.Write(“a를 입력하세요: “);

string str = Console.ReadLine();
double a;
bool result = double.TryParse(str, out a);

Console.Write(“b를 입력하세요: “);
str = Console.ReadLine();
double b;
result = double.TryParse(str, out b);

double c = Add(a, b);
Console.WriteLine(“결과는 {0}”, c);

Console.WriteLine(“다시 하려면 ENTER 키를 누르시고 종료하려면 ESC 키를 누르세요”);


} while (Console.ReadKey().Key != ConsoleKey.Escape);

}

Why need boxing and unboxing

Why do we need boxing and unboxing in C#?
http://stackoverflow.com/questions/2111857/why-do-we-need-boxing-and-unboxing-in-c

 

struct Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return String.Format(“{0} {1}”, this.x, this.y);
}
}
class Point2
{
public int x, y;
public Point2(int x, int y)
{
this.x = x;
this.y = y;
}

public override string ToString()
{
return String.Format(“{0} {1}”, this.x, this.y);
}
class Program
{
static void Print(object o)
{
Console.WriteLine(o);
}
static void Main(string[] args)
{
int x = 4;
Print(x); // boxing (int=>object)
double y = 3.2;
Print(y); // boxing (double=>object)
char z = ‘n’;
Print(z); // boxing (char=>object)
double e = 2.718281828459045;
object o1 = e; // boxing (double=>object)
object o2 = e; // boxing (double=>object)
Console.WriteLine
(o1 == o2); // False (o1과 o2는 서로 다른 메모리에 데이타 복사본 저장)
Point p3 = new Point(1, 1);
Print(p3); // boxing (struct=>object)
object o3 = p3; // boxing (struct=>object)
p3.x = 2;
//((Point)o3).x = 4;
// CS0445 Cannot modify the result of an unboxing conversion 
Console.WriteLine(((Point)o3).x); // 1  unboxing(object=>struct) o3.x=1 (o3는 박싱된 복사본 p3에의해 데이터 안바뀜)
Point2 p4 = new Point2(1, 1);
Print(p4); // boxing 아님
object o4 = p4; // boxing 아님
p4.x = 2;
Print(p4); // upcasting(Point2 class=>object) 2 1
((Point2)o4).x = 4; // downcasting(object=>Point2 class) o4.x=2 (class는 reference type이므로 o4는 p4에의해 데이터가 바뀜)
Console.WriteLine(p4); // p4.ToString()호출 4 1
}
}

Boxing과 Unboxing을 최소화하라

Boxing은 값 형식 (value type)을 참조 형식 (reference type)으로 변경하는 것이다.
Boxing을 수행하면 힙 상에 새로운 reference type 객체가 생성되고 value type의 객체가 가지고 있던 값이 reference type 객체 내부로 복사된다.
새로 생성된 reference type 객체는 내부적으로 value type 객체의 복사본을 포함하고, value type에서 제공하였던 interface를 그대로 재구현한다.

Unboxing은 참조 형식 (reference type)을 값 형식 (value type)으로 변경하는 것이다.
만약 reference type 객체 내부에 포함된 value type 객체의 값을 얻고자 시도하면 복사본을 만들어서 돌려준다.

Console.WriteLine(“Numbers: {0}, {1}, {2}”, 10, 20, 30);
Console.WriteLine()은 System.Object의 배열을 인자로 받는데, 정수들은 모두 value type이기때문에 value type의 인자로 전달하기 위해서는 reference type으로 boxing이 수행된다.
Boxing과 Unboxing 동작은 필요시 자동적으로 일어나며, 이 과정에서 컴파일러는 어떠한 경고도 발생시키지 않는다. WriteLine(…)을 호출할 때에는, 아래와 같이 value type을 string type instance로 변경하는 것이 좋다.
Console.WriteLine(“Numbers: {0}, {1}, {2}”, 10.ToString(), 20.ToString(), 30.ToString());
이 코드는 string type을 사용하기 때문에 value type들은 더이상 System.Object 로 변경되지 않는다.