[C#] 2. 접근제한자 (Access Modifier) 배우기
공부/코딩

[C#] 2. 접근제한자 (Access Modifier) 배우기

안녕하세요.

기계과 감성쟁이입니다.

 

C# 강의들 보면서,

다른 언어들에서 배운 개념들은 대충 보고 넘어가며

 

처음본 것들만 포스팅을 하는 중이에요.

 

함수 안에 있다면 지역변수 (local variable)

클래스 안에 있다면 맴버변수 (member variable)

 

는 조금 흔한 개념이지만

이런 단어는 처음 봐서 적어봤구여,

 

1. 접근제한자(Access Modifier)란?


접근제한자(Access Modifier)는 정보에 대한 접근을 규정해줄 때 사용합니다.

 

기초가 되는 클래스의 정보를

다른 클래스가 참조하지 못하도록 하거나, 할 때 말입니다.

 

 

액세스 한정자 - C# 프로그래밍 가이드

C#의 모든 형식과 형식 멤버에는 다른 코드에서 사용될 수 있는지 여부를 제어하는 액세스 가능성 수준이 있습니다. 이 액세스 한정자 목록을 검토합니다.

docs.microsoft.com

 

언어의 제작사인 마이크로소프트의 가이드입니다.

참고해주세요.

 

접근제한자의 종류를 쉽게 풀이하면

Public 타 어셈블리를 포함한 모든 곳에서 접근 가능
Internal 해당 어셈블리에서만 접근 가능
Protected 클래스 내의 다른 클래스에서만 접근 가능
Private 동일 클래스나 구조체에서만 접근 가능

가 되겠습니다.

 

2. 사용해보기


 

이거 한번 실험해보려다 개고생을 했어요.

 

namespace game
{
    class Player
    {
        int HP = 10;
        int MP = 10;
    }

    Player sentimech = new Player();
    sentimech.HP = 1;
    sentimech.MP = 1;
}

 

첫번째 시도)

 

'네임스페이스는 필드나 메서드와 같은 멤버를 직접 포함할 수 없습니다.'

라는 에러가 떴습니다.

 

네임 스페이스 - 클래스/구조체 - 변수/함수 순서를 뛰어넘고

네임스페이스에 함수를 바로 적어서 생긴 문제였습니다.

 

using System;
class Player
{
    static void Main(string[] args)
    {
        int HP;
        int MP;
    }
}

namespace try3
{
    class please
    {
        Player sentimech = new Player();
        sentimech.HP = 1;
        sentimech.MP = 1;
    }
}

 

두번째 시도)

 

그래서 새로운 네임스페이스와, 클래스를 만들어주었습니다.

라고 뜹니다.

 

Player를 복사한 sentimech를 인식하지 못하는거죠.

그래서 여러 예제를 찾아봤습니다.

 

 class Player
{
    public int HP;
    public int MP;
    static void Main(string[] args)
    {
        System.Console.WriteLine ("WTF is the problem?");
    }
}


class Please
{
    static void Main(string[] args)
    {
        Player sentimech = new Player();
        sentimech.HP = 1;
        sentimech.MP = 1;
    }
}

 

n번째 시도)

 

static void Main(string[] args) 를 추가하니 원래 뜨던 에러는 사라졌습니다.

하지만 이번엔 이렇게 나오네요.

 

'프로그램에 진입점이 두 개 이상 정의되어 있습니다. /main으로 컴파일하여 진입점이 포함된 형식을 지정하세요'

 

저 구문에 대한 이해가 필요함을 느꼈습니다.

 

3. static void Main(string[] args) 란 무엇인가?


 

이제 검색을 통해 여러 사이트를 보고 공부하면 됩니다.

 

 

Why do we use static void main (string [] args) in C#?

Answer (1 of 6): [code]static void Main(string[] args) [/code]Let’s break it down first :- static :- You need an entry point into your program. Static means that you can call the function without having instance of a class(or creating object of class). I

www.quora.com

 

영어가 힘드시다면

 

 

C# 6.0, Main 메소드

using System; class Program { static void Main(string[] args) { string text = "Hello World"; Console.WriteLine(text); } } Main 메소드는 프로그램의 시작점을 담당하는 특별한 식별자이며, static void 혹..

o.playgm.co.kr

 

여기 한국어로 잘 설명된 글이 있습니다.

 

자 종합하면 무엇이냐?

 

1) static

   - 해당 함수를 인스턴스화 또는 객체화 하지 않아도 사용 가능하도록 하는 메소드입니다.

     하지만, 클래스나 구조체를 통해 함수를 부른다면 작동하지 않습니다.

 

2) void

   - 함수값을 반환하지 않도록 만드는 메소드입니다.

 

3) Main (string [] args)

   - Main 은 프로그램을 시작하게 만드는 메소드, 진입점을 나타냅니다.

     string[] args 는 string 배열 args란 이름으로 호출한다는 말인데,

     프로그램 시작시에 배열을 선언함으로써 메모리를 미리 확보해놓는 것입니다.

     이름을 마음대로 정하셔도 되고, 편의상 적는 것이므로 괄호를 비워놓아도 프로그램은 잘 돌아갑니다.

 

4. 결과


즉, 

 

'프로그램에 진입점이 두 개 이상 정의되어 있습니다. /main으로 컴파일하여 진입점이 포함된 형식을 지정하세요'

이라는 말은 제가 Main 메소드를 두 개 사용해서 생긴 일이었습니다.

 

 class Player
{
    public int HP;
    public int MP;
    static void Main(string[] args)
    {
        System.Console.WriteLine ("WTF is the problem?");
    }
}


class Please
{
    static void try7()
    {
        Player sentimech = new Player();
        sentimech.HP = 1;
        sentimech.MP = 1;
    }
}

 

Please 라는 클래스를 하나 더 생성한 뒤,

try7 라는 생성자를 통해 sentimech 인스턴스를 생성하였습니다.

 

여기서, Player 클래스의 HP 와 MP 에 private가 붙으면 실행이 되지 않습니다.

HP와 MP의 정보에 대한 접근이 불가능하기 때문이죠.

 

 

잘 되는군요.

쉽지 않았습니다.

 


 

 

하라는 계절학기 공부는 안하고!