ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 오블완
  • C
  • SQL
  • 언리얼
  • 알고리즘
  • 티스토리챌린지
  • 함수
  • 포인터
  • 프로그래머스
  • Unity
  • 유니티
  • 배열
  • 클래스
  • string
  • 그래픽스
  • c#
  • 문자열
  • 백준
  • 파이썬
  • C++

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C#

C# 중첩 클래스 (Nested Class)

2022. 7. 20. 19:59

클래스 내부에서 클래스를 정의할 수 있다. 중첩 클래스를 사용하여  클래스를 그룹화할 수 있으며, 클래스의 사용 범위를 제한할 수 있다.

class OutsideClass {
  // ...
  class InsideClass {
    // ...
  }
}

OutsideClass 내부에 InsideClass 클래스를 정의했으므로 OutsideClass는 중첩 클래스다.

사용하는 이유

  • 클래스를 논리적으로 그룹화할 수 있다.
  • 특정 클래스 내부에서만 사용되기 때문에 코드를 더 쉽게 파악할 수 있으며, 유지 관리가 쉽다.
  • 특정 클래스 내부에서만 사용되므로 클래스 구조가 단순해진다.

예제

학교에는 선생님이 존재하므로 School 클래스 내부에 Teacher 클래스를 선언한다.

public class School
{
  public void PrintSchool()
  {
    Console.WriteLine("PrintSchool() Method 호출");
  }

  // School 클래스의 내부 클래스입니다.
  public class Teacher
  {
    public void PrintTeacher()
    {
      Console.WriteLine("PrintTeacher() Method 호출");
    } 
  }
}

class Program
{
  static void Main(string[] args)
  {
    // School 클래스의 객체 생성
    School school = new School();
    school.PrintSchool();

    // 내부 클래스인 Teacher의 객체 생성
    School.Teacher teacher = new School.Teacher();
    teacher.PrintTeacher();
  }
}

실행 결과

PrintSchool() Method 호출
PrintTeacher() Method 호출

내부 클래스 Teacher의 객체를 생성하기 위해 외부 클래스인 School에서 점 연산자를 사용하여 Teacher 클래스를 접근한다. 

내부 클래스에서 외부 클래스 객체 생성

내부 클래스의 내부에서 외부 클래스의 멤버를 접근할 수 있다. 다음 예제는 Teacher 클래스에 선언된 PrintTeacher() 메서드에서 School 클래스의 PrintSchool() 메서드를 호출한다.

public class School
{
  public void PrintSchool()
  {
    Console.WriteLine("PrintSchool() Method 호출");
  }

  public class Teacher
  {
    public void PrintTeacher()
    {
      School school = new School();
      school.PrintSchool();
      Console.WriteLine("PrintTeacher() Method 호출");
    } 
  }
}

class Program
{
  static void Main(string[] args)
  {
    School.Teacher teacher = new School.Teacher();
    teacher.PrintTeacher();
  }
}

실행 결과

PrintSchool() Method 호출
PrintTeacher() Method 호출

내부 클래스는 private으로 선언된 외부 클래스 멤버를 접근할 수 있다. 다음 예제는 School 클래스에서 private으로 선언된 name 필드를 Teacher 클래스에서 접근하는 예제다.

public class School
{
  private string name;

  public class Teacher
  {
    public void PrintTeacher()
    {
      School school = new School();
      school.name = "중첩 클래스 스쿨";
      Console.WriteLine("School Name: " + school.name);
    } 
  }
}

class Program
{
  static void Main(string[] args)
  {
    School.Teacher teacher = new School.Teacher();
    teacher.PrintTeacher();
  }
}

실행 결과

School Name: 중첩 클래스 스쿨

정적 멤버(Static Member) 접근

외부 클래스의 멤버가 static으로 선언된 경우 외부 클래스의 객체를 생성할 필요가 없다. 외부 클래스 이름으로 정적 멤버를 접근한다. 다음 예제는 내부 클래스에서 외부 클래스 정적 멤버를 접근한다.

public class School
{
  private static string name = "ABC";

  private static void PrintSchool()
  {
    Console.WriteLine("PrintSchool() 메서드 호출");
  }

  public class Teacher
  {
    public void PrintTeacher()
    {
      School.PrintSchool();
      Console.WriteLine("School Name: " + School.name);
    } 
  }
}

class Program
{
  static void Main(string[] args)
  {
    School.Teacher teacher = new School.Teacher();
    teacher.PrintTeacher();
  }
}

실행 결과

PrintSchool() 메서드 호출
School Name: ABC

상속(Inherit)

내부 클래스도 일반 클래스와 마찬가지로 상속할 수 있다. 다음 에제는 내부 클래스가 외부 클래스를 상속함으로써 내부 클래스의 객체가 외부 클래스의 멤버를 접근한다.

public class School
{
  public void PrintSchool()
  {
    Console.WriteLine("PrintSchool() 메서드 호출");
  }

  public class Teacher : School
  {
  }
}

class Program
{
  static void Main(string[] args)
  {
    School.Teacher teacher = new School.Teacher();
    teacher.PrintSchool();
  }
}

실행 결과

PrintSchool() 메서드 호출

내부 클래스 Teacher가 외부 클래스 School를 상속합니다. 따라서 Teacher 클래스의 객체로 School 클래스의 PrintSchool() 메서드를 호출할 수 있다.

 

출처: https://developer-talk.tistory.com/473 [평범한 직장인의 공부 정리:티스토리]

저작자표시 (새창열림)

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 읽기 전용 (readonly)  (0) 2022.07.21
C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)  (0) 2022.07.21
C# 부분 클래스 (partial)  (0) 2022.07.19
C# 인덱서 (Indexer)  (0) 2022.07.19
C# 확장 메서드 (Extension Method)  (0) 2022.07.18
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • C# 읽기 전용 (readonly)
    • C# 클래스 상속 불가 및 함수 오버라이딩 불가 (sealed)
    • C# 부분 클래스 (partial)
    • C# 인덱서 (Indexer)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바