C# 클래스 6
본문 바로가기
  • 게임 개발자가 되고싶은 구구
게임 개발 공부/C#

C# 클래스 6

by gugu99 2021. 12. 13.
반응형

안녕하세요!

오늘도 게임개발자가 되기위해 공부하고 있는 구구입니다.

오늘도 C#의 클래스에 대해 알아보도록 하겠습니다.

 


  • 확장 메소드

- this 키워드

 

C#-this-확장메소드-static

this 키워드를 사용한 장점은 메인함수에서 나옵니다.

Print함수는 매개변수가 this AA aa와 string str 2개가 있습니다.

이때 this가 AA aa 앞에 있는데 이렇게 파라미터에 this가 붙으면 호출할때 this가 붙은 부분을 객체처럼 생각해서 바로 호출이 가능하다는게 this의 특징입니다.

 

여기서도

aa.Print("Hello")처럼 원래는 Util이라는 class를 이용한 호출을 해야하지만 aa를 이용해서도 호출도 가능합니다.

Sum()함수도 위와 같은 이유로 int a(정수형 자료형)을 이용해서 호출이 가능하게됩니다.

(여기서 추가적으로 Util class가 static이기때문에 바로 호출 가능합니다.)

 


  • 클래스 VS 구조체
  class struct
특징 참조 타입(Reference) - 힙에 생성 값 타입(Value) - 스택에 생성
사용 new 연산자 new 연산자 없는 생성 가능
생성자 파라미터 없는 생성자 가능 반드시 파라미터가 있어야함
  • 구조체를 사용하는 경우

- 자료의 크기가 작을 때

- 구조가 단순할때

 

 

C#-클래스-구조체-value-callbyvalue-파라미터-new-struct

struct 의 특징을 여기서 확인가능합니다.

우선 struct는 생성자가 무조건 parameter를 가져야합니다.

그리고 호출시 new 연산자를 써도 되지만 안써도 상관 없습니다.

그리고 값형식이기때문에 aa라는 객체를 copyAA에 복사를 했을 경우

copyAA의 파라미터 값을 바꾸어도 aa의 값은 변화가 없습니다.(값형식이기 때문)

 

C#-클래스-구조체-value-callbyvalue-파라미터-new-struct


  • 인터페이스

Interface 인터페이스명

- 메소드, 이벤트, 인덱서, 프로퍼티, 필드불가(멤버변수 x)

- 구현부 없음(정의)

  • 구현부는 함수가 있을때 그 함수의 다음 빨간색 해당부분 -> public void Print() { 함수 코딩된 내용 }

- new 연산자를 이용한 인스턴스 생성 불가(참조 가능)

- 접근제한자 사용불가, 모든것이 public으로 자동으로 선언

- 인터페이스에 속한 모든 함수는 가상 메소드에 속함.(그렇다고 virtual을 쓸 수는 없음 -> 구지 쓸 필요가 없기때문)

 

 

  • 인터페이스를 자주 쓰는 상황
  1. 특정메소드나 변수를 강제로 똑같이 override를 해야될 때
  2. 기존에 상속받은 class가 있는데 새로운 기능을 추가해서 다중 상속을 해야할 때

 

C#-클래스-인터페이스-필드불가-구현부없음-참조-public-가상메소드-다중상속
C#-클래스-인터페이스-필드불가-구현부없음-참조-public-가상메소드-다중상속
C#-클래스-인터페이스-필드불가-구현부없음-참조-public-가상메소드-다중상속

IAA와 IBB는 인터페이스입니다. 따라서 AA와 BB는 인터페이스를 상속받았기 때문에 각각의 인터페이스 안에 있는

함수들을 재정의했습니다.(무조건 오버라이드 해야됨)

하지만 CC는 Super라는 클래스도 상속받았는데 IAA와 IBB상속받은 부분에 대해서는 함수들을 재정의 해줘야 하지만

Super 클래스 안의 함수인 Print()는 재정의를 해주지 않아도 괜찮습니다.

 

메인함수에서는 눈여겨 보실 점은

 

 IAA Iaa = new AA();

 

입니다. 즉, 참조는 가능하지만 객체생성은 불가능합니다.(인스턴스 생성 불가)

 -> IAA Iaa = new IAA(); (불가능함)

 

하지만 위의 경우를 가능하게만드는 법이 있는데 바로 강제형변환입니다.

82번, 93번, 96번째 줄이 그 예시입니다.

82번째 줄을 예를 들어서 확인해보면 BB bb = new BB();로 bb는 BB 클래스로 인스턴스를 생성했습니다.

하지만 as를 이용해서 bb를 IBB로 캐스트가 가능합니다.

 

