본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 18.접근 지정자

1 접근 한정자

클래스내의 변수나 함수에 대한 접근 범위를 설정한다.
(접근 제한자, 접근 지정자 라고도 한다)


요것이 무슨의미나 하믄


이전에 만든 캐릭터 클래스를 살펴보자


using System;

namespace ConsoleApp1
{
class Character
{
public int hp;
public int speed;
public string name;
public void Move(int dir)
{
//
}
public void Jump()
{
//
}
public void Hit()
{
//
}
}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
mario.Jump();

}
}
}

이렇게 되어있고


main에서

mario.name,

mario.jump(); 등으로 사용하였다.


기능을 추가하여 아이템을 먹으면 speed를 빨라지게 해보자

using System;

namespace ConsoleApp1
{
class Character
{
public int hp;
public int speed;
public string name;
public void Move(int dir)
{
//
}
public void Jump()
{
//
}
public void Hit()
{
//
}
public void SpeedUp()
{
speed++;
}
public void ObtainItem()
{
SpeedUp();
}
}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
mario.ObtainItem();

}
}
}

아이템을 얻었을때 말고 다른상황에서도 쓸수 있을꺼 같아 speedUp함수를 따로 만들었고

아이템을 획득했을때 obtainItem에서 speedUp 함수를 호출하는 방식으로 구성하였다.


이제 아이템을 먹으면 속도를 빨라지게 할수있다!



그런데 이 코드를 만들고 같이 프로그래밍 하는 친구에게 쓰라고 건내주었다.


그런데 친구가 졸면서 코딩하는 바람에 speedUP함수를 보지못하고 실수 해버렸다.
using System;

namespace ConsoleApp1
{
class Character
{
public int hp;
public int speed;
public string name;
public void Move(int dir)
{
//
}
public void Jump()
{
//
}
public void Hit()
{
//
}
public void SpeedUp()
{
speed++;
}
public void ObtainItem()
{
SpeedUp();
}
}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
mario.ObtainItem();
mario.speed += 10000;

}
}
}


앗 졸면서 코딩하느라 스피드가 10001이나 증가해버렸다.



프로그램 상에서는 오류가 하나도 없으므로

아무도 해당 상황을 눈치채지 못하였다!


그래서 이상태로 게임을 개발하고 출시해서 게임은 망했다고 한다....





이런 상황을 미연에 방지하기위해

c# 은 접근 지정자를 제공한다.

ps. C#에는 더 많은 접근 한정자를 제공한다.


변수나 함수앞에 붙어있던 public이 접근한정자로

main 같은 함수에서도 .을 통하여 접근할수 있도록 한다.


using System;

namespace ConsoleApp1
{
class Character
{
private int hp;
private int speed;
public string name;
public void Move(int dir)
{
//
}
public void Jump()
{
//
}
public void Hit()
{
//
}
private void SpeedUp()
{
speed++;
}
public void ObtainItem()
{
SpeedUp();
}
}
class Program
{
static void Main(string[] args)
{
Character mario = new Character();
mario.name = "슈퍼마리오";
mario.ObtainItem();
mario.speed += 10000;

}
}
}

다음과 같이 내가 클래스를 만들어 놓으면


obtainItem이라는 함수 내에서 나는 자유룝게 hp, speed, speedup()등을 사용할수있으나


친구는 main함수에서 speed라는 변수나 speedUp이라는 함수를 사용할수가 없다!


다음과 같이 같은 class의 바깥에서는 엑세스 할수 없게 된다.


그러나 같은 클래스내에서는 사용이 가능하다



에러한줄 없이 깔끔하다~



다음과 필요에 따라 같이 밖에서 함부로 변조불가능하게 데이터와 함수를 제한 할 수가 있어진다.

728x90