• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

Inconsistent Accessibility

21.01.06 01:59 작성 조회수 351

0

강의 한번 듣고 처음부터 다시 복습 중인데요

이전에도 한 강 들을 때마다 몇번씩 다시 복습 하고 그래서

왜 이런지 도통 이해가 가질 않습니다

현재 단계는 Player 클래스 생성하고, 프로퍼티 및 Initialize 함수 생성하고, 그에 맞춰 Program 및 Board 클래스에 수정을 가하는 부분입니다

문제는 이전에는 한번에도 그러지 않다가 Board 클래스의 Initialize 함수에 파라미터로 Player를 넣을때 Inconsistent Accesibility 오류가 생깁니다

해당 함수의 Accesibility보다 Player 클래스의 Accesiblity가 낮아서 생기는 걸로 보이기에 Player 클래스 앞에 Public을 추가하면 해결을 됩니다만 제가 몇번이고 복습한 내역에서도 강의에서도 이 부분에 Public을 추가 하신적은 없었습니다

어떻게 된건지 알려주세요

namespace MMO2_CompleteReview
{
   

    public class Board
    {
        const char CIRCLE = '\u25cf';
        public int Size { get; private set; }
        public TileType[,] Tile { get; private set; }
        Player _player;

        public enum TileType
        {
            Empty,
            Wall
        }
        
        public void Initialize(int size, Player player)
        {
            if (size % 2 == 0)
                return;

            Size = size;
            _player = player;
            Tile = new TileType[Size, Size];

            //GenerateBinaryTree();
            GenerateSideWinder();
        }

namespace MMO2_CompleteReview
{
    class Player
    {
        public int PosY { get; private set; }
        public int PosX { get; private set; }

        Random random = new Random();
        Board _board;

        public void Initialize(int posY, int posX, int destY, int destX, Board board)
        {
            PosY = posY;
            PosX = posX;

            _board = board;
        }
    }
}

답변 2

·

답변을 작성해보세요.

4

class는 public, internal, private 이렇게 3가지의 접근 한정자를 붙일 수가 있는데
<- 이 제일 개방적, -> 이 제일 보수적 이라고 보시면 됩니다.
(public : 누구나, internal : 내부적으로, private : 나만)

기본적으로 아무것도 붙이지 않으면 internal입니다.
internal은 동일한 assembly 내에서 사용 가능하다(= 같은 namespace 안에서 사용 가능)는 의미인데
강의 예제 코드에서는 class에 접근 한정자를 붙이지 않기 때문에
Program, Board, Player 모두 internal입니다.
이렇게 접근 레벨이 다 동일하니 별다른 문제가 발생하지 않는 것입니다.

작성하신 예제에서는 Board에 public을 붙여주셨는데,
Board는 [누구나 사용 가능]이고 Player는 [내부적으로만 사용 가능]인 상태에서,
Board 내부적으로 Player를 사용한다는 접근 레벨 모순이 생기게 됩니다.
따라서 Board도 public을 떼고 internal로 놔두거나,
Player한테도 public을 붙여줘서
보안 레벨을 맞춰줘야 해당 문제가 사라지게 됩니다.

다음 문서를 읽어보면 도움이 됩니다!

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers#:~:text=Internal%20is%20the%20default%20if,%2C%20private%20protected%20%2C%20or%20private%20.

0

김수민님의 프로필

김수민

2021.11.23

저도 이 문제로 헤맸었는데 좋은 답변 감사합니다!