피곤핑
코딩일탈
피곤핑
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin & Java
    • Spring
      • Spring Security
      • Spring
    • 네트워크
    • JavaScript & Node js
    • Docker
    • Python3
    • Unity
    • 딥러닝
    • 객체지향프로그래밍
    • Error 보고서
    • 나의 이야기 & 회고
    • HTML & CSS
    • Archive
    • 독서

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • nodejs
  • 항해99
  • JavaScript
  • 오블완
  • 티스토리챌린지
  • 개발자취업
  • 코딩테스트준비
  • TiL
  • 99클럽
  • Client

최근 댓글

hELLO · Designed By 정상우.
피곤핑

코딩일탈

0906 서버프로그래밍 기초3
Archive

0906 서버프로그래밍 기초3

2019. 9. 6. 14:37

bible (앞을 대문자로 쓰지않음 그러면 진짜 성경,,ㅎ)

GOF 디자인패턴 - 좋은책!

 

coder -> programmer -> developer -> architect


[템플릿 메서드 패턴]

- 가상함수 그 자체

 * params

가변인자 만들기 params!! 

 

 

 - Marine과 Firebat은 바로위에 virtual 함수로 실행이되고 zealot 같은경우에는 override 함수가 자동으로 실행됨.!

Unit.cs

 - program.cs -> 인자를 이런식으로 넣어주어야함

 static void TakeRandomDamage(Unit unit)
        {
            //unit.TakeDamage(_random.Next(1, 5));
            unit.TakeMultipleDamages(_random.Next(1, 5), _random.Next(1, 5), _random.Next(1, 5));

            Console.WriteLine(unit.ToText());
        }

 - c#을 바탕으로 파이썬을 짜본 코드의 모습

from abc import ABCMeta, abstractmethod
import random

class Unit(metaclass=ABCMeta) :
    HP = int()
        
    @abstractmethod
    def ToText(self) :
        pass
    def TakeDamage(self, damage) :
        while damage > 0:
            damage -= 1
            self.HP -= 1
            
    def TakeMultipleDamage(self, *damages) :
        for i in damages :
            self.TakeDamage(i)

class Firebat(Unit) :
    def __init__(self) :
        self.HP = 60
        
    def ToText(self) :
        print("I am a firebat and I have {0} HP(s)".format(self.HP))
        
class Marine(Unit) :
    def __init__(self) :
        self.HP = 50
        
    def ToText(self) :
        print("I am a Marine and I have {0} HP(s)".format(self.HP))


class Zealot(Unit) :
    def __init__(self) :
        self.HP = 100
        self.Shield = 50
        
    def ToText(self) :
        print("I am a Zealot and I have {0} HP(s) and I have {1} shield(s)".format(self.HP, self.Shield))
        
    def TakeDamage(self, damage) :
        while damage > 0:
            if self.Shield == 0:
                break
            damage -= 1
            self.Shield -= 1
        super().TakeDamage(damage)


class FakeCraft :
    def __init__(self):
        self._units = []

    def TakeRandomDamage(self) :
#         self.damage = random.randrange(1,6)
        for i in self._units:
            i.TakeMultipleDamage(random.randrange(1,6), random.randrange(1,6), random.randrange(1,6))
            i.ToText()

fakecraft = FakeCraft()
fakecraft._units.append(Marine())    
fakecraft._units.append(Firebat())  
fakecraft._units.append(Firebat())  
fakecraft._units.append(Zealot())
fakecraft.TakeRandomDamage()   

클래스 이름은 대부분 명사 혹은 명사구가 되어야함


- 제네릭


정렬하는 동작을 파라미터로 넣자

 * delegate (대리자)

 - 대리자의 내용은 함수의 시그니처를 말함.

.

이거는 함수가 아닌 타입임!

Type - 1. class / 2. struct / 3. delegate / 4. enum

 

* c# 1.0 같았으면 아래사진에 주석친것과 같이 선언해줬어야 하지만 2.0부터는 Ascending만 파라미터로 넣어줘도 가능

(2.0 + 익명함수 , 3.0 +  람다식(익명함수를 완전히 대체할 수 있음)

 

 

* 이 이후에 또 업데이트로 func deletate, action delegate 두가지를 쓸 수 있음 

action 은 반환값이 없음!  func는 반환값이 있음 (out은 무시해도 됨)

정리하자면 public delegate bool~~ 어쩌구 하는 delegate를 쓰지 않아도됨 즉, 

public static void Sort(int[] ar, Func<int, int, bool>)  (세번째 매개변수는 반환값을 써주어야함!)

 

또다른예)

