Class – defines the grouping of data and code, the “type” of an object
Instance – a specific allocation of a class
Message – sent to objects to make them act
Method – a “function” that an object knows how to perform
Instance Variables – a specific piece of data belonging to an object
Property – away to access instance variables and other attributes of an object
Encapsulation – keep implementation private and seperate from interface
Polymorphism – different objects, same interface
Inheritance – hierarchical organization. share code, customize or extend behaviors
Lecture4
Lecture4
Lab1
Lab1 프로젝트 디렉토리 안에 모든 파일과 보고서 (2~3장)를 넣고 Lab1_학번_이름.zip 압축한 후 e-learning(http://lms.dankook.ac.kr/index.jsp)으로 제출 (10점)
Lab1 – Basics (method, for, foreach, if, switch, do/while, while, array 활용) 코드 분석 보고서 & (수업블로그에 4.Basic 안에 ArithmeticOperator 클래스 참고하여) 본인이 원하는 method나 routine를 추가 작성한다.
보고서는 출력해서 수업시작 전에 제출한다.
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
{
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
{
return String.Format(“{0} {1}”, this.x, this.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);
}
{
{
Console.WriteLine(o);
}
{
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는 서로 다른 메모리에 데이타 복사본 저장)
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
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에의해 데이터가 바뀜)
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 로 변경되지 않는다.
Boxing vs Unboxing
https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
int i = 123;
object o = i; // boxing (값 형식 -> 참조 형식)
int j = (int) o; // unboxing (참조 형식 -> 값 형식)
string + operator vs integer + operator
// String + operator
string str = “123”;
Console.WriteLine(“str={0}”, str + 70); // 12370
Console.WriteLine(“str={0}”, str + “70”); // 12370
// Int + operator
int i = 123;
Console.WriteLine(“i={0}”, i + 70); // 193
Console.WriteLine(“i={0}”, i + 70.50); // 193.50
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);
}
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);
int => string vs string => int
int i = 10; // 10
string j = i.ToString(); // “10”
string x = “123”; // “123”
int y = Convert.ToInt32(x); // 123 (integer로 변환이 가능한 경우만 변환 가능 그 외엔 run-time exception error)
int z = Int32.Parse(x); // 123 (integer로 변환이 가능한 경우만 변환 가능 그 외엔 run-time exception error)
int w;
bool success = Int32.TryParse(x, out w); // 123 (integer로 변환이 가능한 경우만 변환 가능 그 외엔 w=0)