C#프로그래밍 05 : 클래스
선언, 생성, 사용
Person은 클래스
Name, Age는 필드
printInfo는 메소드
class Person
{
public string Name;
public int Age;
public void printInfo()
{
Console.WriteLine($"{Name} {Age}");
}
}
class Program {
static void Main(string[] args) {
Person wonjin = new Person();
wonjin.Name = "wonjin";
wonjin.Age = 25;
wonjin.printInfo(); // wonjin 25
Console.WriteLine(wonjin.Name); // wonjin
Console.WriteLine(wonjin.Age); // 25
}
}
생성자
class Person
{
// 생성자 1
public Person() {
Name = "no name";
Age = 0;
}
// 생성자 2
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string Name;
public int Age;
public void printInfo()
{
Console.WriteLine($"{Name} {Age}");
}
}
class Program {
static void Main(string[] args) {
Person wonjin = new Person();
wonjin.printInfo(); // no name 0
Person lee = new Person("lee", 123);
lee.printInfo(); // lee 123
}
}
종료자
class Person
{
// 생성자 1
public Person() {
Name = "no name";
Age = 0;
}
// 생성자 2
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string Name;
public int Age;
public void printInfo()
{
Console.WriteLine($"{Name} {Age}");
}
}
class Program {
static void Main(string[] args) {
Person wonjin = new Person();
wonjin.printInfo(); // no name 0
Person lee = new Person("lee", 123);
lee.printInfo(); // lee 123
}
}
언제 실행될 지 장담할 수 없다. GC에 의해 호출된다.
class Person
{
// 종료자
~Person()
{
Console.WriteLine("종료자");
}
public string Name;
public int Age;
public void printInfo()
{
Console.WriteLine($"{Name} {Age}");
}
}
class Program {
public void createObject()
{
Person wonjin = new Person();
Console.WriteLine("created");
}
static void Main(string[] args) {
Program objobj = new Program();
objobj.createObject();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
/*
created
종료자
*/
static
객체가 아닌 클래스 자체에 소속되어, 프로그램 전체에서 유일한 필드/메소드로 지정함.
인스턴스에서 static 필드/메소드에 접근은 불가능
class Person
{
static public string Name;
static public int Age;
public void printInfo()
{
Console.WriteLine($"Name:{Name} / Age:{Age}");
}
static public int returnAge()
{
return Age;
}
}
class Program {
static void Main(string[] args) {
Person wonjin = new Person();
Person someone = new Person();
Console.WriteLine(Person.returnAge()); // 0
Person.Name = "asdfasdf";
Person.Age = 53;
wonjin.printInfo(); // Name:asdfasdf / Age:53
someone.printInfo(); // Name:asdfasdf / Age:53
Console.WriteLine(Person.returnAge()); // 53
}
}
값에 의한 전달
아래 코드는 매개변수로 값을 전달하고, 객체 내 메소드에서는 이 값을 위한 별도 메모리 공간을 할당함.
class IAMCLASS
{
public void swap (int a, int b)
{
int tmp = a;
a = b;
b = tmp;
Console.WriteLine($"IAMCLASS a:{a} , b:{b}");
}
}
class Program {
static void Main(string[] args) {
IAMCLASS one = new IAMCLASS();
int a = 5;
int b = 3;
one.swap(a, b);
Console.WriteLine($"Program a:{a} , b:{b}");
}
}
/*
IAMCLASS a:3 , b:5
Program a:5 , b:3
*/
참조에 의한 전달
ref
키워드를 붙여 참조에 의해 전달하도록 설정할 수 있음
메소드 매개변수를 참조로 전달
아래 코드는 메소드를 호출할 때 넘길 매개변수를 참조에 의해 전달.
class IAMCLASS
{
public void swap (ref int a, ref int b)
{
int tmp = a;
a = b;
b = tmp;
Console.WriteLine($"IAMCLASS a:{a} , b:{b}");
}
}
class Program {
static void Main(string[] args) {
IAMCLASS one = new IAMCLASS();
int a = 5;
int b = 3;
one.swap(ref a, ref b);
Console.WriteLine($"Program a:{a} , b:{b}");
}
}
/*
IAMCLASS a:3 , b:5
Program a:3 , b:5
*/
메소드 반환값을 참조로 반환
함수 리턴자료형 앞, 리턴하는 변수(값) 앞에 ref
키워드를 붙이면
---> 함수는 참조를 반환
반환받는 변수 앞에 ref
키워드를 붙이면
---> 반환값을 참조로 받음
만약, 반환받는 변수 앞에 ref
키워드가 없다면
---> 함수가 참조를 반환했더라도, 반환값을 값으로 받음.
class IAMCLASS
{
public string name = "wonjin";
public ref string returnName()
{
return ref name;
}
}
class Program {
static void Main(string[] args) {
IAMCLASS a = new IAMCLASS();
IAMCLASS b = new IAMCLASS();
Console.WriteLine(a.name); // wonjin
ref string a_str = ref a.returnName();
a_str = "aaaaaaaaaaaaaa";
Console.WriteLine(a.name); // aaaaaaaaaaaaaa
Console.WriteLine(b.name); // wonjin
string b_str = b.returnName();
b_str = "bbbbbbbbbbbbbbbbbbbbbbbbbbb";
Console.WriteLine(b.name); // wonjin
}
}
출력 전용 매개변수
메소드 선언부, 호출부에 out키워드를 사용하면, 수행 결과 값을 호출자에게 전달.
메소드가 종료되기 전 out 키워드가 붙은 변수에 값을 할당해야 한다.
하지 않으면 컴파일 에러가 발생한다.
같은 기능을 ref
를 사용하여 구현할 수도 있다. 그러나 out
키워드를 사용하면 컴파일에러를 통해 개발자의 실수를 방지하는 이점이 있다.
class Program {
static void Divide(int a, int b, out int mok, out int rest)
{
mok = a / b;
rest = a % b;
}
static void Main(string[] args) {
int a = 53;
int b = 5;
Divide(a, b, out int c, out int d);
Console.WriteLine($"a/b={c} ,a%b={d}"); // a/b=10 ,a%b=3
}
}
Author And Source
이 문제에 관하여(C#프로그래밍 05 : 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yiwonjin/C프로그래밍-05-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)