using System;
namespace Struct_EX { class BaseClass // 부모 클래스 { public int a; // 클래스의 멤버를 접근 제한자로 지정하지 않으면 멤버의 접근 수준은 무조건 private로 자동 지정됨 int b;
private void A() { } protected void B() { }
public void C() { }
public void ParentMethod() // 부모클래스의 ParentMethod 메소드 { A(); B(); C(); } } class DerivedClass : BaseClass // DerivedClass (파생) 클래스는 BaseClass(부모클래스)를 상속받는다 { public void ChildMethod() { //A(); // private 접근 지시어로 선언된 메소드 접근은 같은 클래스 안에서만 접근 가능 B(); // protected 접근 지시어로 선언되었고 자식 클래스는 부모 클래스의 파생 클래스 이므로 접근 가능 C(); }
}
class Program { struct MyPoint // 클래스와 유사한 구문, 상속 불가, 인터페이스 구현 불가 { public int x; public int y;
public MyPoint(int x, int y) // 구조체의 생성자는 매개변수를 넣어 만들어야 한다. { this.x = x; this.y = y; }
public override string ToString() { return string.Format("({0}, {1})", x, y); } }
class PointC { public int x; public int y; public PointC(int x, int y) { this.x = x; this.y = y; } }
static void Main(string[] args) { BaseClass parent = new BaseClass(); // Baseclass(부모) 클래스로 새 객체를 생성한다. parent.a = 1; // 보호수준 때문에 접근 불가 DerivedClass child = new DerivedClass(); // DerivedClass(자식) 클래스로 새 객체를 생성한다. parent.ParentMethod(); child.ChildMethod(); child.C();
MyPoint p; // 클래스와 달리 구조체는 new 연산자를 사용하지 않고 인스턴스화할 수 있다. p.x = 55; p.y = 77; Console.WriteLine("구조체 : p.x = {0}, p.y = {1}", p.x, p.y); Console.WriteLine(p.ToString());
MyPoint p1 = new MyPoint(11,22); //구조체 선언 PointC p2 = new PointC(11,22); //클래스 선언 MyPoint p3 = p1; // 값에 의한 복사 (구조체는 스택에 생성되는 값 타입) PointC p4 = p2; // 참조에 의한 복사 (클래스는 힙에 생성되는 참조 타입으로 힙의 주소를 전달) Console.WriteLine("구조체 : p1.x = {0}, p1.y = {1}", p1.x, p1.y); Console.WriteLine("클래스 : p2.x = {0}, p2.y = {1}", p2.x, p2.y);
p3.x = 33; p4.x = 44; Console.WriteLine("구조체 : 값에 의한 복사 p1.x = {0}, p3.x = {1}", p1.x, p3.x); // 구조체는 스택영역에 값이 직접 들어가서 깊은 복사가 된다.
Console.WriteLine("클래스 : 참조에 의한 복사 p2.x = {0}, p4.x = {1}", p2.x, p4.x); // 클래스는 참조하는 주소가 복사되면서 스택영역의 변수가 같은 힙영역을 가리킨다. } } }
|