본문 바로가기
[ Program ]/C#

클래스객체정의

by 관이119 2012. 9. 17.
한섬 | 유향버들
http://blog.naver.com/shopin00/100010615214

▣ 클래스의 정의

- 클래스와 객체는 비슷한 개념이다. 클래스는 설계도이고, 객체는 설계도를 만든 자동차라고

볼수 있다.

- 설계도 한장이면 수백수천대의 자동차를 만들 수 있다. 설계도를 잘못 그리면, 생산된 자동차

역시 불량일 수밖에 없다.

1. 클래스의 구성요소

- C#에서 사용하는 클래스는 멤버변수(특성, 속성), 메소드(멤버를 접근하거나 멤버를 이용하는 작업)로 구성

- Main()메소드의 이해 => C#에서는 아무리 많은 클래스를 사용해도 Main()메소드는 오직 하나만 존재

Main메소드는 프로그램이 빌드되어 하나의 실행 파일(.exe확장자를 갖는 파일)로 만들어지고 나서

그 실행파일을 실행시켰을때 제일 처음 으로 실행 되는 부분 이부분을 시작점 이라고 하는데 시작점은

하나의 실행 파일 안에 하나만 있어야 한다.

/* 6장 ExamDefClass
* class 선언에 대한 첫 번째 예제입니다. */

using System;

class TestClass1
{
public int Age;
public char Grade;

public void Initial()
{
Age = 31;
Grade = 'A';
}

public void DisplayInfo()
{
Console.WriteLine("클래스의 정보입니다.");
Console.WriteLine("나이는 {0}이며 성적은 {1}입니다.", Age, Grade);
}
}

class TestForDefClass
{
static public void Main()
{
Console.WriteLine("class 선언에 대한 첫 번째 예제입니다.");

TestClass1 Member1 = new TestClass1();
Member1.Initial();
Member1.DisplayInfo();
Console.ReadLine();
}
}

2. 객체지향의 특징

1. 캡슐화(encapsulation) => 내용물이 보이지 않도록 잘 포장되어 있는 것

캡슐안에 감추어져 있는 데이터를 캡슐에서 미리 정의한 메소드를 사용해 접근(access)할 수 있다

캡슐에 접근할 수 없을경우에는 캢슐내부에 정의된 데이터에도 접근할 수 없으며, 메소드도 호출할 수

없다. 이와같이 캡슐화되어있는 모듈을 c++/c#에서는 클래스라고 부른다


2. 다형성(polymorphism) => 모양이 여러가지란 뜻

3. 상속성(inheritance) => 기존의 기능을 그대로 물려받은 뒤 여기에 자신만의 기능을 추가하는 것

▣ 접근 제한자

1. 클래스를 사용해서 객체를 생성한뒤 그 객체를 통해서만 클래스의 구성요소인 멤버와 메소드에 접근

클래스의 구성요소 접근에 대한 권한을 설정하는것을 접근 제한자라 한다


접근 제안자 설명
=================================================================================
public 모든 접근 허용

private 자신의 클래스 안에서만 접근 허용

protected 자신의 클래스와 자신을 상속받은 클래스에서만 접근 허용

internal 동일한 파일에 있는 클래스에서만 접근 허용

protected internal 클래스 자신과 동일한 파일에 있는 상속된 클래스에서만 접근 허용

/* 6장 ExamPrivateClass
* 접근 제한자 private에 대한 첫 번째 예제입니다. */

using System;

class TestClass1
{
private int Age;
private char Grade;

private void Initial(int param_age, char param_grade)
{
Age = param_age;
Grade = param_grade;
}

public void DisplayInfo()
{
Console.WriteLine("클래스의 정보입니다.");
Console.WriteLine("나이는 {0}이며 성적은 {1}입니다.", Age, Grade);
}
}

class TestForDefClass
{
static public void Main()
{
Console.WriteLine("class 선언에 대한 예제입니다.");

TestClass1 Member1 = new TestClass1();
TestClass1 Member2 = new TestClass1();
//Member1.Initial(32, 'A');
//Member2.Initial(28, 'B');
Member1.DisplayInfo();
Member2.DisplayInfo();

Console.ReadLine();
}
}


/* 6장 ExamMember
* 접근 제한자 private에 대한 두 번째 예제입니다. */

using System;

class TestClass1
{
public int Age;
private char Grade;

public void Initial(int param_age, char param_grade)
{
Age = param_age;
Grade = param_grade;
}

public void DisplayInfo()
{
Console.WriteLine("클래스의 정보입니다.");
Console.WriteLine("나이는 {0}이며 성적은 {1}입니다.", Age, Grade);
}
}