C#-클래스-인터페이스-필드불가-구현부없음-참조-public-가상메소드-다중상속

  • 매개변수가 인터페이스 타입일 경우

- 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야된다는 뜻

 

  • 반환타입이 인터페이스 타입일 경우

- 메소드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환해야 된다는 뜻

C#-클래스-인터페이스-필드불가-구현부없음-참조-public-가상메소드-다중상속


  • 추상 클래스

abstract class 클래스명

- 미완성된 클래스, 미완성된 메소드

- new 연산자를 이용한 인스턴스 생성 불가(참조 가능)

- 자식클래스에서 상속을 통해서만 구현 가능

- 상속받은 클래스의 규격(클래스의 폼(틀)을 지정해주는 것)

- 자식클래스에서 공유할 수 있도록 추상클래스에서 공통적인 정의를 제공하는 것

- 선언되는 모든 멤버변수, 메소드, 프로퍼티, 이벤트들은 모두 접근 제한자를 안적으면 private

 

  • 추상 메소드
  1. 추상 메소드는 선언 시 static, virtual 키워드 사용 불가
  2. 실제 구현을 제공하지 않으므로 구현부 x

 

  • abstract를 사용하는 경우

- 상속을 구현하는데 특정메소드를 반드시 오버라이드하도록 강제성을 줄 때

 

 

C#-추상클래스-abstract-private-구현부-오버라이드-override-강제성-virtual
C#-추상클래스-abstract-private-구현부-오버라이드-override-강제성-virtual

몇가지 중요한 부분을 확인해보겠습니다.

우선 abstract를 이용해서 class abstractAA(추상클래스)를 만들었습니다.

또한 public abstract void abstractPrint(); 로 추상메소드를 정의했습니다.

이를 통해 강제적으로 상속받은 클래스에서 구현부를 정의해야합니다.

이는 abstractAA를 상속받은 AA클래스에서 확인할 수 있습니다.

 

우선 AA의 생성자를 보겠습니다.

 

자식클래스의 생성자를 콜하는 순서는 부모클래스 생성자 콜하고 자식클래스 생성자 콜합니다.

그런데 부모클래스 호출시 파라미터 num이 사용됬기 때문에 생성자함수에서 사용한 파라미터를 넘겨준다는 표시를

자식클래스에 해줘야합니다. 따라서 base를 이용해서 넘기는 파라미터가 있다면 표시를 해줘야합니다.

해당 클래스에서는 abstractAA가 생성자 생성 당시 int num을 파라미터로 받았기 때문에 :base(num)으로 표시했습니다.

 

그 다음은 추상클래스에서 만들었던 추상 메소드를 보겠습니다.

 

public override void abstractPrint()는 꼭 override 해야합니다.(추상클래스에서 추상메소드로 설정됨)

public override void virtualPrint()는 꼭 override 안해도 됩니다.(추상클래스에서 virtual로 설정)

 

C#-추상클래스-abstract-private-구현부-오버라이드-override-강제성-virtual


아까 위에서 프로퍼티, 이벤트같은 부분은 배우지 않았던 내용이라서 프로퍼티에 대해서 설명드리고 이벤트는 나중에 한번 다루도록 하겠습니다.

 

  • 프로퍼티

.프로퍼티

- private 속성으로 변수선언됬을때 그 변수의 값을 가져오거나 값을 저장할 때 사용

- set, get 키워드

- 정보은닉에 사용

- 파라미터가 없음.

ex) Count, Keys, StackTrace

 

C#- 프로퍼티-private-set-get-정보은닉

num값은 private 속성이므로 메인함수에서 num에 직접 값을 대입하거나 읽을 수 없습니다.

하지만 프로퍼티를 이용해서 num의 값을 대입하거나 읽을 수 있게됩니다.

 

public int NUM // 프로퍼티
        {
            get { return num; }
            set { num = value; } //set부분을 구현하지 않으면 readonly와 같은 읽기 전용
        }

 

C#- 프로퍼티-private-set-get-정보은닉


추가 예시

C#- 프로퍼티-private-set-get-정보은닉

프로퍼티를 간결하게 쓰는 방식도 있습니다.

 

public int NUM { get; set; } // get과 set을 한줄로 요약해버림
public string NAME { get; set; } = "NoName"; //get, set, 초기화를 한번에 해버림

 

 

C#- 프로퍼티-private-set-get-정보은닉


 

 

 

 

 

 

오늘은 여기까지 하도록 하겠습니다.

반응형

'게임 개발 공부 > C#' 카테고리의 다른 글

C# 컬렉션 2  (0) 2021.12.15
C# 컬렉션 1  (0) 2021.12.14
C# 클래스 5  (0) 2021.12.12
C# 클래스 4  (0) 2021.12.11
C# 클래스 3  (0) 2021.12.10

댓글