Foo(PrintDouble) 은 함수자체를 넘기는거기때문에 ()를 쓸 필요가 없음!

지금은 업데이트 되었음 - 아래와 같이 사용가능! Action<int> f = PrintDouble;

자, 여기까지가 delegate의 기본이해 - 이걸 알아야 event를 할 수있음!

 

공식적으로 c#은 멀티 패러다임 언어라고 부르기도 함.

 

linq 

놀라운건 이 query가 데이터베이스안에 있다는 것,,,.,.,.,..,,.,..,,.,, - 울어야함

Q. 대리자가 꼭 필요한 상황은 어떤 상황인가요

비교하는 방법, 정렬 기준을 자기가 임의로 고정시켜놓는것은 너무 문제가 됨 정렬기준도 전달받고싶을때 (데이터 정렬동작) 즉, 함수를 전달받기 위해서는 우리는 대리자를 사용함 (delegate)

 


* 유닛이 죽었을때

 - 그러나 문제있는 코드

 

 - windform으로 만들어보자!

정석은 UI와 엔진을 분리하는것이 좋음!!!!!!!!!!!!!!!!!!!!!!!!!!

 - 그래야 WINFORM과 같은 다른 프로젝트에서도 로직이 재사용이 가능함


분기 / 07-대리자

이걸로 만들어 주세요

FakeCraftLogic 에들어가면 실행파일이 없음! 말그대로 그냥 로직만 모이는것임 유닛, 질럿 등의 클래스를 다 이동 시켜줌!!!

참조를 체크해주셈
애들이 들어와있음

* 여기서 우리는 왜 internal이 필요한지 알게됨!!!!!!!!!!!!!

 

 - 생략되어있으면 internal 임 고로 다 public으로 직접 고쳐주어야함!1

 

 - 퍼블릭으로 바꿔주는 모습

 

 - 이제 winform에서 해보기

 - 마린 객체를 추가하기위해서 참조에 Logic 프로젝트를 또 추가해줌

 

 - 윈폼만들기

 

 - 시작 프로젝트로 설정하기

 

  * 지금 winform 이야기를 왜하냐, 유닛이 죽었을때의 이벤트 처리를 하기위해~

자기가 hp가 0이 되었을 때 UI에 띄울 수는 없으나 함수를 대리자로 선정할 수 는 있음!

 

 

 - 반환값이 없기때문에 Action <int> 이런식으로 대리자를 정의함

 - 이쪽에 Console.WriteLine 을 쓰게되면 이제 콘솔에만 국한되어버리는 코드가됨 그러므로 cw의 대리자를 가져오는것

 - winform에서 고치기

  * 람다식이 어려우면 대리자 사용

 - 실행시켜본 결과


분기 / 08-이벤트

 - 이벤트는 등록하거나 해제를 한다고 말함

 - 문법적으로는 multicast event를 delegate라고 함

이거는 그냥 추천 형식

1.

2. 이벤트 핸들러 만들기

3. 

4. OnDead(Damage) 하나로 끗

5. 

 

 * ㅠㅠ 이벤트 생성 툴


 * 여러가지 이벤트 추가해보기

1.

2.

3. 위에서 true로 바꾸어 줬기 때문에 cancle하면 밑에를 실행하지 않고 넘어가도록

4. 결과

 

 * 두번씩 나오기 때문에 아래처럼 고쳐주어야함 - 왜,,,? 살펴보기


* 죽은 유닛 이벤트 출력하기

'Archive' 카테고리의 다른 글

0906 10-인터페이스  (0) 2019.09.06
0906 09-가상메서드-추상메서드  (0) 2019.09.06
0905 FackCraft  (0) 2019.09.05
0905 서버프로그래밍 기초 2  (1) 2019.09.05
0904 서버프로그래밍 기초지식  (0) 2019.09.04
    'Archive' 카테고리의 다른 글
    • 0906 10-인터페이스
    • 0906 09-가상메서드-추상메서드
    • 0905 FackCraft
    • 0905 서버프로그래밍 기초 2
    피곤핑
    피곤핑

    티스토리툴바