안녕하세요.
기계과 감성쟁이입니다.
C# 강의들 보면서,
다른 언어들에서 배운 개념들은 대충 보고 넘어가며
처음본 것들만 포스팅을 하는 중이에요.
함수 안에 있다면 지역변수 (local variable)
클래스 안에 있다면 맴버변수 (member variable)
는 조금 흔한 개념이지만
이런 단어는 처음 봐서 적어봤구여,
1. 접근제한자(Access Modifier)란?
접근제한자(Access Modifier)는 정보에 대한 접근을 규정해줄 때 사용합니다.
기초가 되는 클래스의 정보를
다른 클래스가 참조하지 못하도록 하거나, 할 때 말입니다.
언어의 제작사인 마이크로소프트의 가이드입니다.
참고해주세요.
접근제한자의 종류를 쉽게 풀이하면
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) 란 무엇인가?
이제 검색을 통해 여러 사이트를 보고 공부하면 됩니다.
영어가 힘드시다면
여기 한국어로 잘 설명된 글이 있습니다.
자 종합하면 무엇이냐?
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의 정보에 대한 접근이 불가능하기 때문이죠.
잘 되는군요.
쉽지 않았습니다.
하라는 계절학기 공부는 안하고!