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.)