CodeGym /행동 /C# SELF /접근 제한자와 스코프(범위)

접근 제한자와 스코프(범위)

C# SELF
레벨 8 , 레슨 5
사용 가능

1. C#의 기본 접근 제한자

프로그래밍할 때, 누가 그리고 어디서 내 변수나 메서드를 볼 수 있고 바꿀 수 있는지 딱 정하고 싶을 때가 많지. 이건 마치 아파트처럼, 모든 공간이 모두에게 열려 있는 게 아니잖아. 어떤 곳은 입주자만, 어떤 곳은 관리인만 들어갈 수 있지.

프로그래밍에서 이런 "접근 제어"는 접근 제한자로 해결해. 이 제한자들은 클래스의 멤버(변수, 필드, 메서드, 프로퍼티 등)가 클래스 밖, 다른 클래스, 다른 프로젝트에서 보이는지 아닌지를 정해줘. 이게 바로 OOP에서 캡슐화의 핵심 구현 중 하나야: 내부 구현은 숨기고, 필요한 "인터페이스"만 밖으로 내보내는 거지.

여기 주요 접근 제한자랑 간단 설명 표가 있어:

제한자 어디서 보여? (쉽게 설명)
public
어디서나 (프로젝트 안팎, 어셈블리 참조만 있으면)
private
오직 같은 클래스 안에서만
(제한자 없음)
private랑 똑같아

어렵게 느껴져? 사실 별거 없어. 어디에 뭘 쓰는 게 좋은지 예제로 같이 보자.

2. public 제한자 — 아무나 접근 가능

public 제한자를 쓰면 변수나 메서드가 어디서나 보여. 클래스 멤버를 public으로 선언하면, 그 클래스를 볼 수 있는 어떤 코드에서도 접근할 수 있어.

public class Person
{
    public string Name;
    public void SayHello()
    {
        Console.WriteLine($"안녕! 내 이름은 {Name}이야");
    }
}
public 필드와 메서드가 있는 클래스 예시

이제 어디서든 (같은 프로젝트든, 어셈블리 참조만 있으면 다른 프로젝트든) 이렇게 쓸 수 있어:

Person p = new Person();
p.Name = "알리사";
p.SayHello();

실전 팁: 모든 걸 public으로 만들지 마! 이건 코드 보안의 핵심이야.

3. private 제한자 — 내꺼야, 건들지 마!

private 제한자는 클래스 내부만 볼 수 있게 막아줘: 외부에선 뭔지 볼 수도, 바꿀 수도 없어. C#에서 기본적으로 모든 필드와 메서드는 private, 다른 제한자를 안 쓰면.

public class Cup
{
    private double volume; // 이 필드는 Cup 클래스 안에서만 보여

    public void Fill(double value)
    {
        volume = value; // 클래스 내부에선 사용 가능
    }

    public double GetVolume()
    {
        return volume; // 외부에선 volume이 있는지 모름
    }
}
private 필드 사용 예시

여기서 volume은 다른 데선 못 보고, Cup 안의 어떤 메서드든 쓸 수 있어. 볼륨을 알려면 GetVolume() 같은 public 메서드를 제공하는 거지.

4. 스코프(범위): 변수, 메서드, 클래스

스코프(범위)란, 프로그램에서 네가 선언한 이름(변수, 메서드, 클래스 등)이 의미 있고 접근 가능한 영역이야.

  • 로컬 변수 (메서드나 코드 블록 안에서 선언): 그 메서드나 블록 안에서만 보여.
  • 메서드 파라미터: 그 메서드 안에서만 보여.
  • 클래스 필드: 클래스 전체에서 보여 (접근 제한자에 따라 다름).
  • 클래스: 중첩 클래스가 private면, 감싸는 클래스 안에서만 보여 등등.

스코프 예시를 보자:

public class Counter
{
    private int count = 0; // 클래스 전체에서 보임

    public void Increment()
    {
        count++;   // 필드 사용 가능
        int temp = count * 2; // temp는 Increment 안에서만 보임
    }

    public int GetCount()
    {
        // temp는 여기서 안 보여!
        return count;
    }
}
변수 스코프(범위) 예시

만약 tempGetCount()에서 쓰려고 하면 에러 나.

5. 변수 섀도잉(shadowing)

섀도잉은, 한 스코프(범위) 안에서 외부 스코프랑 같은 이름의 변수(또는 파라미터)를 선언하는 상황이야. 이 블록 안에선 "새" 이름이 가려버려서 바깥 값을 바로 쓸 수 없어.

섀도잉 예시:

class ShadowDemo
{
    int value = 10; // 클래스 필드

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 — 클래스 필드
        int value = 5; // 로컬 변수가 클래스 필드를 가림
        Console.WriteLine(value); // 5가 출력됨, 10 아님
    }
}
변수 섀도잉(shadowing) 예시

여기서 int value = 5;를 쓰면, 이게 메서드 안에서 클래스 필드를 가려버려. PrintValue() 안에서 value를 쓰면 로컬 변수만 써.

그래도 클래스 필드에 접근하고 싶으면 this 키워드를 써:

class ShadowDemo
{
    int value = 10;

    void PrintValue()
    {
        Console.WriteLine(value);      // 10 — 클래스 필드
        int value = 5;
        Console.WriteLine(value);      // 5 — 로컬 변수
        Console.WriteLine(this.value); // 10 — 클래스 필드
    }
}
섀도잉 상황에서 this로 클래스 필드 접근하기

섀도잉은 헷갈릴 수 있으니까, 변수 이름을 의미 있게 다르게 짓는 게 좋아 — 특히 큰 팀에서 일할 땐 더더욱!

1
설문조사/퀴즈
함수, 레벨 8, 레슨 5
사용 불가능
함수
함수 소개
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION