개체는 하나의 단위로 처리할 수 있는 코드와 데이터의 조합입니다. 개체는 컨트롤이나 폼과 같은 애플리케이션의 조각일 수 있습니다. 전체 애플리케이션은 개체일 수도 있습니다.
Visual Basic에서 애플리케이션을 만들 때 개체를 지속적으로 사용합니다. 컨트롤, 양식 및 데이터 액세스 개체와 같은 Visual Basic에서 제공하는 개체를 사용할 수 있습니다. Visual Basic 애플리케이션 내의 다른 애플리케이션에서 개체를 사용할 수도 있습니다. 사용자 고유의 개체를 만들고 추가 속성 및 메서드를 정의할 수도 있습니다. 개체는 프로그램의 조립식 구성 요소처럼 작동합니다. 이를 통해 코드 조각을 한 번 작성하고 반복해서 다시 사용할 수 있습니다.
이 항목에서는 개체에 대해 자세히 설명합니다.
개체 및 클래스
Visual Basic의 각 개체는 클래스에 의해 정의됩니다. 클래스는 개체의 변수, 속성, 프로시저 및 이벤트를 설명합니다. 개체는 클래스의 인스턴스입니다. 클래스를 정의한 후 필요한 만큼의 개체를 만들 수 있습니다.
개체와 해당 클래스 간의 관계를 이해하려면 쿠키 커터와 쿠키를 생각해 보세요. 쿠키 커터는 수업입니다. 각 쿠키의 특징(예: 크기 및 모양)을 정의합니다. 클래스는 개체를 만드는 데 사용됩니다. 대상은 쿠키입니다.
클래스의 개체 없이 액세스할 수 있는 멤버를 제외하고 해당 멤버에 Shared
액세스하려면 먼저 개체를 만들어야 합니다.
클래스에서 개체 만들기
개체를 만들려는 클래스를 결정하거나 고유한 클래스를 정의합니다. 다음은 그 예입니다.
Public Class Customer Public Property AccountNumber As Integer End Class
Dim 문을 작성하여 클래스 인스턴스를 할당할 수 있는 변수를 만듭니다. 변수는 원하는 클래스의 형식이어야 합니다.
Dim nextCustomer As Customer
새 연산자 키워드를 추가하여 변수를 클래스의 새 인스턴스로 초기화합니다.
Dim nextCustomer As New Customer
이제 개체 변수를 통해 클래스의 멤버에 액세스할 수 있습니다.
nextCustomer.AccountNumber = lastAccountNumber + 1
비고
가능하면 변수를 할당하려는 클래스 형식으로 선언해야 합니다. 이를 초기 바인딩이라고합니다. 컴파일 시간에 클래스 형식을 모르는 경우 변수를 개체 데이터 형식으로 선언하여 지연 바인딩을 호출할 수 있습니다. 그러나 런타임 바인딩은 성능이 느려지고 런타임 개체의 멤버에 대한 액세스를 제한할 수 있습니다. 자세한 내용은 개체 변수 선언을 참조하세요.
여러 인스턴스
클래스에서 새로 만든 개체는 종종 서로 동일합니다. 그러나 개별 개체로 존재하면 변수 및 속성은 다른 인스턴스와 독립적으로 변경할 수 있습니다. 예를 들어 폼에 세 개의 확인란을 추가하는 경우 각 확인란 개체는 클래스의 CheckBox 인스턴스입니다. 개별 CheckBox 개체는 클래스에서 정의한 일반적인 특성 및 기능 집합(속성, 변수, 프로시저 및 이벤트)을 공유합니다. 그러나 각 이름은 고유한 이름을 가지며 별도로 사용하도록 설정 및 비활성화할 수 있으며 양식의 다른 위치에 배치할 수 있습니다.
객체 멤버
개체는 클래스의 인스턴스 를 나타내는 애플리케이션의 요소입니다. 필드, 속성, 메서드 및 이벤트는 개체의 구성 요소이며 해당 멤버를 구성합니다.
멤버 액세스
개체 변수의 이름, 마침표(.
) 및 멤버 이름을 순서대로 지정하여 개체의 멤버에 액세스합니다. 다음 예제에서는 개체의 TextLabel 속성을 설정합니다.
warningLabel.Text = "Data not saved"
멤버의 IntelliSense 목록
IntelliSense는 멤버 액세스 연산자로 마침표(.
)를 입력하는 경우와 같이 멤버 목록 옵션을 호출할 때 클래스의 멤버를 나열합니다. 해당 클래스의 인스턴스로 선언된 변수 이름 다음에 마침표가 입력되면 IntelliSense는 모든 인스턴스 멤버를 나열하고 공유 멤버는 나열하지 않습니다. 클래스 이름 자체 다음에 마침표가 입력되면 IntelliSense는 모든 공유 멤버를 나열하고 인스턴스 멤버는 나열하지 않습니다. 자세한 내용은 Using IntelliSense을 참조하세요.
필드 및 속성
필드 및 속성 은 개체에 저장된 정보를 나타냅니다. 프로시저에서 지역 변수를 검색하고 설정하는 것과 동일한 방식으로 할당 문을 사용하여 해당 값을 검색하고 설정합니다. 다음 예제에서는 Width 객체의 ForeColor 속성을 검색하고, Label 속성을 설정합니다.
Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red
필드를 멤버 변수라고도 하며,
다음과 같은 경우 속성 프로시저를 사용합니다.
값을 설정하거나 검색하는 시기와 방법을 제어해야 합니다.
속성의 유효성을 검사해야 하는 잘 정의된 값 집합이 있습니다.
값을 설정하면
IsVisible
속성 등 개체의 상태에 눈에 띄는 변화가 발생합니다.속성을 설정하면 다른 내부 변수 또는 다른 속성의 값이 변경됩니다.
속성을 설정하거나 검색하려면 먼저 단계 집합을 수행해야 합니다.
다음과 같은 경우 필드를 사용합니다.
값은 자체 유효성 검사 형식입니다. 예를 들어, 변수
True
에False
또는Boolean
이외의 값이 할당되면 오류가 발생하거나 자동 데이터 변환이 일어납니다.데이터 형식에서 지원하는 범위의 모든 값은 유효합니다. 형식
Single
또는Double
.의 많은 속성에 해당합니다.속성은
String
데이터 형식이며 문자열의 크기 또는 값에 대한 제약 조건이 없습니다.자세한 내용은 속성 프로시저를 참조하세요.
팁 (조언)
항상 비 상수 필드를 비공개로 유지합니다. 공개하려면 속성을 대신 사용하세요.
메서드
메서드는 개체에서 수행할 수 있는 작업입니다. 예를 들어 Add 콤보 상자에 새 항목을 추가하는 개체의 ComboBox 메서드입니다.
다음 예제에서는 Start 개체의 Timer 메서드를 설명합니다.
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()
메서드는 단순히 개체에 의해 노출되는 프로시저 입니다.
자세한 내용은 프로시저참조하세요.
이벤트
이벤트는 마우스를 클릭하거나 키를 누르는 등의 개체에서 인식되는 작업이며 응답할 코드를 작성할 수 있습니다. 이벤트는 사용자 작업 또는 프로그램 코드의 결과로 발생하거나 시스템에 의해 발생할 수 있습니다. 이벤트를 알리는 코드는 이벤트를 발생 시키는 것으로, 이벤트에 응답하는 코드는 이벤트를 처리 한다고 합니다.
개체에서 발생시키고 다른 개체에서 처리할 고유한 사용자 지정 이벤트를 개발할 수도 있습니다. 자세한 내용은 이벤트참조하세요.
인스턴스 멤버 및 공유 멤버
클래스에서 개체를 만들 때 결과는 해당 클래스의 인스턴스입니다. Shared 키워드로 선언되지 않은 멤버는 해당 특정 인스턴스에 엄격하게 속하는 인스턴스 멤버입니다. 한 인스턴스의 인스턴스 멤버는 동일한 클래스의 다른 인스턴스에 있는 동일한 멤버와 독립적입니다. 예를 들어 인스턴스 멤버 변수는 다른 인스턴스에 서로 다른 값을 가질 수 있습니다.
키워드로 Shared
선언된 멤버는 특정 인스턴스가 아닌 전체 클래스에 속하는 공유 멤버입니다. 공유 멤버는 만든 클래스의 인스턴스 수 또는 인스턴스를 만들지 않더라도 한 번만 존재합니다. 예를 들어 공유 멤버 변수에는 클래스에 액세스할 수 있는 모든 코드에서 사용할 수 있는 값이 하나만 있습니다.
공유되지 않은 멤버에 접근
개체가 해당 클래스에서 만들어지고 개체 변수에 할당되었는지 확인합니다.
Dim secondForm As New System.Windows.Forms.Form
개체 변수 이름 뒤에 멤버 액세스 연산자(
.
)와 멤버 이름을 사용합니다.secondForm.Show()
공유 멤버에 접근하기
클래스 이름 다음에 멤버 액세스 연산자(
.
)와 멤버 이름을 사용하십시오. 항상 클래스 이름을 통해 개체의 멤버에Shared
직접 액세스해야 합니다.Console.WriteLine("This computer is called " & Environment.MachineName)
클래스에서 개체를 이미 만든 경우 개체의 변수를
Shared
통해 멤버에 액세스할 수도 있습니다.
클래스와 모듈 간의 차이점
클래스와 모듈 간의 주요 차이점은 클래스를 개체로 인스턴스화할 수 있지만 표준 모듈은 인스턴스화할 수 없다는 것입니다. 표준 모듈 데이터의 복사본이 하나만 있기 때문에 프로그램의 한 부분이 표준 모듈에서 공용 변수를 변경하는 경우 프로그램의 다른 부분은 해당 변수를 읽는 경우 동일한 값을 가져옵니다. 반면, 개체 데이터는 인스턴스화된 각 개체에 대해 별도로 존재합니다. 또 다른 차이점은 표준 모듈과 달리 클래스가 인터페이스를 구현할 수 있다는 것입니다. 클래스가 MustInherit 한정자로 표시된 경우 직접 인스턴스화할 수 없습니다. 그러나 이는 상속할 수 있으며, 모듈은 상속할 수 없기 때문에 여전히 모듈과는 다릅니다.
비고
Shared
한정자가 클래스 멤버에 적용되면 클래스의 특정 인스턴스 대신 클래스 자체와 연결됩니다. 모듈 멤버에 액세스하는 것과 동일한 방식으로 클래스 이름을 사용하여 멤버에 직접 액세스합니다.
클래스 및 모듈은 멤버에 대해 서로 다른 범위를 사용합니다. 클래스 내에 정의된 멤버는 클래스의 특정 인스턴스 내에서 범위가 지정되며 개체의 수명 동안만 존재합니다. 클래스 외부에서 클래스 멤버에 액세스하려면 Object 형식의 정규화된 이름을 사용해야 합니다. 멤버입니다.
반면에 모듈 내에서 선언된 멤버는 기본적으로 공개적으로 액세스할 수 있으며 모듈에 액세스할 수 있는 모든 코드에서 액세스할 수 있습니다. 즉, 표준 모듈의 변수는 프로젝트의 어디에서나 볼 수 있고 프로그램 수명 동안 존재하기 때문에 효과적으로 전역 변수입니다.
클래스 및 개체 다시 사용
개체를 사용하면 변수 및 프로시저를 한 번 선언한 다음 필요할 때마다 다시 사용할 수 있습니다. 예를 들어 애플리케이션에 맞춤법 검사기를 추가하려는 경우 모든 변수를 정의하고 맞춤법 검사 기능을 제공하는 함수를 지원할 수 있습니다. 맞춤법 검사기를 클래스로 만드는 경우 컴파일된 어셈블리에 참조를 추가하여 다른 애플리케이션에서 다시 사용할 수 있습니다. 더 좋은 방법으로, 다른 사람이 이미 개발한 맞춤법 검사기를 사용하여 작업을 덜 수 있습니다.
.NET은 사용할 수 있는 구성 요소의 많은 예를 제공합니다. 다음 예제에서는 TimeZone 네임스페이스의 System 클래스를 사용합니다. TimeZone 는 현재 컴퓨터 시스템의 표준 시간대에 대한 정보를 검색할 수 있는 멤버를 제공합니다.
Public Sub ExamineTimeZone()
Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
Dim s As String = "Current time zone is "
s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
s &= "different from UTC (coordinated universal time)"
s &= vbCrLf & "and is currently "
If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
s &= "on ""summer time""."
Console.WriteLine(s)
End Sub
앞의 예제에서는 첫 번째 Dim 문이 TimeZone 형식의 개체 변수를 선언하고, TimeZone 속성에서 반환된 CurrentTimeZone 개체를 할당합니다.
개체 간 관계
개체는 여러 가지 방법으로 서로 관련될 수 있습니다. 관계의 주된 종류는 계층 구조 및 포함입니다.
계층 관계
클래스가 더 기본적인 클래스에서 파생되는 경우 계층적 관계가 있다고 합니다. 클래스 계층은 보다 일반적인 클래스의 하위 형식인 항목을 설명할 때 유용합니다.
다음 예제에서는 일반 Button 처럼 작동하지만 전경색과 배경색을 반대로 하는 메서드를 노출하는 특수 종류를 Button 정의한다고 가정합니다.
기존 클래스에서 파생된 클래스 정의
클래스 문을 사용하여 필요한 개체를 만들 클래스를 정의합니다.
Public Class ReversibleButton
클래스의 마지막 코드 줄 뒤에 문이 오는지 반드시
End Class
확인합니다. 기본적으로 IDE(통합 개발 환경)는End Class
문을 입력하면Class
을 자동으로 생성합니다.Class
문 뒤에 즉시 Inherits 문을 따르십시오. 새 클래스가 파생되는 클래스를 지정합니다.Inherits System.Windows.Forms.Button
새 클래스는 기본 클래스에서 정의한 모든 멤버를 상속합니다.
파생 클래스가 노출하는 추가 멤버에 대한 코드를 추가합니다. 예를 들어 메서드를
ReverseColors
추가할 수 있으며 파생 클래스는 다음과 같이 표시될 수 있습니다.Public Class ReversibleButton Inherits System.Windows.Forms.Button Public Sub ReverseColors() Dim saveColor As System.Drawing.Color = Me.BackColor Me.BackColor = Me.ForeColor Me.ForeColor = saveColor End Sub End Class
ReversibleButton
클래스에서 개체를 생성하면, 그것은 Button 클래스의 모든 멤버와ReverseColors
메서드, 그리고ReversibleButton
에 정의된 다른 새로운 멤버들에 접근할 수 있습니다.
파생 클래스는 기반으로 하는 클래스에서 멤버를 상속하므로 클래스 계층 구조에서 진행하면서 복잡성을 더할 수 있습니다. 자세한 내용은 상속 기본 사항을 참조하세요.
코드 컴파일
컴파일러가 새 클래스를 파생하려는 클래스에 액세스할 수 있는지 확인합니다. 이는 앞의 예제와 같이 이름을 정규화하거나 Imports 문(.NET 네임스페이스 및 형식)에서 해당 네임스페이스를 식별하는 것을 의미할 수 있습니다. 클래스가 다른 프로젝트에 있는 경우 해당 프로젝트에 대한 참조를 추가해야 할 수 있습니다. 자세한 내용은 프로젝트의 참조 관리를 참조하세요.
포함 관계
개체를 연결할 수 있는 또 다른 방법은 포함 관계입니다. 컨테이너 개체는 논리적으로 다른 개체를 캡슐화합니다. 예를 들어, OperatingSystem 개체는 논리적으로 Version 개체를 포함하며, 이 개체는 Version 속성을 통해 반환됩니다. 컨테이너 개체는 다른 개체를 물리적으로 포함하지 않습니다.
수집품
특정 형식의 개체 포함은 컬렉션으로 표시됩니다. 컬렉션은 열거할 수 있는 유사한 개체의 그룹입니다. Visual Basic은 For Each...Next 문에서 컬렉션의 항목을 순회할 수 있는 특정 구문을 지원합니다. 또한 컬렉션은 종종 인덱스나 고유 문자열을 사용하여 요소를 검색할 수 있도록 Item[] 사용합니다. 컬렉션은 인덱스를 사용하지 않고 항목을 추가하거나 제거할 수 있으므로 배열보다 더 쉽게 사용할 수 있습니다. 사용 편의성 때문에 컬렉션은 양식과 컨트롤을 저장하는 데 자주 사용됩니다.
관련 항목
연습: 클래스 정의
클래스를 만드는 방법에 대한 단계별 설명을 제공합니다.
오버로드된 속성 및 메서드
오버로드된 속성 및 메서드
상속 기본 사항
상속 한정자, 메서드 및 속성 재정의, MyClass 및 MyBase를 다룹니다.
개체 수명: 개체를 만들고 소멸하는 방법
클래스 인스턴스 만들기 및 삭제에 대해 설명합니다.
익명 형식
데이터 형식에 대한 클래스 정의를 작성하지 않고 개체를 만들 수 있는 익명 형식을 만들고 사용하는 방법을 설명합니다.
개체 이니셜라이저: 명명된 형식 및 익명 형식
단일 식을 사용하여 명명된 형식과 익명 형식의 인스턴스를 만드는 데 사용되는 개체 이니셜라이저에 대해 설명합니다.
방법: 익명 형식 선언에서 속성 이름 및 형식 유추
익명 형식 선언에서 속성 이름 및 형식을 유추하는 방법을 설명합니다. 성공 및 실패 유추의 예를 제공합니다.
.NET