C# 정리 노트 3(클래스)
본문 바로가기
  • 게임 개발자가 되고싶은 구구
게임 개발 공부/개념 총 정리

C# 정리 노트 3(클래스)

by gugu99 2021. 12. 17.
반응형

안녕하세요

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

 

오늘은 지금까지 배웠던 C#의 클래스의 내용을 정리하고 가고자 이렇게 정리노트를 쓰게되었습니다.

이전 정리노트에 있던 단축키는 그대로 가져온 뒤 추가할 예정입니다.

 

(Ctrl + F 로 찾아서 쓰시면 편해요)


  • 클래스
  • 클래스 개념

- 사용자가 직접 만든 틀

- 변수(필드)와 함수(메소드)를 하나의 단위로 결합

- 상속, 다형성, 파생 클래스의 특수화 메커니즘

- 필드와 메소드, 생성자를 전부 합쳐서 멤버(Member)라 부름

- 변수 선언시 아무 언급없으면 private

 

  • 자주 쓰는 접근 한정자

- 클래스의 멤버에 액세스(접근)할 수 있는 수준

 

1. public

- 엑세스가 제한되지 않음

 

2. protected

- 해당 클래스 혹은 이 클래스에 파생된 클래스로만 엑세스가 제한됨

 

3. private

- 이 클래스로만 액세스가 제한됨

 

 

  • new 키워드

클래스명 객체명 = new 생성자

ex) AA aa new AA();

 

- 클래스의 객체 생성

 

 

  • 생성자

- 객체 생성할 때 호출(new)

- 클래스 명 동일

- 리턴형 x

- 접근 한정자 public

- 멤버변수 초기화

- 객체 생성시 자동으로 처리하는 것들

 

 

 

  • 소멸자

- 객체가 소멸될 때 호출(Garbage collector)

- 클래스명 동일

- 리턴형 x

- 접근 한정자 x

- '~'키워드로 구성

 

 

  • this 키워드

- 객체 자신을 참조하는 키워드

- 함수의 파라미터 이름과 멤버변수 이름이 동일

- 클래스 내부에서 멤버변수를 접근

 

※this()의 사용

같은 클래스의 다른 생성자를 호출할때 사용

 

  • static 키워드

- 클래스의 필드와 메소드를 객체 생성없이 사용가능(new 없이 사용가능)

- 클래스 static 필드(변수)

- 클래스 static 메소드(함수)

- static 메소드 내부에 사용하는 변수는 반드시 static

 

 

  • 클래스의 메소드 활용

- 클래스가 메소드의 파라미터로 사용가능

- 클래스가 메소드의 리턴형

 

※ class를 파라미터로 쓰게 되면 call by reference


  • 상속과 다형성


  • 클래스 상속(IS-A 관계)

- 부모 클래스 : base, parent, 상위, super

- 자식 클래스 : derived, child, 파생, sub

- 클래스의 재사용

- Sub class의 생성자는 생성되기 전 부모클래스의 생성자가 먼저 생성되고 그 다음 Sub class가 생성됩니다.

C#-클래스-class-상속-base-parent-derived-child

  • base키워드

- 해당 class의 상위 class를 지칭하는 키워드

 

 

 

 

  • is 키워드

- 객체의 형식 검사

- bool 리턴(branch에서 사용가능)

 

 

 

 

  • as 키워드

- 형식 변환

- null 리턴(예외처리 가능)

 

※형변환

1. BB copyBB = bb as BB;

2. BB copyBB = (BB)bb;

 

1번. as를 사용해서 bb를 BB로 형변환 가능하면 형변환이 그냥 되고 만약 형변환이 안된다면 null 반환

2번 as를 사용해서 bb를 BB로 형변환 가능하면 형변환이 그냥 되고 만약 형변환이 안된다면 오류 발생

 

따라서 클래스에서 형변환을 할때 as를 이용(예외처리가 가능해 지기 때문)

 

 

 

 

 

  • sealed 키워드

- 상속, 재정의 불가

- 클래스의 상속이 안되도록 class 앞에 붙일 수 있음. ex) sealed class Super

