본문 바로가기

컴퓨터 지식

C#에서 함수에 Static을 붙이는 이유

반응형

Static


보통 클래스 맴버 변수나 메서드에 접근 하려면 클래스를 선언 후에 포인트 연산자(.)으로 접근을 한다.  


그러나 Static키워드를 사용하면 클래스 선인이 필요 없고 직접적인 클래스.매서드 형태로 접근 가능하다.  이렇게 static키워드를 사용하여 접근하는 것을 정적 메소드, 변수라고 불린다.


하지만 반대로 클래스의 선언 후에는 정적 메소드 안에 접근할수 없다.



이해를 돕기 위해 간단한 예제로 확인!


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{


 


    class Program

    {

        static void Main(string[] args)

        {

            Exams.static_method();


            Exams _exam = new Exams();

            _exam.instance_method();

        }


    }

    class Exams{

        public static void static_method()

        {

            Console.WriteLine("정적 메소드");

        }

        public void instance_method()

        {

            Console.WriteLine("인스턴스 메소드");

        }



    }

    

    

}



항상 새로 시작할때 보면 static void Main 메소드도 정적 메소드이다. 

Main 메소드는 프로그램의 진입점(Entry point)이기에 클래스 선언 없이 접근 할수 있어야 한다.

메소드만 작성할 수 없고 최소 단위가 class이기에 그안에 static으로 선언함으로서 직접적으로 접근할수 있는 구조이다.


다음으로 접근제한자에 대해 알아보겠다.



접근 제한자는 클래스나 메서드,맴버 변수 등의 클래스 구성요소 앞에 사용되는 키워드이다.


c#에서는 public, private, protected, internal키워드로 사용된다.


public: 어디서나 사용이 가능하고 클래스 내,외부와 파생클래스에서도 클래스 맴버에 접근


private: private를 포함한 클래스 내에서만 접근 가능


protected:기본 클래스와 파생 클래스에서만 접근 가능


protected internal: 동일 프로그램 내에서 또는 파생 클래스에서 접근 가능


이해하기 쉽게 예제로 확인해 보겠다.


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Exams.public_method();

            Exams.protected_internal();

            Exams.internal_method();

        }


    }

    class Exams{

        public Exams(){

            Exams.public_method();

            Exams.private_method();

            Exams.protected_method();

            Exams.internal_method();

            Exams.protected_internal();

        }

       

        public static void public_method(){


        }


        private static void private_method(){


        }


        protected static void protected_method(){


        }


        internal static void internal_method(){


        }


        protected internal static void protected_internal(){


        }

    }


        class Exam2: Exams{

            public Exam2(){

                Exams.public_method();

                Exams.protected_method();

                Exams.internal_method();

                Exams.protected_internal();

            }


        }

    

    

}


위에서 보면 Main에서는 public, internal, protected internal만 접근 가능하고, 

상속 클래스에서는 public,protected, internal, protected internal이 접근가능하고 내부에서는 모두 다 접근 가능하다.


public: 내부클래스, 외부 클래스, 파생클래스, 프로젝트

private:내부클래스

protected:내부클래스, 파생클래스

internal: 내부클래스, 외부클래스, 파생클래스

protected internal:내부클래스, 파생클래스


접근제한자는 객체지향 특성중에 캡슐화와 관련이 깊은 키워드이다. 

왜굳히 접근제한자를 두어서 복잡하게 할것인가?

모두 public으로 써서 하면 편하게 될껄? 이라고 생각하겠지만 응용프로그램을 만들게 되면 많은 객체와 변수,상수 메소드를 사용하게 될것이다.

특히 쓰레드라는 것을 사용하게 되면 하나의 변수만해도 수십번, 수백번의 값이 바뀌게 되는것이다. 각 객체에 대한 접근 제한을 정확하게 지정해 놓 지않으면 서로의 값은 간섭받게 되고 결국에는 에러를 내는 현상까지 가게 될 것이다. 그러나 반대로 접근 제한을 잘 정리 해두면 어느정도 역할이 정해져 있기 때문에 프로그램의 속도 향상이 있습니다.


그리고 캡슐화의 큰 장점은 모든 변수 함수를 내놓을 것이 아니고 기능을 갖춘 함수면 외부로 보이므로 해서 굳히 그클래스의 내용을 몰라도 사용할수 있게 되는 장점이 있다.




반응형