본문으로 바로가기

[C#] 정적 메서드~as, is 연산자

category Program/C# 2019. 1. 30. 11:47

정적 메서드는 일반 메서드에 static 예약어를 붙여서 정의한다. 정적 메서드 역시 new로 객체를 생성하지 않아도 

[클래스이름].[정적메서드] 로 호출 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  class Person
    {
        static int CountOfInstance; // static(정적) 필드
        public string _name;
        public Person(string name) // 이것은 생성자 클래스명과 다르면 오류발생
        {
            CountOfInstance++;
            _name = name;
        }
        static public void OutputCount() // public 정적 메서드
        {
            Console.WriteLine(CountOfInstance); // 정적메서드에서 정적필드에 접근
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person.OutputCount(); // 클래스 이름으로 정적 메서드 호출.
            Person person1 = new Person("홍길동");
            Person person2 = new Person("홍길동2");
            Person.OutputCount(); // 출력 결과 : 2
        }
    }
cs


정적 메서드 안에서는 인스턴스 멤버에 접근할 수 없다는 특징이 있다. 정적 메서드가 new 로 할당된 객체가 없는 상태에서도 호출되는 메서드라는 점을 생각하면 쉽게 이해할 수 있다.


예를 들어 Console.WriteLine("Hello world"); 의 경우에도 Console 클래스에 정의된 WriteLine 정적 메서드이다. 


Main 메서드

프로그램은 CPU에 의해 순차적으로 실행되는 특징 가진다. C#으로 만든 프로그램도 역시 순서대로 명령어가 실행되는데, 그렇다면 가장 처음 실행되는 명령어(진입점: entry point)는 다음과 같은 약속을 따르는 메서드를 최초로 실행될 메서드라고 규정한다.


1. 메서드의 이름은 반드시 Main

2. 정적 메서드여야 하고

3. Main 메서드가 정의된 클래스의 이름은 제한이 없다. 하지만 2개 이상의 클래스에서 Main 메서드를 정의하고 있다면 C# 컴파일러에게 클래스를 지정해야한다.

4. Main 메서드의 반환값은 void 또는 int 만 허용된다.

5. Main 메서드의 매개변수는 없거나 string 배열만 허용된다.


정보은닉의 원칙

필드를 절대 public으로 선언하지 않는다.

접근이 필요할 때는 접근자/설정자 메서드를 만들어 외부에서 접근하는 경로를 클래스 개발자의 관리하에 둔다.


프로퍼티(property)

접근자/설정자 메서드를 둬서 필드 접근에 대한 단일 창구를 제공하는 것은 바람직하지만 호출을 위한 메서드 정의를 일일 이 코드로 작성하자면 분명 번거로울 것이다. 이를 보완하기 위해 프로퍼티라는 문법이 있다.

* 프로퍼티를 속성으로 말하기도 하는데, 객체지향에서 말하는 속성(attribute)와 혼동될 수 있으며, 객체지향에서는 필드(field)에 해당되고, 프로퍼티는 접근자/설정자 메서드에 대한 구문에 해당되기에 프로퍼티는 보통 "공용 속성"이라고 부르기도 한다.


as, is 연산자

클래스의 형변환에서 빠질 수 없는 것이 바로 as 연산자. 캐스팅 연산자를 사용해 명시적 형변환을 하는 경우 컴파일 단계가 아닌 프로그램을 실행할 때 오류가 발생한다는 것을 알았다. 오류를 발생시키지 않고 형변환이 가능한지 확인할 수 있는 방법이 as 연산자다. 

as 는 형변환이 가능하면 지정된 타입의 인스턴스 값을 변환하고, 가능하지 않으면 null을 반환한다.

한 가지 기억할 점은 as 연산자는 참조형 변수에 대해서만 적용할 수 있고 참조형 타입으로의 체크만 가능하다는 점이다.

as 가 형변환 결괏값을 반환하는 반면 is 연산자는 형변환의 가능성 여부를 불린형의 결괏값(true/false)로 반환한다.

* as / is 를 언제 쓰느냐는 형변환된 인스턴스가 필요하면 as 필요없다면 is 

* is 연산자는 참조형식뿐만 아니라 값 형식에도 사용할 수 있다.






ref : (책) 시작하세요! C# 7.1 프로그래밍 기본 문법부터 실전 예제까지 내용 참조


'Program > C#' 카테고리의 다른 글

[C#] 스택과 힙  (0) 2019.03.18
[C#] Object  (0) 2019.01.30
[C#] .NET 용어 요약 #2  (0) 2019.01.29
[C#] .NET 용어 요약  (0) 2019.01.28
[C#] 람다식(Lamdba Expressions)  (0) 2019.01.25