클래스 내부에서 클래스를 정의할 수 있다. 중첩 클래스를 사용하여 클래스를 그룹화할 수 있으며, 클래스의 사용 범위를 제한할 수 있다.
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 |