Abstraction(추상화 개념)
앞에서 추상화(Abstraction)라는 개념은 객체지향언어(OOP)의 출발점이자 기본 원칙이라고 했다.
피카소 같은 추상 화가의 추상화를 보면 다음과 같은 느낌을 가진다.
- 자신의 생각 또는 상상을 그림으로 표현했다.
- 자세하게 묘사하는 것이 아니라 기본 형태만 보여 준다.
코딩에서 사용하는 추상화(abstraction)도 미술의 추상화(abstract art)와 비슷한 형태를 가진다.
예를 들면 객체를 만드는 추상적인 과정이나 사용자에게 기본적인 내용만 보여주고 숨겨야 할 데이터는 나타내지 않는 것들이 그렇다.
아마 객체 지향 언어의 근간이 되는 개념에 abstraction(추상화)라는 이름을 붙인 것도 '추상'이라는 단어가 가지는 의미와 유사해서 붙였을 것이다.
class(클래스)라는 설계도를 만들고 그 설계도를 이용하여 객체를 만드는 것도 추상화라는 개념에서 출발했고,
클래스의 캡슐화 등에도 추상화를 적용하여 데이터 보호라는 목적을 달성했다.
추상화 개념의 완성은 '추상 클래스(Abstract class)'와 '인터페이스(Interface)'라고 할 수 있다.
추상 클래스(Abstract class)
추상클래스는 인스턴스(객체)를 만들 수 없는 특별한 클래스이다.
추상클래스의 목적은 추상메서드를 만들고 이것을 상속을 통해서 파생클래스에서 구현하도록 하는 것이다.
비주얼 스튜디오 코드로 직접 예제를 만들어 보면서 알아본다.
비주얼 스튜디오 코드를 실행한 후 Open Folder(폴더 열기)로 앞에서 만들었던 example파일을 모아놓은 unity example폴더를 연다.
explorer창에서 마우스 오른쪽 클릭 후 New File(새파일)을 선택한다.
파일명을 클래스명과 같이 AbstractExample.cs 로 바꾼다.
위와 같이 AbstractExample 클래스를 만든다고 가정한다.
Pet(애완동물) 클래스가 있고
Dog클래스와 Cat클래스는 Pet클래스를 상속받는다.
즉, Pet클래스는 부모(베이스)클래스, Dog, Cat클래스는 자식(파생)클래스가 된다.
이제 Pet클래스에 위와 같이 애완동물의 공통 행위들을 메서드로 정의한다.
*eat : 먹다
*sleep : 자다
*make a sound : 소리내다
각 메서드의 구현(실행) 부분에는 해당 문자를 출력하는 코드를 작성한다고 해보자.
그런데 MakeSound( )메서드는 곤란해진다.
애완동물 마다 소리가 다른데...
이런 경우에 해당 메서드를 추상메서드(abstract method)로 만들어서 구현(실행)부분을 해당 애완동물에서 작성하도록 하면 된다.
29번줄
추상메서드로 만드는 방법은 abstract 키워드를 접근제한자(public)와 반환타입(void) 사이에 적고 끝에 세미콜론( ; )을 붙여서 구현(실행)부분이 있는 것 처럼 표시한다.
명심할 점은 어떤 클래스에 추상메서드를 만들면 해당 클래스는 반드시 추상클래스(abstract class)가 되어야 한다.
17번줄
추상클래스를 만드는 방법은 class 앞에 abstract 키워드를 붙인다.
현재 추상클래스 Pet은 처음에는 구체적인 클래스(Concrete class) 였다가 추상메서드가 추가되어 추상적인 클래스(Abstract class)로 변신한 것이다.
또 명심할 점은 추상메서드가 만들어지면 추상클래스Pet을 상속받은 클래스에서 override를 사용해서 추상메서드를 다시 정의하고 그 구현(실행) 부분을 반드시 작성해야 한다.
상속받은 클래스에서는 추상메서드에서 불완전하게 만들어 놓은 실행부분을 명확하게 해야 할 의무가 있는 것이다.
Start메서드에서 puppy , kitty 라는 객체를 생성하고 그 객체를 통해서 메서드를 호출 해보자.
스크립트 파일을 저장한 후 유니티에서 불러와 실행하면 다음과 같은 결과를 볼 수 있다.
제일 위에서 언급했듯이 추상클래스는 인스턴스(객체)를 만들 수 없다.
즉, Pet myPet = new Pet( ); 으로 myPet이라는 객체를 만들 수 없다는 뜻이다.
왜 추상클래스는 객체를 만들 수 없도록 했을까?
다음 글에서는 추상클래스와 비슷한 구조를 가지고 있으며 클래스의 단점을 보완한 Interface(인터페이스)에 대해 알아본다.
끝.
Wraven...
'취미로 하는 게임코딩_gameCodingAsHobby > 유니티unity로 게임 만들기' 카테고리의 다른 글
유니티25_C#15_구조체(Struct) (0) | 2021.03.09 |
---|---|
유니티24_C#14_인터페이스(Interface) (0) | 2021.03.06 |
유니티22_게임 제작 과정 06_Prefab 프리팹 만들기 (0) | 2021.03.02 |
유니티21_게임 제작 과정 05_충돌 설정 (0) | 2021.02.26 |
유니티20_게임 제작 과정 04_적 만들기 (0) | 2021.02.22 |