본문 바로가기

C#

C# 클래스 (static, 생성자, namespace, Main)

반응형

C# 클래스

현실 세계를 모델링하여 사물을 속성과 행위로 나눠 코드로 표현

1
2
3
4
5
6
7
8
9
class Book{
    string title;
    decimal ISBN13;
    string Content;
    string Author;
    int pageCount;
}
 
Book gulliver = new Book();


단순히 속성만 있는 클래스를 정의하고 생성하는 코드.

객체 지향 프로그래밍에서는 저런 객체들 간의 행위를 통해 코드를 작성함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Book{
    public string Title;
    public decimal ISBN13;
    public string Contents;
    public string Author;
    public int PageCount;
 
    public void Open(){
        Console.WriteLine("Book is opened");
    }
    public void Close(){
        Console.WriteLine("Book is closed");
    }
}


메서드 추가, 메서드를 사용하는 이유는 코드 중복을 제거할 수 있기 때문. 또한 재사용도 가능.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("person 객체 생성 전");
            Person person = new Person();
            Console.WriteLine("person 객체 생성 후");
        }
    }
    class Person
    {
        string name;
        public Person()
        {
            name = "홍길동";
            Console.WriteLine("생성자 호출");
        }
    }
}
 


//결과

//person 객체 생성 전

//생성자 호출

//person 객체 생성 후

클래스는 객체 인스턴스를 생성할 때(new) 생성자를 호출하는데 그 때 멤버변수 초기화같은 일을 할 수 있음.

* 따로 생성자를 선언하지 않으면 디폴트로 인자없는 생성자를 컴파일러가 생성함

  그러나 개발자가 임의로 인자있는 생성자를 생성할 경우 디폴트 생성자를 만들어주지 않음 (주의)


** static 정적 필드와 메서드

클래스에서 new로 할당받은 인스턴스는 각 객체마다 고유하게 메모리를 확보하기 때문에 클래스 전역적으로 값이 유지되지 않는다.

그래서 이런 요구사항을 만족하기 위해 클래스 단위의 필드를 정의 해야함. = static 예약어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person1 = new Person("jeong");
            Person person2 = new Person("pro");
            Console.WriteLine(Person.CountOfInstance); // 결과 2
        }
    }
    class Person
    {
        static public int CountOfInstance; // static 예약어로 인해 정적 필드로 만듦
        string name;
        public Person(string name)
        {
            CountOfInstance++;
            this.name = name;
        }
        static public void OutputCount() // 정적메서드
        {
            Console.WriteLine(CountOfInstance); // 정적메서드에서 정적 필드에 접근
        }
    }
}
 


Person 클래스에서 static 이라는 키워드만 붙이면 된다.

Person 클래스 내에서 하나만 만들게 되며 클래스단위에서 공유 가능.

* 유념해야할 것은 클래스의 인스턴스로 객체가 생성되기 전에도 접근가능.

* 정적메서드도 마찬가지로 static만 붙이면 되나, 정적메서드에서는 인스턴스멤버를 접근할 수 없음.

( 너무도 당연한게 클래스의 인스턴스가 생성되기전에 static 메서드를 사용 가능하니까 static 메서드에 인스턴스멤버를 사용한다는게 말이 안됨. 없는걸 쓰겠다고? )


Main 메서드 규칙

- 메서드 이름은 반드시 Main

- 정적 메서드여야함 static

- Main 메서드가 정의된 클래스의 이름은 자유 단, 2개 이상의 클래스에서 Main 메서드를 정의하고 있다면 컴파일러가 구분 가능하게 어떤클래스의 Main을 실행할지 클래스를 지정해야함.

- Main메서드의 반환값은 void 또는 int만 가능

- Main 메서드의 매개변수는 없거나 string 배열만 허용


정적 생성자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Person person1 = new Person("jeong");
            Console.WriteLine("--------");
            Person person2 = new Person("pro");
        }
    }
    class Person
    {
        string name;
        public Person(string name)
        {
            this.name = name;
            Console.WriteLine("일반생성자");
        }
        static Person()
        {
            Console.WriteLine("정적생성자");
        }
    }
}
 


//결과

//정적생성자

//일반생성자

//--------

//일반생성자

정적 생성자는 최초로 접근할 때 딱 '한번만' 실행됨.


namespace

namespace는 자바의 패키지와 비슷한 역할.

클래스나 변수들의 이름이 겹치는 것을 방지하기위해 생김.

using System;

이게 System 네임스페이스에서 가져온다는 얘기임

그래서 System.Console.WriteLine("~~~"); 이 문장을 System을 빼고 사용가능한 것.

* using문은 반드시 코드파일의 첫부분에 있어야함. 그 어떤 문장도 using보다 먼저오면 안됨.

반응형