전체 글 (114)

02
25

 


#1 유니티 쓸 때 몰랐던거

 

명사 sprite = (그래픽) 반복 사용하는 무늬 등록 후, 무늬에 다른 그림을 겹쳐 합성하는 기능

 

명사 mesh = (그래픽) 그물망같은 일정간격 빈 공간 있는 입체 도형

 

명사 square bracket = (대)괄호 [ ]

명사 curly brackets = (중)괄호 { }

명사 parentheses / parenthesis = (소)괄호, 삽입구 ( )

 

동사 alternate = 대체하는(비슷한 이름일 때 대체제로 쓰는 느낌?)

 

어원 vert / vers / vort  (turn)돌다 / 돌리다

동사 invert = 거꾸로 하다

형용사 inverted = 반전된, 역의

명사 inverter = 변환장치

명사 inversion = 반전

 

명사 vertex = 꼭짓점

명사 vortex = 소용돌이

명사 vertical = 수직의, 수직선

더 자세한 vert 어원

 

형용사 valid = 유효한, 강건한

형용사 good = 유효한(포괄적인)

good vs valid 비교 설명

 

명사 ingredient = 재료, 성분

 

형용사 lit = 쩐다, 개쩐다, 조명의 영향을 받는

형용사 unlit = 조명이 없거나 꺼진 상태

 

동사 inherit = 상속 받다, 물려받다

명사 inheritance = 상속, 유전

 

동사 offset = 균형을 맞추다, 상쇄하다

명사 offset = 변위차, 상대주소, 상쇄하는 것

 

형용사 mandatory = 필수의, 강제의

 

형용사 verbose = 수다스런, 말이 많은

(디버깅할 때 세밀한 정보까지 알려주는 옵션)

 

동사 imply, implies = 의미한다, 암시한다

 

형용사 deprecated = 중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 

 

동사 execute = 실행하다

 

형용사 tricky = 어색한, 어려운

 

형용사 malicious = 악의 있는, 적의 있는

(ex: 악의 있는 클라이언트)

 

명사 entry = 항목

명사 schema = 계획, 도식

형용사 faint of heart = sensitive = 예민한

 

명사 Quanternion = 사원수

┌유니티 공식 Quanternion 문서

https://docs.unity3d.com/kr/2021.3/Manual/class-Quaternion.html

 

형용사 inverse = 정반대의

명사 inverse proportion = 반비례

명사 direct proportion = 정비례

 

명사 converse = 반대, 역

(약간 반대의 대상 그 자체를 지칭하는 말)

 

동사, 명사 reverse = 뒤집다, 반대

형용사 adverse = 불리한, 부정적인(반대 쪽인 것)

4개 정리

 

표현 lies at the core = 다른 신념이나 시스템의 중심이거나 기초가 되는 아이디어,

이는 개념 또는 신념을 가리키는 데 사용할 수 있습니다.

예를 들어, "청렴성의 중요성은 내 개인적인 가치의 핵심입니다."


#2 경영 수업 듣다 몰랐던거

 

명사 associates = 동료

동사 deliberate = 심사숙고하다, 신중한

동사 accomplish = 성취하다

구동사 brought = 뭉치다

 

명사 effectiveness = 능률 (핵심만)

명사 efficiency = 능률 (효율적으로)

 

명사 prosper = 번영

 

형용사 ethical = 윤리적인

 

명사 stakeholder = 이해관계자

명사 shareholder = 주주

 

전치사 Through = ~을 통해

 

동사 vanish = 사라지다, 자취를 감추다

형용사 vain = 헛된, 허영심 강한

 

전치사 versus = 대 / 줄여서 vs

 

전치사 for = 찬성

전치사 against = 반대의

 

부사 indeed = (긍정)확실히, 정말

 

명사 intelligence = 지능, 지성

명사 director = 관리자, 감독, 이사, 소장

 

접미사 -driven = 야기되는 것, 작동되는거, 기반

접미사란 낱말의 끝에 붙어서 의미를 첨가해 다른 낱말을 이루는 말

 

명사 objective = 목표, 목적

형용사 obejctive = 객관적인

형용사 subjective = 주관적인

 

형용사 introductory = 소개의, 입문자들을 위한

 

명사 concept = 개념, 관념, 컨셉

형용사 conceptual = 개념의, 개념 계획

 

타동사 embody = 구현하다, 구체화하다

 

명사 fundamental = 기본, 근본

 

동사 evaluate = 평가하다

 

형용사 sufficient = 충분한