class TestForDefClass
{
static public void Main()
{
Console.WriteLine("class 선언에 대한 예제입니다.");

TestClass1 Member1 = new TestClass1();
TestClass1 Member2 = new TestClass1();
Member1.Initial(32, 'A');
Member1.Age = 23;
//Member1.Grade = 'F';
Member2.Initial(28, 'B');
Member1.DisplayInfo();
Member2.DisplayInfo();
Console.ReadLine();
}
}


/* 6장 ExamProtected
* 접근 제한자 protected에 대한 예제입니다. */

using System;

class ParentClass
{
protected int Age;
protected char Grade;

public void Initial(int param_age, char param_grade)
{
Age = param_age;
Grade = param_grade;
}

public void DisplayInfo()
{
Console.WriteLine("클래스의 정보입니다.");
Console.WriteLine("나이는 {0}이며 성적은 {1}입니다.", Age, Grade);
}
}

class ChildClass : ParentClass
{
public void ModifyInfo(int a, char b)
{
Age = a; // 자신의 멤버처럼 사용
Grade = b; // 자신의 멤버처럼 사용
}
}

class TestForDefClass
{
static public void Main()
{
Console.WriteLine("접근 제한자 protected에 대한 예제입니다.");
Console.WriteLine();

ChildClass Member1 = new ChildClass();
Member1.Initial(32, 'A');
Member1.ModifyInfo(28, 'B');
Member1.DisplayInfo();

Console.ReadLine();
}
}


▣ 객체의 생성

- 객체를 생성하면, 클래스에서 필요한 메모리 영역을 할당하고, 프로그램 내부에서 사용할 수 있도록

클래스 객체를 생성할 때 필요한 new 연사자를 사용해야 한다. 객체를 나타내면서 가리키는 변수를

참조 변수라 한다


1. 객체 생성형식

클래스 변수 = new 클래서();


2. 참조 변수

- 일반 변수와 달리 참조 변수는 메모리의 주소를 가리키는 변수

/* 6장 ExamRefVar
* 참조 변수에 대한 예제입니다. */

using System;

class DemoClass
{
private int Age;
private char Grade;

public void Initial(int param_age, char param_grade)
{
Age = param_age;
Grade = param_grade;
}

public void DisplayInfo()
{
Console.WriteLine("클래스의 정보입니다.");
Console.WriteLine("나이는 {0}이며 성적은 {1}입니다.", Age, Grade);
}
}

class TestForRefVarClass
{
static public void Main()
{
Console.WriteLine("참조 변수에 대한 예제입니다.");
Console.WriteLine();

DemoClass Member1 = new DemoClass();
Member1.Initial(32, 'A');
DemoClass Member2 = Member1;
Member1.DisplayInfo();
Member2.DisplayInfo();

Console.ReadLine();
}
}


▣ 메소드의 사용

- 클래스에서의 메소드는 멤버의 기능을 실행하는 데 매우 중요한 역할 한다

1. 리턴값이 있는 메소드

/* 6장 ExamMethod1
* 메소드에 대한 첫 번째 예제입니다. */

using System;

class DemoClass
{
public int Korean;
public int Math;
public int English;

public void Initial()
{
Korean = 0;
Math = 0;
English = 0;
}

public int TotalScore()
{
return (Korean + Math + English);
}

public int AverageScore()
{
return (TotalScore() / 3);
}
}

class TestForMethod
{
static public void Main()
{
Console.WriteLine("메소드에 대한 예제입니다.");
Console.WriteLine();

DemoClass Member1 = new DemoClass();
Member1.Initial();
Member1.Korean = 100;
Member1.Math = 90;
Member1.English = 85;
DemoClass Member2 = new DemoClass();
Member2.Initial();
Member2.Korean = 95;
Member2.Math = 100;
Member2.English = 90;

Console.WriteLine("Member1의 총점은 {0}점이며 평균은 {1}입니다.", Member1.TotalScore(), Member1.AverageScore());
Console.WriteLine("Member2의 총점은 {0}점이며 평균은 {1}입니다.", Member2.TotalScore(), Member2.AverageScore());
Console.ReadLine();
}
}


2. 메소드만 있는 클래스

/* 6장 ExamMethod2
* 메소드에 대한 두 번째 예제입니다. */

using System;

class CheckClass
{
public bool isEven(int x) {
if((x % 2) == 0)
return true;
else
return false;
}
}

class TestForMethod2
{
static public void Main()
{
Console.WriteLine("메소드에 대한 두 번째 예제입니다.");
Console.WriteLine();

CheckClass Member = new CheckClass();

if(Member.isEven(2))
Console.WriteLine("2는 짝수네요.");
else
Console.WriteLine("2는 홀수네요.");

if(Member.isEven(3))
Console.WriteLine("3은 짝수네요.");
else
Console.WriteLine("3은 홀수네요.");

if(Member.isEven(4))
Console.WriteLine("4는 짝수네요.");
else
Console.WriteLine("4는 홀수네요.");

Console.ReadLine();
}
}

