C# 중첩 클래스(Nested Class) 이해: 정의, 사용법, 상속
C# 중첩 클래스 (Nested Class) 이해하기
실전 예제로 C# 중첩 클래스 정의, 접근, 상속 모범 사례 시연.
C#에서 클래스 내부에 다른 클래스 선언 가능. 내부 타입을 중첩 클래스(Nested Class)라 함. 예:
class OuterClass {
// 외부 멤버
class InnerClass {
// 내부 멤버
}
}
InnerClass가 OuterClass 안에 생성. 내부 타입은 접근 한정자 허용 범위 외에는 외부 타입에서만 가시적.
중첩 클래스 멤버 접근
중첩 타입 작업 위해 각 클래스 별도 인스턴스화.
1. 외부 클래스 인스턴스 생성
OuterClass outer = new OuterClass();
outer는 OuterClass 객체.
2. 중첩 클래스 인스턴스 생성
OuterClass.InnerClass inner = new OuterClass.InnerClass();
InnerClass가 OuterClass 안에 중첩되어 외부 타입 이름으로 한정.
인스턴스화 후 객체 참조로 멤버 호출.
예제: 메서드 가진 중첩 클래스
using System;
namespace NestedClassDemo {
public class Car {
public void DisplayCar() => Console.WriteLine("Car: Bugatti");
public class Engine {
public void DisplayEngine() => Console.WriteLine("Engine: Petrol Engine");
}
}
class Program {
static void Main(string[] args) {
Car sportsCar = new Car();
sportsCar.DisplayCar();
Car.Engine petrolEngine = new Car.Engine();
petrolEngine.DisplayEngine();
Console.ReadLine();
}
}
}
출력
Car: Bugatti
Engine: Petrol Engine
외부 Car와 중첩 Engine 객체 생성 후 메서드 호출.
외부 인스턴스에서 중첩 타입 메서드 직접 호출 불가:
// 잘못된 예
sportsCar.DisplayEngine();
중첩 클래스에서 외부 클래스 멤버 접근
중첩 클래스 포함 타입 멤버 참조 가능. 외부 타입 인스턴스나 정적 멤버용 외부 타입 이름 사용.
인스턴스로 인스턴스 멤버 접근
using System;
namespace NestedClassDemo {
public class Car {
public string Brand = "Bugatti";
public class Engine {
public void ShowBrand() {
Car car = new Car();
Console.WriteLine("Brand: " + car.Brand);
}
}
}
class Program {
static void Main(string[] args) {
Car.Engine engine = new Car.Engine();
engine.ShowBrand();
Console.ReadLine();
}
}
}
출력
Brand: Bugatti
인스턴스화 없이 정적 멤버 접근
using System;
namespace NestedClassDemo {
public class Car {
public static string Brand = "Bugatti";
public class Engine {
public void ShowBrand() {
Console.WriteLine("Brand: " + Car.Brand);
}
}
}
class Program {
static void Main(string[] args) {
Car.Engine engine = new Car.Engine();
engine.ShowBrand();
Console.ReadLine();
}
}
}
출력
Brand: Bugatti
중첩 클래스 관련 상속
중첩 클래스도 일반 타입처럼 상속 참여 가능.
외부 클래스에서 파생
using System;
namespace NestedClassDemo {
class Computer {
public void Display() => Console.WriteLine("Method of Computer class");
public class CPU {
// 추가 멤버 가능
}
}
class Laptop : Computer {
// Laptop이 Computer 모든 멤버 상속
}
class Program {
static void Main(string[] args) {
Laptop laptop = new Laptop();
laptop.Display();
Console.ReadLine();
}
}
}
출력
Method of Computer class
중첩 클래스에서 파생
using System;
namespace NestedClassDemo {
class Computer {
public class CPU {
public void Display() => Console.WriteLine("Method of CPU class");
}
}
class Laptop : Computer.CPU {
// Laptop이 Computer.CPU 멤버 상속
}
class Program {
static void Main(string[] args) {
Laptop laptop = new Laptop();
laptop.Display();
Console.ReadLine();
}
}
}
출력
Method of CPU class
중첩 클래스 상속 시 외부 클래스 이름으로 타입 한정 필수: Computer.CPU.