- 오버라이딩한 메소드를 봉인하고 싶을때도 사용가능

 

 

 

 

 

  • 선언은 부모클래스인데 객체는 자식클래스인 경우

부모클래스를 선언했는데 객체를 만들 때는 자식클래스로 만들었다는 점입니다.

이렇게 되면 Base타입의 참조변수 aa는 Base에 있는 함수는 사용가능하지만 AA 클래스(자식 클래스)의 멤버에는 접근이 불가능합니다.(클래스는 Base 이므로 AA 클래스는 못씁니다)

 

 

 

 

 

  • 다형성(virtual, override)

- 객체 지향의 핵심

- 함수의 오버라이딩(재정의)

- 반복문으로 객체 관리

- 상속에서만 사용

 

 

 

 

 

  • 오버라이딩

- 부모클래스로부터 상속받은 함수의 내용을 자식클래스에서 재정의하는 것.

- private 함수는 재정의 불가

- Super 클래스의 메소드는 가상 메소드

 

◎선언할때와 객체생성시 다른 클래스로 했을때의 차이 비교하기

Super : 부모 클래스

BB : 자식 클래스

 

Super s = new Super();

Super bb = new BB();

BB bb = new BB();

 

C#-선언-참조변수-인스턴스-함수-객체생성-객체-오버라이딩-다형성

※bb는 super class로 선언되었기 때문에 비록 객체는 BB지만 super class 의 함수만 사용가능합니다.


  • 클래스(HAS - A관계)

- 클래스가 다른 클래스를 가지는 구조

- 두 개의 클래스가 매우 강한 연관성을 가짐

- 포함된 클래스는 포함하는 클래스의 객체가 생성될때 같이 생성되고 소멸할때 같이 소멸함.

 

 

  • partial 키워드

partial class 클래스명

- 클래스를 나누어서 구현

- 컨텐츠별 구분해서 코딩 가능(특징들 별로 나눔)

- class 하나의 코딩 양이 너무 많을때 사용

 

 

  • 확장 메소드

- this 키워드

 

c#-this-parameter-매개변수-객체

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

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

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


  • 클래스 VS 구조체

 

C#-클래스-class-struct-구조체-callbyreference-callbyvalue-참조타입-값타입-파라미터

  • 구조체를 사용하는 경우

- 자료의 크기가 작을 때

- 구조가 단순할때

- struct는 생성자가 무조건 parameter를 가져야함.

- 호출시 new 연산자를 써도 되지만 안써도 상관 없음.

- 값형식

 


  • 인터페이스

Interface 인터페이스명

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

- 구현부 없음(정의)

  • 구현부는 함수가 있을때 그 함수의 코딩된 내용이 있는 부분

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

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

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

 

 

◎보충설명

IAA Iaa = new AA(); (가능함)

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

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

 

 

 

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

 

 

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

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

 

 

 

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

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

 


  • 추상 클래스

abstract class 클래스명

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

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

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

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

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

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

 

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

 

  • abstract를 사용하는 경우

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

 


  • 프로퍼티

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

 

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

- set, get 키워드

- 정보은닉에 사용

 

 

 

  • 자동구현 프로퍼티

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

 


  • 클래스의 정의와 활용 정리

클래스 = 객체를 정의해 놓은 것, 객체를 생성하기 위한 설계도

 

객체 = 클래스에 정의된 내용이 메모리에 생성된 것

 

인스턴스화(instantiate)​ = 클래스로부터 객체를 만드는 과정

 

인스턴스(instance) = 어떤 클래스로부터 만들어진 객체

 


즉 클래스로 객체를 만들게 되는 과정을 인스턴스화, 만들어진 객체가 인스턴스가 됩니다.

그리고 생성할 때 new 키워드를 이용해서 생성할 수 있습니다.

 

ex) AA(클래스명) aa(참조변수, 객체명) = new AA()(생성자);

(aa에 객체의 주소를 저장 -> class가 call by reference인 이유)

 

 

생성자 = 객체(인스턴스)가 생성될 때 호출되는 인스턴스 초기화 함수 

 

