C#프로그래밍 05 : 클래스

29736 단어 Csharp학부Csharp

선언, 생성, 사용

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
		}
	}

종료자

언제 실행될 지 장담할 수 없다. 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
	}
}

좋은 웹페이지 즐겨찾기