윈도우즈프로그래밍#6
LeeMir, 01 April 2021
클래스
클래스
- 클래스(Class)
- C# 프로그램의 기본 단위
- 재사용성(reusability), 이식성(portability), 유연성(flexibility) 증가
- 객체를 정의하는 템플릿
- 객체의 구조와 행위를 정의하는 방법
- 자료 추상화(Data Abstraction)의 방법
- 일반적으로 선언할 때 이름을 대문자로 시작함(필수는 아님)
- C# 프로그램의 기본 단위
- 객체(Object)
- 클래스의 인스턴스로 변수와 같은 역할
- 객체를 정의하기 위해서는 해당하는 클래스를 정의
- 수정자(modifier)
- 부가적인 속성을 명시하는 방법
- 클래스 수정자(class modifier)
- public
- 다른 프로그램에서 사용 가능
- internal
- 같은 프로그램에서만 사용 가능
- 수정자가 생략된 경우(default라는 의미)
- 다른 네임스페이스더라도 같은 프로그램이면 사용 가능
- static
- 클래스의 모든 멤버가 정적 멤버
- 클래스를 static으로 선언 안하고 멤버를 static으로 선언해 일부 멤버를 정적 멤버로 만드는 것도 가능
- 객체 단위로 존재하는 것이 아니라 클래스 단위로 존재
- 클래스의 모든 멤버가 정적 멤버
- abstrat, sealed - 추후(파생 클래스)에 설명
- protected, private -
- new
- 중첩 클래스에서 사용되며 베이스 클래스의 멤버를 숨김
- public
- 객체 선언
- 클래스형의 변수 선언
Fraction f1, f2;
- f1, f1 : 객체를 참조(reference)하는 변수 선언
- 객체 생성
f1 = new Fraction();
Fraction f1 = new Fraction();
- 생성자
- 객체를 생성할 때 객체의 초기화를 위해 자동으로 호출되는 루틴
- 클래스와 동일한 이름을 갖는 메소드
- 객체의 멤버 참조
- 객체 이름과 멤버 사이에 멤버 접근 연산자인 점 연산자(dot operator) 사용
- 예)
- 필드 참조 : f1.numerator
- 메소드 참조 : f1.Add(f2)
- 연산자 중복 : 직접 수식 사용
- 멤버의 참조 형태
objectName.MemberName
- 만약, 해당 멤버가 정적(static) 멤버라면
className.MemberName
으로 참조해야 함
필드
- 필드(field)
- 객체의 구조를 기술하는 자료 부분
- 변수의 선언으로 구성
접근 수정자
-
접근 수정자(access modifier)
-
다른 클래스에서 접근 허용 정도를 나타내는 속성
-
접근 수정자 동일 클래스 파생 클래스 네임스페이스 모든 클래스 private O X X X protected O O X X internal O X O X protected internal O O O X public O O O O - 일반적으로 메쏘드는 public, 필드는 private으로 선언
-
-
private
- 정의 된 클래스 내에서만 필드 접근 허용
- 접근 수정자가 생략된 경우(default의 의미)
- class에서는 internal이 default지만, 필드는 private가 default임
-
internal
- 동일한 어셈블리 내에서 접근 가능
- 어셈블리
- 단일한 단위로 존재하는 .NET의 실행 가능한 프로그램 또는 실행 프로그램의 일부
- 실행 및 배포 단위(.EXE 또는 .DLL 파일)
- 어셈블리
- 동일한 어셈블리 내에서 접근 가능
-
protected
- 파생 클래스에서만 참조 가능
-
protected internal 또는 internal protected
- 파생 클래스와 동일 네임스페이스 내에서도 자유롭게 접근 가능
new / static 수정자
- new
- 상속 계층에서 상위 클래스에서 선언된 멤버를 하위 클래스에서 새롭게 재정의하기 위해 사용
- static
- 정적 필드(static field)
- 클래스 단위로 존재
- 객체마다 존재하지 않음
- 생성 객체가 없는 경우에도 존재하는 변수
- 정적 필드의 참조 형태
ClassName.staticField
readonly / const 수정자
- readonly
- 읽기전용 필드
- 값이 변할 수 없는 속성
- 실행 중에 값이 결정
- const
- 값이 변할 수 없는 속성
- 컴파일 시간에 값이 결정
메소드
-
객체의 행위를 기술하는 방법
- 객체의 상태를 검색하고 변경하는 작업
- 특정한 행동을 처리하는 프로그램 코드를 포함하고 있는 함수의 형태
-
메소드 수정자
- 접근 수정자 : public, protected, internal, private
- static
- 정적 메소드
- 전역 함수와 같은 역할
- 정적 메소드는 해당 클래스의 정적 필드 또는 정적 메소드만 참조 가능
- 정적 메소드 호출 형태
ClassName.MethodName();
- abstract / extern
- 메소드 몸체 대신에 세미콜론(;)이 나옴
- abstract - 메소드가 하위 클래스에 정의
- extern - 메소드가 외부에 정의
- new, virtual, override, sealed - 추후 설명
-
매개 변수
-
메소드 내에서만 참조될 수 있는 지역 변수
-
매개 변수의 종류
- 형식 매개 변수
- 메소드를 정의할 때 사용하는 매개 변수
- 실 매개 변수
- 메소드를 호출할 때 사용하는 매개 변수
- 형식 매개 변수
-
매개 변수의 자료형
- 기본형(Call by value), 참조형(Call by reference)
-
클래스 필드와 매개 변수를 구별하기 위해 this 지정어 사용
- 클래스 필드에 있는 변수 이름과 매개 변수 이름이 같을 때 this로 구분 가능
- 클래스 필드에 this를 붙임
-
매개 변수 전달
- 값 호출(call by value)
- 실 매개 변수의 값이 형식 매개 변수로 전달
- 참조 호출(call by reference)
- 주소 호출(call by address)
- 실 매개 변수의 주소가 형식 매개 변수로 전달
- C#에서 제공하는 방법
- 매개 변수 수정자 이용(*를 쓰지 않음)
- 객체 참조를 매개 변수로 사용
- 객체를 선언하면 객체 자체가 아니라 포인터임을 이용
- 객체는 reference 타입임
- 매개 변수 수정자
- ref - 매개 변수가 전달될 때 반드시 초기화
- out - 매개 변수가 전달될 때 초기화하지 않아도 됨
- 값 호출(call by value)
-
명명된 매개 변수
- 메소드를 호출할 때 매개 변수 목록 중 어느 매개 변수에 데이터를 할당할 것인지를 지정하는 것은 “순서”
- 명명된 매개 변수는 메소드를 호출할 때 매개 변수의 이름을 명시함으로써 순서에 관계없이 매개 변수에 할당할 데이터를 바인드하는 기능
-
선택적 매개 변수
-
메소드 선언시 매개 변수에 기본 값을 할당함으로써, 해당 매개 변수에 명시적으로 값을 할당할 지/ 않을 지를 선택하게 하는 기능
-
뒷 부분을 생략 가능, 앞 부분은 생략 불가능
-
void MyMethod(string arg0="", string arg1="") { Console.WriteLine("A"); } void MyMethod() { Console.WriteLine("B"); } MyMethod();
-
위 프로그램의 결과는 “B”
- 만약
void MyMethod() {}
가 없다면 “A”가 출력됨
-
-
매개 변수 배열(parameter array)
- 실 매개 변수의 개수가 상황에 따라 가변적인 경우
- 메소드를 정의할 때 형식 매개 변수를 결정할 수 없음
- 매개 변수 배열 정의 예
void ParameterArray1(params int[] args) { /* ... */ }
- 호출 예
ParameterArray1(1, 2, 3, 4);
- 개수가 달라져도 무방
- 실 매개 변수의 개수가 상황에 따라 가변적인 경우
-
-
Main 메소드
- C# 응용 프로그램의 시작점
- Main 메소드의 매개 변수 - 명령어 라인으로부터 string 전달
- 명령어 라인으로부터 string 전달 방법
c:\>실행 파일명 인수1 인수2 ... 인수 n
- args[0] = 인수1, args[1] = 인수2, args[n-1] = 인수 n
- 주의 : C에서는 args[0]이 실행 파일명이었음
- 메소드 중복
- 시그니처(signature)
- 메소드를 구분하는 정보
- 메소드 이름
- 매개 변수의 개수
- 매개 변수의 자료형
- 메소드 반환형 제외
- 메소드를 구분하는 정보
- 메소드 중복(method overloading)
- 메소드의 이름은 같은데 매개 변수의 개수와 형이 다른 경우
- 호출 시 컴파일러에 의해 메소드 구별
- 만약, 중복된 메소드 중에 매개 변수의 형이 double인 메소드만 존재하는데 float 형의 매개 변수로 호출을 할 경우 묵시적 형 변환이 발생해 double인 메소드가 실행됨
- 시그니처(signature)
- 생성자(constructor)
- 객체가 생성될 때 자동으로 호출되는 메소드
- 클래스 이름과 동일하며 반환형을 갖지 않음
- 주로 객체를 초기화하는 작업에 사용
- 생성자 중복(constructor overloading) 가능
- 정적 생성자(static constructor)
- 수정자가 static으로 선언된 생성자
- 매개 변수와 접근 수정자를 가질 수 없음
- 클래스의 정적 필드를 초기화할 때 사용
- 그 외 사용하지 않아 public을 붙이지 않음
- Main() 메소드보다 먼저 실행
- 정적 필드 초기화 방법
- 정적 필드 선언과 동시에 초기화
- 정적 생성자 이용
- 소멸자(destructor)
- 클래스의 객체가 소멸될 때 필요한 행위를 기술한 메소드
- 소멸자의 이름은 생성자와 동일하나 이름 앞에 ~(tilde)를 붙임
- Finialize() 메소드
- 컴파일 시 소멸자를 Finalize() 메소드로 변환해서 컴파일
- Finalize() 메소드는 재정의할 수 없음
- 객체가 더 이상 참조되지 않을 때 GC(Garbage Collection)에 의해 호출
- GC가 언제 일어날 지는 예측 불가능
- 소멸자 함수는 웬만하면 정의하지 않음
- GC에 부담이 됨
- Dispose() 메소드
- CLR에서 관리되지 않은 자원을 직접 해제할 때 사용
- 자원이 스코프를 벗어나면 즉시 시스템에 의해 호출
- using 문 사용