this = 객체가 자기 자신을 가리키고 싶을 때 사용

 

static = 멤버 변수or 함수가 인스턴스에 소속되는 것이 아닌 클래스 자체에 소속되도록 지정하는 한정자

  1. 정적 변수는 프로그램 전체에 걸쳐서 공유해야하는 변수가 있을시 사용.
  2. 정적 함수는 별도의 인스턴스 생성없이 호출할 수 있도록 사용.

 

상속 = 다른 클래스에 정의된 멤버들을 물려받을 수 있음.

 

자식 클래스 : 부모 클래스 = 상속

 

base.멤버 = 자식 클래스 안에서 부모 클래스의 멤버에 접근할 때 사용

 

base() = 자식클래스에 있는 생성자에서 부모클래스를 초기화 해야될 때 사용

 

 


  • C#을 쓰면서 쓰게될 여러가지 단축키, 코드의 의미

 

using System = System을 사용하겠다고 미리알림, 선언된 네임스페이스 내부 개체들에 접근

 

namespace = 그룹화,동일한 함수의 이름 사용가능

 

class = 필드(변수를 묶어놓는 곳), 메소드(함수)가 포함된 곳, 프로그램을 구성하는 기본

 

; = 코드 문장의 끝

 

{} = 코드 블록(블록단위로 코드를 구분)

 

// = 한줄주석

 

/* */ = 여러줄 주석

 

static(함수속성) void(리턴형) Main(함수이름)(string[] args(파라미터, 매개변수))

= 가장 중요한 메소드, 최초의 진입점, 모든 프로그램은 메인 메소드가 반드시 존재

 

Ctrl + F5 = 디버그 하지 않고 시작

 

= = 대입하다

 

== = 같다

 

GetType = 실제 자료형이 어떤 자료형이 되었는지를 확인하기 위해서 사용( 변수명.GetType() )

 

Console.ReadLine() = 입력 ( ex)string inputNum = Console.ReadLine(); )

 

Console.Clear(); = 도스창에서 화면 지우기

 

Random rnd = new Random();

int rndNum = rnd.Next(0, 4);

= rnd값이 랜덤으로 정해지고 이때 rnd값이 0부터 3까지의 범위를 가지고 이 값들 중 하나가 rndNum에 들어감

 

변수명.ToString; = stirng으로 변경

 

자료형.Parse(변수명); = 원하는 자료형으로 변경

 

Convert.To자료형(변수형) = 원하는 자료형으로 변경

 

(숫자자료형)변수명 = 캐스트 연산자

 

const 자료형 변수명; = 상수 선언

 

enum 식별자(이름) = 열거형 데이터 형태

 

F12, alt+F12 = 함수로 이동하거나 함수를 보여주는 단축키

 

static void PrintValue(int a, int b,int c = 100, int d = 0) = 디폴트 매개변수

 

int Total(params int[] values) = params 를 이용한 파라미터의 제한 없이 처리

 

배열.Length = 해당 배열의 크기(길이)

 

string.Empty = string에 아무값도 없이 비우겠다는 뜻

 

public static void Clear(Array array, int index, int length); = 시작인덱스부터 length만큼 지워라

 

배열.Clear(Array array, int index, int length); = Array Clear 사용법

 

배열.GetLength(원하는 행) = 배열의 크기를 return

 

(캐스트)배열.Clone(); = 배열 복사, call by value, 기존의 형은 object형이라서 캐스트를 통한 형변환 필요

 

readonly = 읽기전용이라는 뜻

 

class Sub:Super = sub라는 클래스는 Super라는 클래스의 자식클래스라는 뜻

 

base.항목 = 부모 클래스의 public, protected 로 지정된 항목들을 호출

 

 

 

반응형

'게임 개발 공부 > 개념 총 정리' 카테고리의 다른 글

C# 정리노트 4(컬렉션)  (0) 2021.12.18
C# 정리 노트 2(함수, 배열)  (0) 2021.12.05
C# 정리 노트 1  (0) 2021.11.30

댓글