클래스 및 구조체(C# 프로그래밍 가이드)Classes and Structs (C# Programming Guide)

클래스와 구조체는 .NET Framework의 공용 형식 시스템의 기본 구문 중 두 가지입니다.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. 각각은 기본적으로 하나의 논리 단위에 속하는 데이터 및 동작 집합을 캡슐화하는 데이터 구조입니다.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. 데이터 및 동작은 클래스 또는 구조체의 멤버로, 이 항목의 뒷부분에 나오는 것처럼 메서드, 속성 및 이벤트 등을 포함합니다.The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

클래스 또는 구조체 선언은 런타임에 인스턴스 또는 개체를 만드는 데 사용되는 청사진과도 같습니다.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Person이라고 하는 클래스 또는 구조체를 정의하는 경우 Person이 형식의 이름입니다.If you define a class or struct called Person, Person is the name of the type. 형식 Person의 변수 p를 선언하고 초기화하면 pPerson의 개체 또는 인스턴스로 지칭됩니다.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. 같은 Person 형식의 여러 인스턴스를 만들 수 있으며 각 인스턴스는 속성 및 필드에 서로 다른 값을 가질 수 있습니다.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

클래스는 참조 형식입니다.A class is a reference type. 클래스의 개체가 만들어지면 개체가 할당되는 변수는 해당 메모리에 대한 참조만 보유합니다.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. 개체 참조가 새 변수에 할당되면 새 변수는 원래 개체를 나타냅니다.When the object reference is assigned to a new variable, the new variable refers to the original object. 모두 동일한 데이터를 참조하므로 한 변수의 변경 내용이 다른 변수에도 반영됩니다.Changes made through one variable are reflected in the other variable because they both refer to the same data.

구조체는 값 형식입니다.A struct is a value type. 구조체가 만들어지면 해당 구조체가 할당되는 변수에 구조체의 실제 데이터가 포함됩니다.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. 구조체를 새 변수에 할당하면 구조체가 복사됩니다.When the struct is assigned to a new variable, it is copied. 따라서 새 변수와 원래 변수에 동일한 데이터의 두 가지 별도 복사본이 포함됩니다.The new variable and the original variable therefore contain two separate copies of the same data. 한 복사본의 변경 내용은 다른 복사본에 영향을 주지 않습니다.Changes made to one copy do not affect the other copy.

일반적으로 클래스는 좀 더 복잡한 동작이나 클래스 개체를 만든 후 수정하려는 데이터를 모델링하는 데 사용됩니다.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. 구조체는 구조체를 만든 후에 수정하지 않으려는 데이터를 주로 포함하는 작은 데이터 구조에 가장 적합합니다.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

자세한 내용은 클래스, 개체구조체를 참조하세요.For more information, see Classes, Objects, and Structs.

예제Example

다음 예제에서 ProgrammingGuide 네임스페이스의 CustomClass에는 세 개의 멤버, 즉 인스턴스 생성자, Number라는 속성 및 Multiply이라는 메서드가 있습니다.In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. Program 클래스의 Main 메서드는 CustomClass의 인스턴스(개체)를 만들고 개체의 메서드 및 속성은 점 표기법을 사용하여 액세스됩니다.The Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

namespace ProgrammingGuide
{
   // Class definition.
   public class CustomClass
   {
      // Class members.
      //
      // Property.
      public int Number { get; set; }

      // Method.
      public int Multiply(int num)
      {
          return num * Number;
      }

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

         // Set the value of the public property.
         custClass.Number = 27;

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

캡슐화Encapsulation

캡슐화는 경우에 따라 개체 지향 프로그래밍의 첫 번째 pillar 또는 원리로 인식됩니다.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. 캡슐화의 원리에 따라 클래스 또는 구조체는 클래스 또는 구조체 외부의 코드에 각 멤버가 액세스하는 방법을 지정할 수 있습니다.According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. 코딩 오류 또는 악의적인 악용 가능성을 제한하려면 클래스 또는 어셈블리 외부에서 사용하지 않으려는 메서드 및 변수는 숨길 수 있습니다.Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

클래스에 대한 자세한 내용은 클래스개체를 참조하세요.For more information about classes, see Classes and Objects.

멤버Members

모든 메서드, 필드, 상수, 속성 및 이벤트는 형식 내에서 선언되어야 합니다. 이것을 형식의 멤버라고 합니다.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. 다른 언어에는 있지만 C#에는 전역 변수 또는 메서드가 없습니다.In C#, there are no global variables or methods as there are in some other languages. 프로그램의 진입점인 Main 메서드까지도 클래스 또는 구조체 내에서 선언되어야 합니다.Even a program's entry point, the Main method, must be declared within a class or struct. 다음은 클래스 또는 구조체에서 선언될 수 있는 모든 다양한 종류의 멤버입니다.The following list includes all the various kinds of members that may be declared in a class or struct.

액세스 가능성Accessibility

일부 메서드 및 속성은 클라이언트 코드라고 하는 클래스 또는 구조체 외부의 코드에서 호출하거나 액세스할 수 있습니다.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. 다른 메서드 및 속성은 클래스 또는 구조체 자체에서만 사용할 수 있습니다.Other methods and properties might be only for use in the class or struct itself. 의도된 클라이언트 코드에서만 연결될 수 있도록 코드의 액세스 가능성을 제한하는 것이 중요합니다.It is important to limit the accessibility of your code so that only the intended client code can reach it. 형식 및 해당 멤버가 클라이언트 코드에 액세스하는 방법은 액세스 한정자 public, protected, internal, protected internal, privateprivate protected를 사용하여 지정합니다.You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. 기본 액세스 가능성은 private입니다.The default accessibility is private. 자세한 내용은 액세스 한정자를 참조하세요.For more information, see Access Modifiers.

상속Inheritance

클래스(구조체는 아님)는 상속 개념을 지원합니다.Classes (but not structs) support the concept of inheritance. 다른 클래스(기본 클래스)에서 파생되는 클래스는 생성자와 종료자를 제외하고 기본 클래스의 모든 public, protected 및 internal 멤버를 자동으로 포함합니다.A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. 자세한 내용은 상속다형성을 참조하세요.For more information, see Inheritance and Polymorphism.

클래스를 abstract로 선언할 수도 있습니다. 즉, 하나 이상의 해당 메서드에 구현이 없는 상태를 의미합니다.Classes may be declared as abstract, which means that one or more of their methods have no implementation. 추상 클래스는 직접 인스턴스화할 수 없지만 누락된 구현을 제공하는 다른 클래스에 대한 기본 클래스로 사용될 수 있습니다.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. 다른 클래스가 이 클래스에서 상속 받지 못하게 하려면 클래스를 sealed로 선언할 수도 있습니다.Classes can also be declared as sealed to prevent other classes from inheriting from them. 자세한 내용은 Abstract 및 Sealed 클래스와 클래스 멤버를 참조하세요.For more information, see Abstract and Sealed Classes and Class Members.

인터페이스Interfaces

클래스 및 구조체는 여러 인터페이스에서 상속할 수 있습니다.Classes and structs can inherit multiple interfaces. 인터페이스에서 상속하는 것은 형식이 해당 인터페이스에 정의된 모든 메서드를 구현한다는 것입니다.To inherit from an interface means that the type implements all the methods defined in the interface. 자세한 내용은 인터페이스를 참조하세요.For more information, see Interfaces.

제네릭 형식Generic Types

하나 이상의 형식 매개 변수를 사용하여 클래스 및 구조체를 정의할 수 있습니다.Classes and structs can be defined with one or more type parameters. 클라이언트 코드는 형식의 인스턴스를 만들 때 형식을 제공합니다.Client code supplies the type when it creates an instance of the type. 예를 들어 System.Collections.Generic 네임스페이스의 List<T> 클래스는 하나의 형식 매개 변수로 정의됩니다.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. 클라이언트 코드는 List<string> 또는 List<int>의 인스턴스를 만들어 목록에 포함될 형식을 지정합니다.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. 자세한 내용은 제네릭을 참조하세요.For more information, see Generics.

정적 형식Static Types

클래스(구조체는 아님)를 static으로 선언할 수 있습니다.Classes (but not structs) can be declared as static. static 클래스는 static 멤버만 포함할 수 있고 new 키워드로 인스턴스화할 수 없습니다.A static class can contain only static members and cannot be instantiated with the new keyword. 프로그램이 로드될 때 클래스의 단일 복사본만 메모리에 로드되고 해당 멤버는 클래스 이름을 통해 액세스됩니다.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. 클래스와 구조체 둘 다 정적 멤버를 포함할 수 있습니다.Both classes and structs can contain static members. 자세한 내용은 static 클래스 및 static 클래스 멤버를 참조하세요.For more information, see Static Classes and Static Class Members.

중첩 형식Nested Types

클래스 또는 구조체는 다른 클래스 또는 구조체 내에 중첩될 수 있습니다.A class or struct can be nested within another class or struct. 자세한 내용은 중첩 형식을 참조하세요.For more information, see Nested Types.

부분 형식(Partial Type)Partial Types

하나의 코드 파일 및 별도 코드 파일의 다른 부분에서 클래스, 구조체 또는 메서드의 부분을 정의할 수 있습니다.You can define part of a class, struct or method in one code file and another part in a separate code file. 자세한 내용은 Partial 클래스 및 메서드를 참조하세요.For more information, see Partial Classes and Methods.

개체 이니셜라이저Object Initializers

해당 생성자를 명시적으로 호출하지 않고 클래스 또는 구조체 개체, 개체 컬렉션을 인스턴스화하고 초기화할 수 있습니다.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. 자세한 내용은 개체 및 컬렉션 이니셜라이저를 참조하세요.For more information, see Object and Collection Initializers.

익명 형식Anonymous Types

유지하거나 다른 메서드에 전달할 필요가 없는 데이터 구조로 목록을 채우는 경우처럼 명명된 클래스를 만드는 것이 불편하거나 필요하지 않은 상황에서는 무명 형식을 사용합니다.In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. 자세한 내용은 무명 형식을 참조하세요.For more information, see Anonymous Types.

확장명 메서드Extension Methods

마치 원래 형식에 속하는 것처럼 해당 메서드를 호출할 수 있는 별도 형식을 만들면 파생 클래스를 만들지 않고도 클래스를 “확장”할 수 있습니다.You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. 자세한 내용은 확장 메서드를 참조하세요.For more information, see Extension Methods.

암시적으로 형식화한 지역 변수Implicitly Typed Local Variables

클래스 또는 구조체 메서드 내에서 암시적 형식 지정을 사용하여 컴파일러가 컴파일 타임에 올바른 형식을 결정하도록 할 수 있습니다.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. 자세한 내용은 암시적으로 형식화된 지역 변수를 참조하세요.For more information, see Implicitly Typed Local Variables.

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양을 참조하세요.For more information, see the C# Language Specification. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See also