윈도우즈프로그래밍#6

LeeMir, 01 April 2021

클래스


클래스
  • 클래스(Class)
    • C# 프로그램의 기본 단위
      • 재사용성(reusability), 이식성(portability), 유연성(flexibility) 증가
    • 객체를 정의하는 템플릿
      • 객체의 구조와 행위를 정의하는 방법
    • 자료 추상화(Data Abstraction)의 방법
    • 일반적으로 선언할 때 이름을 대문자로 시작함(필수는 아님)
  • 객체(Object)
    • 클래스의 인스턴스로 변수와 같은 역할
    • 객체를 정의하기 위해서는 해당하는 클래스를 정의
  • 수정자(modifier)
    • 부가적인 속성을 명시하는 방법
  • 클래스 수정자(class modifier)
    • public
      • 다른 프로그램에서 사용 가능
    • internal
      • 같은 프로그램에서만 사용 가능
      • 수정자가 생략된 경우(default라는 의미)
      • 다른 네임스페이스더라도 같은 프로그램이면 사용 가능
    • static
      • 클래스의 모든 멤버가 정적 멤버
        • 클래스를 static으로 선언 안하고 멤버를 static으로 선언해 일부 멤버를 정적 멤버로 만드는 것도 가능
      • 객체 단위로 존재하는 것이 아니라 클래스 단위로 존재
    • abstrat, sealed - 추후(파생 클래스)에 설명
    • protected, private -
    • new
      • 중첩 클래스에서 사용되며 베이스 클래스의 멤버를 숨김
  • 객체 선언
    • 클래스형의 변수 선언
    • 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 - 매개 변수가 전달될 때 초기화하지 않아도 됨
    • 명명된 매개 변수

      • 메소드를 호출할 때 매개 변수 목록 중 어느 매개 변수에 데이터를 할당할 것인지를 지정하는 것은 “순서”
      • 명명된 매개 변수는 메소드를 호출할 때 매개 변수의 이름을 명시함으로써 순서에 관계없이 매개 변수에 할당할 데이터를 바인드하는 기능
    • 선택적 매개 변수

      • 메소드 선언시 매개 변수에 기본 값을 할당함으로써, 해당 매개 변수에 명시적으로 값을 할당할 지/ 않을 지를 선택하게 하는 기능

      • 뒷 부분을 생략 가능, 앞 부분은 생략 불가능

      • 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인 메소드가 실행됨
  • 생성자(constructor)
    • 객체가 생성될 때 자동으로 호출되는 메소드
    • 클래스 이름과 동일하며 반환형을 갖지 않음
    • 주로 객체를 초기화하는 작업에 사용
    • 생성자 중복(constructor overloading) 가능
    • 정적 생성자(static constructor)
      • 수정자가 static으로 선언된 생성자
      • 매개 변수와 접근 수정자를 가질 수 없음
      • 클래스의 정적 필드를 초기화할 때 사용
        • 그 외 사용하지 않아 public을 붙이지 않음
      • Main() 메소드보다 먼저 실행
      • 정적 필드 초기화 방법
        • 정적 필드 선언과 동시에 초기화
        • 정적 생성자 이용
  • 소멸자(destructor)
    • 클래스의 객체가 소멸될 때 필요한 행위를 기술한 메소드
    • 소멸자의 이름은 생성자와 동일하나 이름 앞에 ~(tilde)를 붙임
    • Finialize() 메소드
      • 컴파일 시 소멸자를 Finalize() 메소드로 변환해서 컴파일
      • Finalize() 메소드는 재정의할 수 없음
      • 객체가 더 이상 참조되지 않을 때 GC(Garbage Collection)에 의해 호출
        • GC가 언제 일어날 지는 예측 불가능
        • 소멸자 함수는 웬만하면 정의하지 않음
          • GC에 부담이 됨
    • Dispose() 메소드
      • CLR에서 관리되지 않은 자원을 직접 해제할 때 사용
      • 자원이 스코프를 벗어나면 즉시 시스템에 의해 호출
      • using 문 사용