형용사 insufficient = 불충분한

 

명사 advantages = 이점

명사 disadvantages = 단점

 

명사, 복수형 criteria = 기준

명사 criterion = 기준, 척도

 

명사 factor = 요인

명사 reshaping = 재편

형용사 nonmanagerial = 관리직이 아닌

명사 precision = 정확, 정밀

형용사 odd = 예상치 못한, 이상한

동사 designate = 지정하다, 가리키다

 

형용사 dedicated = 전용의, 특정한 목적을 위한

(중요한 단어, 유니티 강좌에서도 나옴)

 

형용사 broad = 넓은

동사 embraces = 수용하다, 포용하다

 

동사 strives = 노력하다

strive는 애쓰다는 느낌

 

형용사 attainable = 달성가능한, 이룰 수 있는

명사 bureaucracy = 관료주의

명사 recruitment = 채용, 신입 모집

명사 Performance planning = 성과 관리

명사 compensation = 보상

 

동사 assess = 평가하다(강세가 뒤에)

동사 access = 접근하다(강세가 앞에)

 

명사 supply = 공급

명사 demand = 수요

 

명사 maturity = 성숙기

명사 decline = 쇠퇴기

 

명사 transaction = 거래

동사 derive = 파생하다

명사 logistics = 물류 업체

 

형용사 anecdote = 일화(재밌는)적인, 개인적인 진술(명사)

관련 글

 

 


#3 코딩 수업 듣다 몰랐던 거

 

동사 implement = 구현하다 

동사 Emphasize = 강조하다

동사 terminated = 종료, 끝나다

동사 dispose = 처분하다, 메모리 처리?

동사 dump = 버리다,

컴터 용어에선 크랙 발생 시 메모리 표시 및 저장 프로세스

 

명사 complement = 보수 

명사 compliment = 칭찬 (두개 헷갈리지마셈)

 

명사 Memory allocation = 메모리 할당

명사 procedural = 절차적(프로그래밍)

 

명사 preprocessing directive = 선행지시 지시자, 전처리 지시자

컴파일러가 컴파일하기 좋도록 소스를 재구성해 주는 역할만을 합니다

 

명사 arithmetic = 산수

 

명사 assignment = 대입, 할당, 과제

 

명사 operator = 연산, 연산자

assignment operator = 변수에 값을 저장하는 연산자

 

prefix = 접두사

어떤 단어(어근)의 앞에 붙어 뜻을 첨가하여 하나의 다른 단어를 이루는 말

 

명사 unary = 단항 연산

형용사 ternary = 셋으로 이루어진(삼항 연산)

 

형용사 conditional = 조건부의

명사 condition = 상태, 조건

명사 conditional = 조건문

 

명사 operand = 피연산자 

부사 respectively = 각각

명사 increment = 증가

명사 decrement = 감소

명사 quotient = 몫

명사 remainder = 나머지

명사 alignment = 정렬

명사 address-of = 참조

명사 indirection = 우회, C언어에선 간접 지정(역참조)

포인터, 데이터가 저장된 주소를 가리킴 

 

동사 dereference = 역참조, C언어에선 * 키워드 

주소를 통해 값에 접근한다.

 

명사 suffix = 접미사

a + b에서 + 는 infix

++i = prefix

i++ = postfix

 

명사 binary = 이진법

명사 octal = 팔진법

명사 decimal = 십진법

명사 hexadecimal = 십육진법

 

명사 conversion specification = 변환 지시어

d : decimal

x : hexadecimal

o : octal

명사 byte = 메모리의 가장 작은 주소 지정 가능한 단위
하나의 주소에 할당된 메모리 용량이다. 일반적으로 바이트(byte)가 주소지정 단위이다.

1 byte = 8 bits

 

명사 Syntax = 통사론

(프로그래밍에서의 구문이다. 구문에는 단어, 구, 컨텍스트가 있다)

 

형용사 concatenate = 연쇄된, 이어진, 연결된

타동사 concatenate = 사슬같이 잇다, 연쇄시키다

 

동사 illustrate = 설명하다

 

명사 notation = 표기법

명사 denote = 나타내다

 

명사 row = 행

명사 column = 열

 

명사 construction = 구조

명사 primitive = 원시, 가장 작은 처리의 단위, 원자 요소?

형용사 native = 토종의, 태어난 곳의

연관) https://brunch.co.kr/@graypool/751

 

부사 conveniently = 편리하게, 알맞게

명사 Portion = 일부, 부분

명사 coefficient = 계수

명사 instructions = 명령, 훈련

명사 Preprocessor directives = 전처리기 지시문

명사 Trait = 특성

형용사 prone = 경향이 있는

 

형용사 comprehensive = 포괄적인

동사 comprehend = 이해하다

comprehensive VS comprehend

 

동사 uphold = 받치다

형용사 rigorous = 엄밀한

 

명사 Fahrenheit = 화씨

명사 Celsious = 섭씨

 

명사 bionomial = 이항식

명사 coefficient = 계수

명사 bionomial coefficient  = 이항계수

 

명사 procedure = 절차

동사 precede = 앞서다

 

명사 ancestor = 조상

명사 descendant = 후손

 

부사 somehow = 어떻게든지

 

명사 subset = 부분집합

 

명사 bottleneck = 병목현상

 


#4 재무 수업 용어

 

Interest = 이자

 

compounding process = 복리계산과정 = 미래가치 구함   

PV = Present Value = 현재 가치

 

 

FV = Future Value = 미래 가치

r = rate = 이자율 = 할인율

FV = PV + PV x r = PV(1+r)

 

n년도 말의 미래가치 FVn

 

FVn = PV(1+r)ⁿ = PV x CVIF

복리이자요소 = CVIF = Compound Value Interest Factor)

= 미래가치이자요소 = FVIF = Future Value Interest Factor

 

PV = FVn(1+r) -ⁿ = FVn x PVIF

 

Perpetuity = 영구연금 = C/r

Consols = 영구채권

 

Annuity = 연금

PV(연금) = C * PVIFA(r,n)

FV(연금) = C * CVIFA(r,n)



CVIFA 공식

 

PVIFA 공식

 

 

 

PV가 있으면 FV 구함 -  일시불 내가 계수
FV가 있으면 PV 구함 - 일시불 현가 계수

A 연금이 있으면 PV or FV 구함 - 연금의 현가 or 내가 계수

 

연금의 현가

PV(연금) = 각각 현금 흐름의 현재가치를 다 더한 현재가치

= C(cash flows per period) x 연금의 현가이자요소

= C x PVIFA (Present Value Interest Factor For An Annuitiy)

1.1 = (1 + 0.1) = (1 + r) 부분

100 = c 부분

 

연금의 미래가치

FV(연금) = 각각 현금 흐름의 미래가치를 다 더한 미래가치

= C(cash flows per period) x 연금의 복리가이자요소

= C x CVIFA (Compound Value Interest Factor For An Annuitiy)

 

 

 

선불 연금이면 현가든 복리든 마지막에 (1+r) 곱함

 

FV 있으면 A 연금 구함 - 감채기금계수

PV 있으면 A 연금 구함 - 저당상수

 

세후 증분현금흐름 (After-tax Incremental cash flow)

세금은 당연히 내고, 세금 낸 뒤 투자를 할 때와 안할 때 추가로 발생하는 현금흐름

 

OCF = Operating Cash Flow = 영업현금흐름  => (매출액-영업비용)(1-법인세율) + 법인세율 x 감가삼각비

FCF = Free Cash Flow = 잉여현금흐름 => OCF - 순운전자본 변동 - 자본적 지출

 

NPV = Net Present Value = 순현가 = PV(현금유입) - PV(현금유출)

IRR = Internal Rate Of Return = 내부수익률법 =  NPV (NPV  = 0을 만드는 할인율)

AAR = Average Accounting Return = 평균회계이익률법 = 세후 평균순이익 / 평균투자액

 

Payback Period = 회수 기간법

Discounted Payback Period Method = 할인회수기간법

 

PI = Profitablility Index = 수익성지수 = PV(현금유입) / PV(현금유출)

PI > 1 = 채택

 

이중 비현실적임 = IRR, PI

 

투자수익률 - 투자안 기말가치 - 기초 투자액 / 기초 투자액

Probability Distribution Table = 확률분포표 = 투자수익률 값 + 가능성 

 

Expected Return  = 기대수익률 = (수익률 x 확률)의 총합

Variance of Returns = 수익률의 분산 = (편차² x 확률)의 총합, 여기 편차 = 수익률 - 기대수익률

Standard Deviation = 표준편차 = 분산 제곱근 = 크다면 투자 위험

Portfolio = 포트폴리오 = 2개이상 자산 조합

 

Correlation Coefficient = 상관계수 = PAB

Covariance = Cov = 공분산
Oa = 자산A 표준편차

Ob = 자산B 표준편차 

 

Capital Asset Pricing Model = CAPM = 자본자산 가격결정 모델

 

Capital Market Line = CML = 자본시장선 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

COMMENT
 
02
23

 

 

썸네일

게임에서 체력바는 매번 구현할 때마다 템플릿이 필요하다고 생각했습니다.

물론 이 글의 체력바는 모두 UI로 구현하고 있고 Sprite로 구현 가능합니다.

참고로 이글에 있는 체력 UI는 WorldSpace 렌더 모드의 캔버스로 만들었습니다.

 

자세한 WorldSpace 렌더모드 설정은 아래 글에 ↓

유니티 Canvas의 World Space 렌더 모드로 UI 만들기

 

 


#1 기본 체력바_Slider

 

우선 가장 기본적인 체력바입니다.

유니티의 UI에 있는 기본적인 Slider를 사용한 방법입니다.

먼저 슬라이더 하나를 생성해줍니다 ↓

UI -> Slider

 

 

Slider를 생성하면 사진처럼 하이어라키와 Scene에 기본 슬라이더 템플렛 하나가 생성됩니다.

 

이걸 개조하면 우리가 아는 HP바가 되는데 다음과 같은 과정을 거치면 됩니다.

 

1. 하이어라키에 있는 Handle Slide Area 오브젝트를 삭제합니다.

2. 하이어라키에 있는 Fill 오브젝트를 눌러 색상을 빨강으로 바꿉니다.

 

그러면 사진처럼 HP바가 만들어졌을겁니다.

 

여기서 사진의 빨강색 게이지는 어떻게 변경될까요?

Slider -> Value

바로 슬라이더 컴포넌트에 있는 Value 값을 변경하면 됩니다.

 

이제 스크립트에서 저 Value 값을 바꿔 제대로 작동하는 HP바를 구현해봅시다.

 

using UnityEngine.UI;

네임스페이스 참조

protected float curHealth; //* 현재 체력
public float maxHealth; //* 최대 체력
public void SetHp(float amount) //*Hp설정
{
    maxHealth = amount;
    curHealth = maxHealth;
}

변수를 선언해준 뒤 SetHp로 초기 체력을 셋팅해줍니다.

public Slider HpBarSlider;

public void CheckHp() //*HP 갱신
{
    if (HpBarSlider != null)
        HpBarSlider.value = curHealth / maxHealth;
}

public void Damage(float damage) //* 데미지 받는 함수
{
    if (maxHealth == 0 || curHealth <= 0) //* 이미 체력 0이하면 패스
        return;
    curHealth -= damage;
    CheckHp(); //* 체력 갱신
    if (curHealth <= 0)
    {
		//* 체력이 0 이하라 죽음
    }
}

위와같이 체력을 갱신해줄 때  Slider의 value 값에 체력값을 표시해주면 됩니다.

 

그러면 데미지 받을 때마다 갱신되는 체력바이 완성됩니다.

 

 


#2 기본 체력바_Image

 

이번엔 UI의 기본적인 Image의 속성을 이용한 방법입니다.

테두리는 밑에서 설명할 것이고 우선 빨간색 게이지를 구현해봅시다.

 

단순한 1x1 픽셀의 화이트 이미지

위는 이번 체력바에 사용할 이미지의 셋팅입니다.

이제 Canvas 아래에 Image 오브젝트 하나를 생성해서 위의 이미지를 넣어줍시다.

그러면 처음에 Image 컴포넌트가 이렇게 되어있을겁니다.

 

1. Image Type의 설젇을 Simple -> Filled로 바꿔줍니다.

2. 밑에 Fill Method 옵션 생기면 Horizontal로 바꿔줍니다.

 

이렇게 하면 아래와 같은 모양이 나옵니다.

 

이제 색깔만 빨강색으로 바꾸면 게이지 완성입니다.

이제 테두리 바탕을 구현할껀데 여기서 Outline 컴포넌트를 사용합니다.

 

1. 우선 위의 게이지 이미지의 오브젝트를 복붙해서 BG라고 이름을 지정합니다.

2. 같은 크기인 상태에서 오브젝트에 Add Component를 눌러 Outline 컴포넌트를 붙여줍니다.

 

 

위와같이  Outline 컴포넌트를 붙여준 뒤 아래처럼 세팅하면됩니다.

 

그럼 이렇게 간단한 체력바 UI가 만들어집니다.

테두리 크기는 Effect Distance를 통해 조절하면됩니다.

 

이제 코드에서 HP바 이미지의 게이지를 조절해서 사용해봅시다.

using UnityEngine.UI;
[SerializeField] private Image barImage;

private void ChangeHealthBarAmount(float amount) //* HP 게이지 변경 
{
    barImage.fillAmount = amount;

    //* HP가 0이거나 꽉차면 HP바 숨기기
    if (barImage.fillAmount == 0f || barImage.fillAmount == 1f)
    {
        Hide();
    }
}

위와같이 체력을 갱신해줄 때  Image의 fillAmount값에 체력값을 할당해주면됩니다.

 

이렇게 Image와 간단한 Outline으로 갱신되는 체력바가 완성됩니다.

 

 


#3 번외) 카메라를 항상 바라보는 HP바로 만들어주기

 

잘못된 예

위 사진처럼 카메라를 바라보지 않는다면 HP를 확인하기 어렵습니다.

때문에 항상 카메라를 바라보도록 HP바에 코드를 추가하도록 합시다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LookAtCamera : MonoBehaviour
{
    private void LateUpdate() {
            case Mode.CameraForward:
                //* 카메라 방향으로 Z축 (앞뒤)을 바꿔주기
                transform.forward = Camera.main.transform.forward;
                break;
            default :
                break;
        }
    }
}

 

대상 UI가 항상 카메라를 바라보는거 외에 다양한 모드가 있습니다.

 

 

유니티 오브젝트를 항상 카메라 바라보게 만들기

 

유니티 오브젝트를 카메라 바라보게 만들기

게임에서 시선을 카메라 방향으로 따라간다거나 World Space 모드의 Canvas에 있는 UI를 항상 카메라를 바라보게 해야할 때가 있다. 아래의 코드를 대상 오브젝트에 부착시킨 뒤 모드를 선택하면 적

kimyir.tistory.com

 

 

+) UI가 아닌 Sprite Renderer으로 체력바 구현

https://chopchops.tistory.com/8

 

[Unity] Unity2D Sprite Renderer를 이용한 캐릭터 체력바 구현

스프라이트 위에 적의 체력을 표시하는 체력바를 구현하려했는데 Slider는 ui에서만 가능해서 어려움을 겪고있었다. 그러던 중 sprite를 이용하여 마치 체력바처럼 구현하는 방법을 발견했다. 참고

chopchops.tistory.com

 

COMMENT
 
02
18

상속구현

 

상속이랑 인터페이스를 다루다 보니 is-acan-do 관계를 알게되었습니다.

 

이런거 왜 구분시키나 했는데 내가 개발할 대상이 is-a 상황인지 can-do 상황인지 따지면 상속 쓸지 인터페이스 쓸지 쉽게 결정이 가능합니다.

 

한번 가볍게 알아봅시다.


#1 is-a 관계 (Is-A Relationship)

is-a 관계

 

is-a가 되면 상속을 할 수 있습니다.

NPC도 사람이고 나도 사람이니 사람을 상속할 수 있습니다.

추상 클래스에서 쓰이고 당연하게도 상속관계를 나누면 위에 갈수록 일반적이고 큰 개념,

아래 갈수록 구체적이고 작은 개념이 됩니다.

 

C#의 클래스에서는 is-a 관계 : 한 클래스가 다른 클래스의 생(자식) 클래스라는 아주 긴밀한 관계

비유로는 is-a 관계는 부모의 유전을 그대로 받아 태어납니다.

단점도 있는데 긴밀하기에 부모 손상되면 자식 손상이 됩니다.


#2 has-a 관계 (Has-A RelationShip)

has a 관계

상속이라고 하긴 애매하고 다른 스크립트에 있는 클래스를 참조해서 가져오는 걸 has-a 관계라고 합니다.

유니티 쓰면서 코드에 자주 사용하는 Animator도 이런 느낌입니다.

 

public class Player : MonoBehaviour
{
    private Animator animator; //플레이어는 애니메이터를 가진다
}

보통은 이렇게 씁니다.

public class Player : MonoBehaviour
{
    public Gun gun; //플레이어는 총을 가진다
    private Animator anim; //플레이어는 애니메이터를 가진다
    
    private void Awake()
    {
    	gun = new Gun(); //객체 선언(총을 준다)
    }
}

 

아까 is-a 관계는 긴밀해서 손상 위험이 크다고 했는데

has-a 관계는 조금 더 느슨하기에 손상 위험이 상대적으로 더 적습니다.


#3 can-do 관계 (Can-Do RelationShip)

can do 관계

can-do 관계 : 대상 클래스가 할 수 있다는걸 명시하는 관계

비유로는 can-do 관계는 부모의 유전과 상관없이 후천적으로 무언가를 할줄 알게 되는겁니다.

그렇기에 인터페이스 같이 후천적으로 기능을 구현을 하는겁니다.

그리고 NPC같이 대화 가능한 애들은 Talk() 메서드(함수)를 구현하라고 강제할 수 있습니다.

대화뿐 아니라 걷고 뛰고 등등 여러개 상속이 필요하니 인터페이스가 필요한 겁니다.

COMMENT
 
02
18

썸네일

이전에 올린 글들에서 계속 상속이 나왔다.

 

그만큼 상속은 객체지향적인 C#에게 필수적이다.

 

오늘은 상속을 알아보도록 하자 늘 그렇듯 공식 메뉴얼은 훨씬 디테일하다.

 

마이크로소프트 C# 상속 메뉴얼

 

필자가 글 쓰는데도 2일걸렸기에 이해안되면 천천히 다시 읽어보길


#1 상속(inheritance)이란?

 

우리가 흔히 아는 그 상속 비슷한데 부모의 재산을 상속한다 할 때 그 상속이랑 비슷하게

 

C#에서는 자식이 부모의 기능을 물려받는거다.

 

객체지향에선 부모 클래스자식 클래스로 나뉘는데 아래와 같이 불린다.

 

부모 클래스 = 베이스 클래스 = 슈퍼 클래스

Parent Class = Base Class = Super Class

 

자식 클래스 = 파생 클래스 = 서브 클래스

Child Class = Derived Class = Sub class

 

어떤식으로 부르던간에 클래스의 상속관계를 따로따로 구분만 할 수 있으면된다.

 

부모 자식 클래스의 관계는 다음과 같다.

 

"~이다 관계" 영어로 Is-A Relationship

 

한 클래스가 다른 클래스의 파생(자식) 클래스라는 아주 긴밀한 관계라는 걸 뜻한다.

 

따라서 부모(베이스) 클래스손상이 일어나면 자식(파생) 클래스손상위험이 크다는 뜻이다.

 

반댓말인 has-a 관계나 비슷한 개념인 can do 관계도 있다.

 

궁금하면 아래 링크의 클을 보도록하자 ↓

유니티 C#에서 is-a관계? has-a 관계? 그리고 can-do관계?

 

자식이 부모의 기능을 물려받는댔는데

 

자식 클래스 객체 생성하면 사진처럼 부모 클래스까지 포함되어 생성되기에

 

부모 클래스의 모든 기능을 쓸 수 있게된다. 이러한 특징은 다형성이라고도 한다.


#2 C#의 상속 특징

 

그럼 C#에서 상속은 어떤 특징이 있을까?

 

부모 클래스의 멤버들중 아래처럼 자식 클래스상속안되는게 있다.

  • 정적 생성자 (static 키워드)
  • 인스턴스 생성자 (new로 객체 생성)(인스턴스 멤버 변수 생성 및 초기화)
  • 종료자 (~ 키워드)

이외엔 거의 모든 멤버가 상속된다.

 

객체를 생성하면 부모의 생성자가 자동으로 먼저 호출되고 소멸(종료)될 땐 자식에서 부모 순서대로 호출된다.

 