★ 함수와 메소드의 차이점

함수는 프로그램의 모든 곳에서 정의하고 호출할 수 있지만, 메소드는 오직 클래스의 내부에서만 정의

되어야 하기 때문에 외부에서 호출할때 여러가지 제약이 있다

그러므로 메소드는 호출할 부분을 한정지어서 반드시 필요한 경우에만 호출하게 해서 아무곳에서나 호출했을

때 발생할 수 있는 논리적인 오류를 미리 예방할 수 있다

▣ 생성자(constructor)

- 생성자는 프로그래머가 클래스로 정의한 것을 객체로 생성할때 가장 먼저 실행

- 메소드의 일종, 사용자가 호출하지 않아도 자동적으로 실행

- 규칙

1. 생성자의 메소드의 이름은 클래스의 이름과 같아야 한다

2. 접근제안자는 public이어야 한다

3. 리턴값을 갖지 않아야 한다

4 매개변수 사용할 수도 있다

5. 생성자를 생략하면, 컴파일러는 대신 디폴트 생성자를 사용한다


1. 생성자 이름의 규칙

/* 6장 ExamConstructor1
* 생성자에 대한 첫 번째 예제입니다. */

using System;

class MyClass
{
public int num;

public MyClass()
{
num = 10;
}
}

class TestForConstructor
{
static public void Main()
{
Console.WriteLine("생성자에 대한 첫 번째 예제입니다.");
Console.WriteLine();

MyClass Member = new MyClass();
Console.WriteLine("Member 객체의 멤버 num의 값은 {0}입니다.", Member.num);

Console.ReadLine();
}
}


2. 컴파일러가 만드는 디폴트 생성자

/* 6장 ExamConstructor2
* 생성자에 대한 두 번째 예제입니다. */

using System;

class MyClass
{
public int num;
}

class TestForConstructor
{
static public void Main()
{
Console.WriteLine("생성자에 대한 두 번째 예제입니다.");
Console.WriteLine();

MyClass Member = new MyClass();

Console.WriteLine("Member 객체의 멤버 num의 값은 {0}입니다.", Member.num);

Console.ReadLine();
}
}

3. 매개 변수를 사용하는 생성자

/* 6장 ExamConstructor3
* 생성자에 대한 세 번째 예제입니다. */

using System;

class MyClass
{
public int num;

public MyClass(int param)
{
num = param;
}
}

class TestForConstructor
{
static public void Main()
{
Console.WriteLine("생성자에 대한 세 번째 예제입니다.");
Console.WriteLine();

MyClass Member = new MyClass(32);

Console.WriteLine("Member 객체의 멤버 num의 값은 {0}입니다.", Member.num);

Console.ReadLine();
}
}

▣ 소멸자와 가비지 컬렉션

- 할당받아서 사용하던 메모리를 해지하는 작업

- 사용하지 않은 메모리를 자동으로 해제시키는 가비지 콜렉션기능을 제공


/* 6장 ExamDestructor
* 소멸자에 대한 예제입니다. */

using System;

class MyClass
{
public int num;

public MyClass(int param)
{
num = param;
}

public void generator(int i)
{
MyClass obj = new MyClass(i);
}

~MyClass()
{
Console.WriteLine("{0}에 대한 소멸자가 호출되었습니다.", num);
}
}

class TestForDestructor
{
static public void Main()
{
Console.WriteLine("소멸자에 대한 예제입니다.");
Console.WriteLine();

MyClass BaseObj = new MyClass(0);
for(int j = 1; j < 10; j++)
BaseObj.generator(j);

Console.WriteLine("프로그램을 종료합니다.");
}
}


▣ this 변수

- 일종의 참조 변수

- 현재 실행중인 클래스를 가리키는 참조 변수

/* 6장 ExamThisVar
* this 변수에 대한 예제입니다. */

using System;

class PowerInt
{
public double baseNum;
public double exponent;
public double val;

public PowerInt(double num, int exp)
{
this.baseNum = num;
this.exponent = exp;
this.val = 1;

if(exp == 0)
return;

for(; exp > 0; exp--)
this.val = this.val * this.baseNum;
}
}

class TestForThisVar
{
static public void Main()
{
Console.WriteLine("this 변수에 대한 예제입니다.");
Console.WriteLine();

PowerInt num = new PowerInt(2, 3);

Console.WriteLine("2의 3승은 {0}입니다.", num.val);
Console.ReadLine();
}
}

'[ Program ] > C#' 카테고리의 다른 글

스레드의 상태  (0) 2012.09.17
C# 주의해야 할 문법  (0) 2012.09.17
데이터베이스 연결  (0) 2012.09.17
C# Random Class 사용하기  (0) 2012.09.14
WCF Configuration ( Appconfig 스키마 구성표)  (0) 2012.09.14

댓글