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 로 변경되지 않는다.

Assignment 1

연습문제 (1)


□ 단원 : C# 기초
□ 목표 : C# 프로그램 기초
□ 주요 연습 내용 : Visual Studio 2010, C# 입출력, 연산자, 변수, 제어문 사용 연습
□ 준비자료 : StadardWeightCalculator.cs


3542998201.hwp
연습문제 Ex1 (Due by 9/30 금 24시까지)
-cyber 강의실 (cyber.dku.edu)로 source code, executable file, solution/project VC# file, 보고서를 학번_이름_Ex1.zip으로 묶어서 낼 것. 보고서 (30%)


[연습문제]


0. Visual C# Console Application의 프로젝트를 생성한다.
1. BMI(Body Mass Index) 방식의 표준체중계산기 프로그램 StandardWeightCalculator 클래스를 작성하라. (30%)
– enum Gender { Female, Male };를 사용
– enum BMI { Underweight, Normal, Overweight, Obesity };를 사용
– void GetKeyboardInput() 함수는 키보드로 신장, 체중, 성별을 입력받아서 처리
+ 힌트: while 문을 사용하여 남/여 혹은 M/F가 아닌 경우 다시 입력을 받음
+ 힌트: Console.ReadLine() 함수는 string을 반환하므로, float로 변환하기 위하여
Parse 함수 사용 => floatValue = (float)double.Parse(string)
+ 힌트: TryParse 함수는 string을 double로 변환이 가능하면, out 매개변수로 변환된 값을 전달해 주고, true boolean 값을 반환 => boolValue = double.TryParse(string, out doubleValue)
– Gender GetGenderFromString(string str) 메소드는 Female/Male 중에 하나를 반환
– static float GetNormalWeight(float height, Gender gender) 메소드는 표준체중 값을 계산하여 반환
// 남자표준체중 = 신장(m) x 신장(m) x 22
// 여자표준체중 = 신장(m) x 신장(m) x 21
– BMI GetBMI(float height, float weight) 메소드는 Underweight /Normal/ Overweight/ Obesity 중에 하나를 반환
// BMI = 체중(kg)/신장^2(m^2)
// 20 미만 저체중 (Underweight)
// 20~24 정상 (Normal)
// 25~29 과체중 (Overweight)
// 30 이상 비만 (Obesity)
– void Print() 메소드는 개인의 표준체중과 비만도를 화면에 출력 
2. Main 함수에서는 StandardWeightCalculator 객체를 생성하고 키보드 입력으로 키(cm), 몸무게(kg), 성별(남/녀)를 입력받아서, 표준체중, 비만도를 출력하는 routine 등을 추가한다. (20%)
– do..while 문을 사용하여 다른 사람을 하려면 다시 처음으로 돌아갈 수 있도록 함


3. Main 함수에서 본인이 더 테스트해보고 싶은 StandardWeightCalculator 클래스의 Method나 routine을 추가하라. (20%)
– 예를 들어, 복부비만=허리둘레(cm)/ 엉덩이둘레(cm) 결과 값이 0.7~0.8cm는 정상, 0.8~0.9cm는 위험, 0.9cm 이상은 심각

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”);     // 정적 메소드 (클래스명.정적메소드명)
     }
}

String 클래스의 메소드

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-비교