┌코드로 좀 더 보기 (모르는 키워드는 밑에 #3에서 설명)

class 부모
{
    protected 부모(int 부모매개변수) //* 부모 클래스의 생성자 호출
    {
    }
}
class 자식 : 부모
{
    //* 이러면 부모 생성자 먼저 호출
    public 자식(int 자식매개변수) : base(자식매개변수) 
    {
    }
}

그러니까 자식(int 자식매개변수) 생성자 실행하면 base 부모(int 부모매개변수) 생성자 먼저 호출이 된다.

 

그 다음 자식 생성자 순서다. base()부분 떼버려도 똑같은 결과가 나온다.

 

┌base 키워드는 무슨 역할?

더보기

 

사진만 보면 이해가 될 것이다.

 

base는 상속한 부모 클래스를 가리킨다.

 

부모 메서드랑 자식 메서드 이름 같아버리면

 

구분하고 싶으니까  base만 쓰면 구분이 된다.

 

base 키워드 또한 직접 에디터에서 마우스 갖다대면 자세히 알려준다.


#3 클래스 상속(inheritance)하는법

 

가장 기본적은 상속클래스 상속이다. 

 

클래스 상속은 클래스 이름 뒤에 콜론 ' : ' 써주고 그 뒤에 상속할 클래스 이름 쓰면된다.

class 자식클래스 : 부모클래스
{
     //* 이런느낌?
}

이렇게 쓰면 위에 소개한거처럼

 

자식클래스 부모클래스의 모든 멤버를 물려받아 다 접근가능하다.

(만약 부모클래스에서 private 쓰면 당연히 접근 안됨)

 

┌아래는 유니티로 상속 써본 예시 ↓

class 부모 : MonoBehaviour
{
    protected 부모() //* 부모 클래스의 생성자 호출
    {
    }
    protected int 부모의변수;
    protected void Start() {
        부모의변수 = 1;
    }
}
class 자식 : 부모
{
    public 자식(int 매개변수) //* 자식 클래스의 생성자 호출하면서 매개변수 변경
    {
        this.부모의변수 = 매개변수; //* 부모의 멤버를 쓸 수 있는 모습!
    }
    private new void Start() {
        base.Start();
    }
}

위에 코드에서 눈여겨봐야할껀

1. 자식부모 상속하니까 부모상속MonoBehaviour 기능 또한 상속

2. 부모클래스protected 키워드 붙인 멤버들은 상속한 자식들만 접근 가능하다.

3. 부모클래스 멤버는 접근제한자 따로 안쓰면 기본 private이기에 protectedpublic을 붙여주자

 

4. 부모의 Start()자식 Start()는 이름 같기에 base. 키워드로 부모의 Start()를 가리킬 수 있다.

5. new 지정자로 부모 클래스Start()함수를 숨길 수 있다.

6. 부모 Start()를 숨겼으니 자식은 자신만의 Start() 메서드를 쓰게 된다.

 

아래 사진은 위 코드의 Start() 실행 순서 디버깅함 ↓

 


#4 추상 클래스(Abstract Class) 키워드 "abstract"

 

상속하면 추상 클래스도 언급하는데 추상 클래스 또한 is-a 관계다.

 

표현하기 힘든 중요한 부분이나 특징추상적으로 딱 골라내서 그 부분을 공통적으로 묶는거다.

 

추상클래스인터페이스는 비슷하지만 사용 목적이 다르므로 구분해야한다.

 

┌추상 클래스 VS 인터페이스

더보기

추상 클래스는 상속을 받아 기능을 이용하거나 확장을 하기 위함이고

 

인터페이스는 구현의 강제에 목적을 두어 구현 객체의 같은 동작을 보장한다는 데에 있다.

뭣보다도 둘의 가장 큰 차이는

 

인터페이스의 장점인 다중 상속 유무다

 

유니티 인터페이스(Interface) 실전 사용해보기

 

조금 더 깊게 파고 들어가면

 

추상 클래스는 상속의 개념이라

 

사용의도가 is-a 관계에 있지만

 

인터페이스는 의도가 다르게

 

can-do 관계에 있다.

 

이에 대한 자세한 설명은 아래에 ↓

유니티 C#에서 is-a관계? has-a 관계? 그리고 can-do 관계

 

 

추상클래스는 객체 생성이 안된다는 특징이 있다. 즉, new 연산자로 클래스의 객체 생성이 안된다.

 

 

또한 추상 클래스안에는 추상 메서드(함수)추상 프로퍼티(get,set)만 올 수 있다.

 

인터페이스랑 비슷하게 자식클래스에서 상속해야만 구현가능하다.

 

 

C#에서는 아무 클래스 명 앞에 abstract 키워드를 붙이면 추상클래스가 된다.

 

추상클래스의 안에 멤버에도 abstract 붙일 수 있는데

 

이는 자식 클래스에서 구현해야한다는 뜻이다.

 

위의 조건들을 토대로 추상클래스 ↓

abstract class 추상클래스 {
    추상클래스() //* 생성자 메서드
    {
    }    
    public abstract void 추상메서드(); //* 자식에서 구현
    public abstract int 추상프로퍼티{get;set;} //* 자식에서 구현 
}

 

코드를 보면 모두 public 붙여주었다.

 

그 이유는 추상 클래스 안의 멤버들은 접근제한자 안붙이면 기본적으로 private이기에 에러 뜬다. 

 

자식클래스에서 상속된 abstract 메서드(함수)들을 구현할려면 새로 재정의를 해서 override 키워드를 쓴다. 

 

override에 대해서는 밑에 #6에 계속 설명

 


#5 가상 함수(Virtual Function) 키워드 "virtual" 

 

진짜 디테일한 마소 메뉴얼의 Virtual

 

추상 클래스 다음은 가상 함수차례인데, 왜 가상 클래스가 아니라 가상 함수일까?

 

찾아보니 추상화추상화답게 모호해서나중에 구현해야하는데

 

가상 함수는 기능이 이미 완성되있는 함수상속하기 때문이기도하고 다중 상속 안되서 필요없단 말도 있다.  

 

가상 함수 또한 추상클래스 비슷하게 가상 메서드(함수) 가상 프로퍼티(get,set)만 올 수 있다.

 

사용법은 아주 간단하다

protected virtual void 부모메서드()
{
    //* 부모의 메서드(함수)
}

부모 클래스 안에 있는 메서드(함수)를 골라서 접근제한자 뒤에 "virtual" 써주면 된다.

 

 

이러면 자식 클래스에서는 재정의가 가능해진다.

protected override void 부모메서드()
{
    //* 자식클래스 안에서 부모메서드 재정의하기
}

재정의할 땐 접근제한자 뒤에 "override" 써주면 된다.

 

주의! 부모랑 똑같은 접근제한자(protected) 써야 에러 안뜸

 

┌자식 클래스에서 public 써서 에러뜸 ↓

 

추상 클래스는 공통적으로 묶고 디테일한건 무조건 재정의해서 확장할려는게 목적이고

 

가상 함수는 처음부터 기능을 하는 완전한 함수다.

 

주로 자식 클래스에서 상속을 하면 기능을 추가하거나 필요할 때 override 키워드로 재정의해서 사용을 한다.

 

override에 대해서는 밑에 #6 계속 설명


#6 오버라이딩(Overriding) 키워드 "override"

 

오버라이딩 뜻은 말그대로 덮어쓴다는 말이다.

 

우리가 배우고 있는 상속에선 부모 클래스변수메서드(함수)를 자식 클래스에서 재정의해서 덮어쓰는 것이다.

 

때문에 동일한 메서드(함수) 호출에도 각 객체마다 다른 행동이 가능하게 된다.

 

override 키워드는 위에서 배운 virtual이나 abstract과 함께 쓴다.

 

┌추상 클래스 abstract + 재정의 override

abstract class 부모 
{
    protected abstract void 부모메서드();//* 부모의 메서드
}
class 자식 : 부모
{
    protected override void 부모메서드()
    {
        //* override로 상속한 메서드 구현 가능
    }
}

 

┌가상 함수 virtual + 재정의 override

abstract class 부모
{
    protected virtual void 부모메서드()
    {
        //* 부모의 메서드(함수)
    }
}
class 자식 : 부모
{
    protected override void 부모메서드()
    {
        //* 자식클래스 안에서 부모메서드 재정의하기
    }
}

 

┌위에 #3에서 new 쓰던데 그건 뭐지?

더보기

부모 클래스의 단순한 일반 함수

 

재정의할 때는 new지정자를 써서 숨기면되고

 

override부모 클래스에서 재정의를 허락한 경우

(abstract & virtual)에 사용하는 것이다.

 

override 기능은 위에 처럼만 쓰면되고 더 많은 override 활용법도 있지만 어렵다.


#7 봉인 씰 키워드 "sealed" 한정자 

 

이것도 상속에서 쓰는 건데 이름 그대로 클래스를 봉인하는거다.

 

클래스 명 앞에 sealed 적어 주면 다른 클래스가 상속하지 못하게 막는다.

 

┌예시 ↓

sealed class 부모
{
    void 부모메서드()
    {
        //* 부모의 메서드(함수)
    }
}

 

실제로 저렇게 했는데 상속할려고 하면 에디터에서 해결책으로 요렇게 표시한다.

번역이 이상하지만 봉인은 언제든지 해제 가능하다.

 


 

지금까지 소개한거 외에 as 연산자 is 연산자도 있다. 이 부분은 따로 분리해야겠다.

 

상속은 분명  강력한 기능이지만 초보자가 홀려서 상속을 막 쓰면 나중에 후회한다.

 

유명한 밈이있는데

 

바나나 클래스가 필요할 뿐인데 상속관계를 넓히다 보면 복잡해져서

 

바나나가 상속하는 원숭이가 상속하는 나무가 상속하는 정글로 이어지게 된다.

 

상속은 함부로 쓰면 위험하니까 내가 지금 해결하는 문제에 꼭 필요하다면 쓰도록하자!

COMMENT