[객체지향 프로그래밍] 7장-8 중첩 클래스, 분할 클래스, 확장 메소드

0

이것이 C#이다

목록 보기
15/26

7.14 중첩 클래스

중첩 클래스는 클래스 안에 선언되어 있는 클래스를 말합니다. 중첩클래스는 자신이 소속된 클래스의 멤버에 자유롭게 접근할 수 있다는 사실입니다. (바깥 클래스의 private 멤버에도 접근가능합니다!) 구조체와 비슷한 방법이다. 모든것이 public으로 공개되어있는 구조체와 다르게, 외부에서 접근이 안되도록 private으로 설정해서 사용한다.

중첩클래스의 사용이유는

  • 클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때
  • 현재 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때
class OuterClass
{
	private int OutetMember;
    
	class NestedClass	//중첩 클래스
    {
    	public void DoSomething()
        {
        	OuterClass outer = new OuterClass();
            outer.OuterMember = 10; 
            //OuterClass의 privte 멤버에 접근하여 값을 할당하거나 읽을 수 있습니다.
        }
    }
}

중첩 클래스 사용 예제
새로운 형식 ItemValue를 만들고,
바깥 클래스 Configruation에서 ItemValue를 리스트에 넣어 사용하는 방법으로 사용

class Configruation
{
   List<ItemValue> listConfig = new List<ItemValue>();
   public void SetConfig(string item, string value)
   {
       ItemValue iv = new ItemValue();
       iv.SetValue(this, item, value);
   }
   public string GetConfig(string item)
   {
       foreach (ItemValue iv in listConfig)
       {
           if (iv.GetItem() == item)
               return iv.GetValue();
       }
       return null;
   }
   
   //중첩 클래스 사용
   //사용이유 : 외부에 공개하고 싶지 않은 형식을 만들기 위해
   private class ItemValue
   {
       public string item;
       public string value;
       public void SetValue(Configruation config, string item, string value)
        {
            this.item = item;
            this.value = value;

            bool found = false;
            //바깥 클래스의 listConfig도 사용가능하다.
            for (int i = 0; i < config.listConfig.Count; i++)
            {
                if (config.listConfig[i].item == item)
                {
                    config.listConfig[i] = this;
                    found = true;
                    break;
                }
            }

            if(found == false)
                config.listConfig.Add(this);
        }

        public string GetItem() 
        { return item; }
        public string GetValue() 
        { return value; }
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Configruation config = new Configruation();
        config.SetConfig("Version", "V 5.0");
        config.SetConfig("Size", "655.324 KB");
        Console.WriteLine(config.GetConfig("Version"));
        Console.WriteLine(config.GetConfig("Size"));

        config.SetConfig("Version", "V 5.0.1");
        Console.WriteLine(config.GetConfig("Version"));
    }
}

💻출력
V 5.0
655.324 KB
V 5.0.1

7.15 분할 클래스

분할 클래스란 여러번에 나눠서 구현하는 클래스를 말합니다. 분할 클래스는 그 자체로 특별한 기능을 하는 것이 아니며, 클래스의 구현이 길어질 경우 여러 파일에 나눠서 구현할 수 있게 함으로써
소스 코드 관리의 편의를 제공하는 데 의미가 있습니다.

분할 클래스는 다음과 같이 partial 키워드를 이용합니다.

patial class MyClass
{
	public void Method1() {}
    public void Method2() {}
}
//클래스 이름은 동일해야 합니다.
patial class MyClass
{
	public void Method3() {}
    public void Method4() {}
}

7.16 확장 메소드

확장 메소드는 기존 클래스의 기능을 확장하는 기법입니다. 확장메소드를 이용하면 string클래스에 문자열을 뒤집는 기능을 넣을 수 있고, int 형식에 제곱 연산 기능을 넣을 수도 있습니다.

확장 메소드를 선언하는 방식은 메소드를 선언하되, static 한정자로 수식해야합니다.
그리고 메소드의 첫 번째 매개변수는 반드시 this키워드와 함께 확장하고자 하는 클래스(형식)의 인스턴스여야 합니다. 그 뒤에 따라오는 매개변수 목록이 실제로 확장 메소드를 호출할 때 입력되는 매개 변수입니다.
메소드는 클래스 없이 선언 될수 없습니다.
따라서 클래스를 하나 선언하고 그 안에 확장 메소드를 선언합니다. 이때 선언하는 클래스도 역시 static 한정자로 수식해야 합니다.

int클래스에 x의 n제곱 메소드를 확장하기

namespace MyExtension	//네임스페이스를 사용해야 합니다.
{
	public static class IntegerExtension
	{
		public static int Power(this int myInt, int exponent)	//두 번째 매개변수가 
    	{														//실제로 사용되는 매개 변수 입니다.
    		int result = myInt;
     	   	for (int i =1; i < exponent; i++)
     	   		result = result * myInt;
            
        	retern result;
    	}
	}
}

사용법

using MyExtension;	//확장 메소드를 담는 클래스이 네임스페이스를 사용합니다.

int a = 2;
Console.WriteLIne(a.Power(3));
Console.WriteLIne(10.Power(4));

0개의 댓글