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

C# 클래스 5

by gugu99 2021. 12. 12.
반응형

안녕하세요!

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

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


  • 다형성(virtual, override)

- 객체 지향의 핵심

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

- 반복문으로 객체 관리

- 상속에서만 사용

 

  • 오버라이딩

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

- private 함수는 재정의 불가

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

 

 

C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리
C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리

AA와 BB는 Super의 자식클래스입니다.

Super의 멤버함수 중에서

 

public virtual void Print()

 

에서 virtual 키워드가 있고 자식클래스에서 AA를 예를 들면

 

public override void Print()

 

에서 overrride 키워드가 있습니다. 이는 virtual이라 적혀있는 부모클래스의 함수를 override한다는 뜻입니다.

base.Print()의 경우 super클래스의 Print()함수를 부른 것입니다.

 

메인함수를 보면 super클래스와 자식 클래스의 객체를 만드는 모습을 볼 수 있습니다.

어제 언급한 Super class로 선언했지만 AA와 같은 자식클래스로 만들수 있다는 점을 이용해서 코딩한 것입니다.

그렇게되면 Print()는 오버라이드 되었기 때문에 예를 들어

aa.Print()를 호출하면 우선 super class의 Print 함수를 확인하는데 virtual 이기 때문에 AA 클래스의 오버라이드 된 Print함수를 찾게되서 호출됩니다.

 

C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리


여기서 어제의 함수와 오늘의 함수의 차이에 대해 궁금하신 분들이 있을까봐 오버라이딩을 했을 경우와 안했을 경우의 차이에 대해, 그리고 선언은 부모클래스로 했지만 객체생성은 자식클래스로 했을 경우의 차이점에 대해 알아보겠습니다.

 

 

C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리-인스턴스-참조변수
C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리-인스턴스-참조변수

첫번째 예시는 override가 되지 않은 경우입니다.

여기서 메인함수에서 3가지 방법으로 객체생성을 했습니다.

 

s(참조변수)의 경우 super로 선언, super로 객체생성

bb(참조변수)의 경우 super로 선언, BB로 객체생성

b(참조변수)의 경우 BB로 선언, BB로 객체생성

입니다.

 

s는 super class 이기 때문에 당연히 super class에 있는 함수만 사용가능합니다.

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

하지만 b는 BB 클래스로 선언되고 인스턴스도 BB입니다. 또한 BB는 자식클래스이기때문에 b는 super 클래스부터 자식클래스까지의 모든 함수를 사용가능합니다.

 

b와 bb는 같은 타입의 인스턴스를 가지고 있습니다. 하지만 참조변수의 타입이 달라서 사용할 수 있는 함수의 차이가 발생했습니다.

 

표로 정리하면 다음과 같습니다.

[] = 함수의 호출이 된 클래스

  s bb b
참조변수 Super class Super class BB class
인스턴스 Super class BB class BB class
사용 가능한 함수 Print() [부모]
Sum() [부모]
Print() [부모]
Sum() [부모]
Print() [부모]
Sum() [부모]
Product() [자식]
Devision() [자식]

 


C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리-인스턴스-참조변수
C#-다형성-virtual-override-객체지향-상속-클래스-객체-객체관리-인스턴스-참조변수

이번에는 Super class 와 BB class는 똑같이 있는데 함수는 Print와 Sum만 이용할 것이고 Sum 함수는 오버라이딩을 했을때의 차이점을 보겠습니다.

 

  s bb b
참조변수 Super class Super class BB class
인스턴스 Super class BB class BB class
Print 함수 호출 부모 부모 부모
Sum 함수 호출 부모 자식 자식

즉 자식클래스의 인스턴스에서 Sum 함수를 호출하려고 보니 Sum 함수는 오버라이딩이 되어있어서 자식 클래스의 Sum 함수를 자동으로 부르게 됩니다.

 


  • sealed 키워드

- 상속, 재정의 불가

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

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

 

 


지금까지 공부한 내용은 클래스의 IS-A관계입니다.


  • 클래스(HAS - A관계)

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

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

 

C#-클래스-class-HAS-A-HASA-연관성
C#-클래스-class-HAS-A-HASA-연관성

class AA가 생성되있고 class BB는 AA클래스를 배열로 받았습니다.

보통 우리가 아는 class를 이용한 객체 선언은 new를 사용해야하는데 class BB 같은 경우는

 

AA[] aa; 로 먼저 참조변수를 선언하고 생성자 함수에서 aa = new AA[5]; 라는 부분을 통해서

BB class가 객체를 생성할때 자동으로 AA[] aa = new AA[5]; 와 같은 방식으로 호출되게 만들었습니다.

 

그 다음 BB 클래스안의 SetNum(int index, int num)과 Print()의 경우 배열 aa의 index 하나하나는 AA 클래스의 함수를 쓸 수 있기 때문에 AA 클래스의 함수들을 이용해서 값들을 넣거나 출력하는 방식으로 함수들을 구성했습니다.

 

메인함수에서는 BB클래스의 객체를 만들고 BB 클래스의 SetNum(int index, int num)을 이용해서 값을 집어넣고 값을

출력했습니다.

 

여기서 중요시 볼만한 점은 AA class는 BB class의 필드안에 들어왔기 때문에 BB클래스의 객체가 생성될때 같이 생성되고 소멸할때 같이 사라집니다.(한 클래스가 다른클래스를 가지는 형태)

 

 

C#-클래스-class-HAS-A-HASA-연관성


  • partial 키워드

partial class 클래스명

- 클래스를 나누어서 구현

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

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

 

C#-클래스-partial-나누기

기존에는 .cs 파일이 하나밖에 없었지만 .cs파일을 분리해서 특징별로 코드를 볼 수 있게 만들었습니다.

여기서 특징은 'AA.~~' 의 형태는 전부 하나의 클래스(현재 여기선 AA클래스)안에 다 있지만 분리해놨습니다.

 

C#-클래스-partial-나누기


 

 

 

 

 

 

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

반응형

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

C# 컬렉션 1  (0) 2021.12.14
C# 클래스 6  (0) 2021.12.13
C# 클래스 4  (0) 2021.12.11
C# 클래스 3  (0) 2021.12.10
C# 클래스 2  (0) 2021.12.09

댓글