중첩 클래스(Nested Class)
클래스 내부에서 클래스를 정의할 수 있습니다. 이러한 클래스 구현 방식을 중첩 클래스라고 합니다. 중첩 클래스를 사용하여 클래스를 그룹화할 수 있으며, 클래스의 사용 범위를 제한할 수 있습니다.
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() 메서드를 호출할 수 있습니다.
정리
- 중첩 클래스는 클래스 내부에서 클래스를 정의한 것을 말합니다.
- 클래스 구조를 그룹화하고 싶은 경우 중첩 클래스를 사용합니다.
- 내부 클래스는 외부 클래스의 구조이므로 클래스 구조를 쉽게 파악할 수 있습니다.
- 내부 클래스에서 외부 클래스 멤버를 접근할 수 있습니다.
'C#' 카테고리의 다른 글
[C#]캡슐화(Encapsulation) (0) | 2022.05.25 |
---|---|
[C#]확장 메서드(Extension Method) (0) | 2022.05.24 |
[C#]Partial 클래스(Partial Class) (0) | 2022.05.18 |
[C#]메서드 숨기기(Method Hiding) (0) | 2022.05.16 |
[C#]가상 메서드(Virtual Method), Virtual 키워드 (0) | 2022.05.16 |
댓글