반응형

공부 624

★★★ Part 1-7-5. 기타 문법 : Event(이벤트)

Event(이벤트) [delegate의 한계] delegate int OnClicked(); static void ButtonPressed(OnClicked clickedFunction) { clickedFunction(); } static void Main(string[] args) { OnClicked clicked = new OnClicked(Test); clicked += Test2; // chaining clicked(); ButtonPressed(clicked); clicked(); } 델리게이트 형식 OnClicked를 오직 ButtonPressed 함수 안에서만 실행시키기 위해 clickedFunction(); 만들었을 수도 있다. 그러나 상관 없는, 그리고 외부 메인 함수 안에서도 개나소..

Part 1-7-4. 기타 문법 : Delegate(대리자)

C#의 꽃! Delegate(대리자) [delegate를 사용하는 이유] static void ButtonPressed() // 버튼이 눌렸을 때 실행 { // 버틀이 눌렸을 때 실행할 여러가지 함수들 나열 및 실행 } 버튼이 눌리면 아바타에 옷을 입힌다 👉 무기를 들게 한다. 👉 랜덤 메세지를 출력한다. 이런 과정들이 순차적으로 실행되게 하고 싶다면 버튼 눌리는 함수 내부에 각각의 기능들을 함수로 직접 실행시키면 되겠다. 즉 ButtonPressed() 함수 내부에서 직접 여러 함수들에게 인수를 넘겨 호출하는 방식이다. 그러나 이런 구현 방식의 문제점은 ButtonPressed() 함수 내부에서 함수들을 실행시키면서 일일이 매개 변수에게 인수를 넘겨야 하기 때문에 개발자가 실수를 할 확률도 커지고, 예..

Part 1-7-3. 기타 문법 : Property(프로퍼티)

Property(프로퍼티) 외부에서 값을 바꾸면 그 값을 누가 언제 바꿨는지 알기가 쉽지 않다. 따라서 외부에서 수정 되지 않기를 원하는 멤버 변수는 protected, private 으로 접근을 제한하고 setter, getter 같은 접근 함수를 public으로 만들어서 이들에 대해 간접 접근한다. (이런 경우 디버깅시 호출 스택을 이용하여 어디서 누가 호출했는지 쉽게 알 수 있다.) 프로퍼티는 은닉성과 관련이 있으며 Getter, Setter 접근 함수와 같은 기능을 좀 더 편하게 사용하기 위한 기능이다. 그래서 사용법도 함수와 비슷하다! class Knight { protected int hp; // ✔ 프로퍼티! public int Hp { get { return hp; } set { hp = ..

Part 1-7-2. 기타 문법 : Interface(인터페이스) + 다중 상속

추상 클래스(abstract) using System; using System.Collections.Generic; namespace CSharp { abstract class Monster { public abstract void Shout(); } class Orc : Monster { public override void Shout() { Console.WriteLine("오크~~"); } } class Skeleton : Monster { public override void Shout() { Console.WriteLine("빠각~~"); } } class SkeletonOrc : Orc, Skeleton // ❌❌ 컴파일 에러 ! { } class Program { static void Mai..

Part 1-7-1. 기타 문법 : Generic(일반화) + object, 박싱/언박싱, where

Generic(일반화) 클래스 정의시 여러가지 자료형에 대해 일반화. class MyList { int [] arr = new int[10]; public int GetItem(int i) { return arr[i]; } } class MyfloatList { float [] arr = new float[10]; public float GetItem(int i) { return arr[i]; } } class MyMonsterList { Monster [] arr = new Monster[10]; public Monster GetItem(int i) { return arr[i]; } } 같은 내용의 클래스라도 여러가지 자료형의 경우로 나누어야 한다면 위와 같이 일일이 나열해야 한다. 일반화시킬 필요가 ..

Part 1-6-3. 자료구조 : Dictionary

Dictionary dic[Key] = Value 👉 Key를 통하여 접근하여 그에 대응하는 Value를 불러올 수 있다. using System.Collections.Generic;을 해주어야 사용이 가능하다. 딕셔너리 또한 클래스이기 때문에 new를 사용하여 생성해야 한다. 즉 Dictionary 타입의 객체를 생성하면 참조를 하게 된다는 의미가 된다. 해시 테이블을 사용하기 때문에 매우 빠르다. O(1) 공간을 미리 많이 차지하고 있기 때문에 공간 면에선 비효율적일 수 있다. 메모리를 내주고 성능을 취한다. class Monster { public Monster(int id) { this.id = id; } public int id; } class Program { static void Main(s..

Part 1-6-2. 자료구조 : List

List (동적 배열 = 가변적 크기의 배열) C#에서의 List는 동적 배열이며, 크기가 고정적이지 않으며 가변적이다. C++에서 vector 와 같은 존재이다. using System.Collections.Generic;을 해주어야 사용이 가능하다. 리스트 또한 클래스이기 때문에 new를 사용하여 생성해야 하며 List 타입의 객체를 생성하면 참조를 하게 된다는 의미가 된다. using System.Collections.Generic; List list = new List(); // 빈 상태 정적 배열과 마찬가지로 빈 상태일 때 없는 인덱스에 접근하면 런타임 에러 예외가 발생한다. 중간 삽입, 중간 삭제가 효율적이지 않다. 왜냐하면 뒤에 있는 원소들이 전부 다 한 칸씩 밀리거나 앞으로 땡겨야 하기 때..

Part 1-6-1. 자료구조 : 배열, 다차원 배열

배열 동일한 자료형을 가진 데이터들을 연속적인 메모리로 저장하여 인덱스로 접근할 수 있게 된다. 크기는 한번 선언하면 바꿀 수 없으며, 배열 크기를 벗어나는 인덱스로 배열에 접근하면 런타임 에러가 발생한다. int [] array = new int[5]; array[0] = 10; array[1] = 20; array[2] = 30; array[3] = 40; array[4] = 50; int [] array2 = new int[] { 10, 20, 30 }; int [] array3 = new int[5] { 10, 20, 30, 40, 50 }; new 키워드를 사용하여 동적으로 할당 받는 배열을 만들 수 있다. (동적으로 할당 받았다고해서 동적 배열인 것은 아님. 동적 배열은 크기가 가변적인 배열을..

Part 1-4-5. 객체지향 : new, 다형성 (virtual, override, sealed), 문자열

new class Player { public int hp; public int attack; public void Move() { Console.Write("Player Move"); } } class Knight : Player { public new void Move() { Console.Write("Kight Move"); } } Knight knight = new Knight(); knight.Move(); // 출력 // Kight Move 부모 클래스로부터 상속 받은 함수와 이름은 동일하지만 이와 상관없는 완전히 다른 새로운 함수로서 재정의하고 싶다면 new키워드를 사용하면 된다. 상속 받은 함수와 동일한 이름이긴 하지만 새로운 함수를 만드는 것을 의미한다. Player의 Move()와 Kn..

★ Part 1-4-4. 객체지향 : 클래스 형변환 (is, as)

클래스 형식 변환 [부모 자식간 형식 변환] Knight knight = new Knight(); knight 스택 메모리는 new Knight()로 생성한 힙 메모리 객체의 주소를 담는다. // 부모 👉 Plyaer // 자식 👉 Knight, Maze class Player { public int hp; public int attack; } class Knight : Player { public void Move() { Console.Write("Kight Move"); } public void Attack() { Console.Write("Kight Attack"); } } class Mage : Player { public void Move() { Console.Write("Maze Move");..

Part 1-4-3. 객체지향 : 상속성, 은닉성

상속성 [코드의 재사용성] 부모 클래스 👉 Player 직업에 상관없이 플레이어라면 모두 가지고 잇는 공통된 속성과 기능을 부모클래스로 묶는다. 자식 클래스 👉 Mage, Aracher, Knight 이 클래스들은 Player를 상속받으므로 플레이어라면 모두 갖고 있는 공통 멤버들을 다시 필드에 명시해줄 필요가 없다. 이런 부분들은 Player 상속으로 해결하고 법사, 궁수, 전사들만의!!! 고유의 속성과 기능을 추가해주면 되는 식이다. 자식 클래스에서 멤버 필드에 직접 명시해주지 않더라도 상속만 하면 자동으로 부모의 멤버들도 가질 수 있다. [부모 생성자가 먼저 호출 된다.] 당연히 생성자도 함수이므로 부모 생성자를 자식 클래스에서 상속을 받고, 언제나 부모 생성자를 먼저 호출한다. 개발자가 명시하지 ..

Part 1-4-2. 객체지향 : 생성자, static

생성자 객체를 new로 생성함과 동시에 멤버 값들을 원하는대로 초기화하고 싶을 때 생성자를 사용한다. 클래스 이름과 같아야 함 접근 지정자 ⭕, 리턴타입, 매개변수 ❌ public Knight() { hp = 100; attack = 10; } public Knight(int hp) : this() { this.hp = hp; } 생성자 이름 옆에 : this() 👉 ‘디폴트 생성자 호출해줘’ 라는 의미 따라서 this.hp = hp를 실행하기 전에 Knight()를 호출하여 hp = 100와 attack = 10 를 먼저 실행하게 된다. 따라서 자연스럽게 Knight(int hp) 생성자에서 hp 값만 설정헀어도 attack은 10 으로 설정이 미리 된다. static [static이 아닌 일반 멤버들..

Part 1-4-1. 객체지향 : 객체 지향, 복사와 참조, 스택과 힙

객체 지향 [절차 지향 👉 전부 함수로 코드를 짠다.] 유지 보수가 힘들다. 프로그램 규모가 커지면 복잡해진다. 함수 호출 순서에 종속적이기 때문에 유지 보수가 힘들다. 호출 순서 타고타고 올라가 보며 코드를 읽어보아야 해서 불편하다. 함수를 계속 새로 만들고 만들고 해야해서 복잡하다. 같은 Fight 이라도 플레이어 vs 플레이어, 보스 vs 플레이어 등등 많은 버전이 있어야 하므로 오버로딩을 많이 해야 해서 복잡해진다. [객체 지향 👉 모든 것을 객체 위주로 생각한다.] 속성(멤버 변수)와 기능(멤버 함수)로 나뉜다. ‘플레이어’의 이름, 공격력, HP, 직업 같은 속성들과 Fight 같은 기능을 추상화 하여 Player라는 이름의 클래스로 묶는다. 이 클래스(붕어빵틀, 설계도)를 가지고 세상에 존재..

Part 1-3-1. TextRPG : 디버깅 기초, 직업, 플레이어/몬스터 생성, 전투

디버깅 프로그램 실행 및 디버깅시 중단점이 찍힌 코드 ‘줄’에서 멈추게 해준다. 멈춘 줄로부터 코드 한줄 한줄씩 실행해보는게 가능하다. 개발 단계에선 괜찮지만 현재 서비스 되고 있는 프로그램에선 브레이크 포인트를 사용하는 디버깅은 할 수 없다. → 자동차 출시 및 출고 후에는 실시간으로 자동차 내부를 살펴볼 수 없는 것과 비슷. 개발 단계는 디버그 모드로 실행하고 중단점은 이때만 사용 가능하다. 프로그램을 출시할 때는 Release 모드로 빌드를 해서 실행하게 된다. 이미 출시한 프로그램은 중단점을 사용하여 한 줄 한 줄 실행하면서 실시간으로 살펴볼 수는 없다. 중단점을 한번 더 클릭하여 없앨 수도 있지만 중단점 해제를 직접 여기서 선택하면 중단점이 노란색으로 바뀐다. 중단점으로서 역할을 더 이상 하지 ..

★ Part 1-2-2. 코드의 흐름 제어 : 함수, ref, out

함수 함수는 다양한 언어에서 크게 함수, 메서드, 프로시저로 불린다. 하지만 게임 개발자는 주로 함수라고 부른다. 함수는 class 내부에 생성해야 하며, 함수의 형식은 다음과 같다. // 함수(=Method,메서드) 한정자 반환형식 이름(매개변수목록) static void HelloWorld() { Console.Write.Line("Hello World"); } static void Main(string[] args) { HelloWorld(); } static은 나중에 class를 설명할 떄 설명할 예정이며, 이름은 함수의 이름을 작성하는 것과 같다. 매개 변수로 넘겨줄 정보가 없으면 아무것도 작성하지 않고, 또 반환 형식으로 함수를 사용 한 이후에 아무런 값을 돌려주지 않는다면 void 키워드를 ..

[주간 인프런 #54] 요즘 주니어 개발자의 고민은 뭘까?

인프콘 2022에선 인프랩 개발자와 함께하는 데브챗 부스가 운영되었는데요. 한정된 시간과 공간 때문에 현장에서 못다 한 이야기가 많아 아쉬웠던 인프랩 개발자들이 다시 한번 모였어요! 인프메이션 #54에서는 데브챗에서 많이 나왔던 고민을 중심으로, 인프랩 개발자들의 의견을 들려드리려 합니다. 더 읽어보기 & 출처 : https://www.inflearn.com/pages/infmation-54-20221004?utm_source=mailchimp_email&utm_medium=cps&utm_campaign=inflearn_%ED%8A%B8%EB%9E%98%ED%94%BD_%ED%97%AC%EB%A1%9C%EC%9D%B8%ED%94%84%EB%9F%B0_infmation-54-20221004&utm_cont..

[주간 인프런 #41] 개발자의 공유 문화 이모저모 (2) 회고 문화

기록도 점검도 셀프! 개발자는 왜 회고를 할까요? #오픈소스 #기술블로그 #회고문화 바쁘게 일하고 공부하다 보면 시간이 훌쩍 지나있기 마련이죠. 그렇지만 모든 일을 다 기억할 수는 없는 법, 문득 ‘작년엔 뭘 했지?’ ‘이번 프로젝트에서 내가 어떤 일을 맡았더라?’ 고개를 갸웃하게 되는 순간들이 있죠. 더 나은 개발자로 성장하고 싶은 분들, 더 좋은 제품(Product)을 만들고 싶은 조직이라면 그동안 겪은 시행착오를 어떻게 기록할지 고민해봤을 텐데요. 이번 주 #41에서는 지난 호, 오픈소스 & 기술 블로그 편에 이어 개발 업계의 회고 문화에 대해 이야기합니다. 덧붙여 인프랩 개발 파트의 재미있는 신규 서비스 런칭 회고도 살짝 공개할게요. 더 나은 내일의 나를 위해 고군분투하는 분들께 개발 업계의 회고..

[주간 인프런 #37] 환상을 현실로, 게임 개발자의 ‘갓겜’의 꿈!

게임, 좋아하세요? 나만의 캐릭터를 만들고 환상의 세계 안을 돌아다니며 우루루 쏟아지는 몬스터를 해치우는 모험 속 주인공이 되는 경험, 다들 한번쯤 있으실 텐데요. 그만큼 게임 개발은 많은 분들의 로망(!)을 자극하는 분야가 아닐까 싶어요. 11월의 어느 날, 인프런은 강남의 한 공유오피스를 찾았습니다. 인디게임 개발 스타트업을 운영하고 있는 게임 개발자, Rookiss님을 만나뵙기 위해서죠. 게임 개발 업계 채용 경쟁이 한창인 요즈음인데요. 게임 개발자로 취업하기 위해서는 무엇을 준비해야 하는지, 회사를 나와 새로운 도전을 준비하고 있는 Rookiss님의 꿈과 비전은 무엇인지를 들어보았습니다. 더 읽어보기 & 출처 : https://www.inflearn.com/pages/weekly-inflearn-..

[주간 인프런 #24] 꽤 쓸만한 코딩테스트 가이드

어느덧 상반기 공채 시즌이 돌아왔습니다! 새해도 끝나고, 3월이 코 앞으로 다가오면서 많은 구직자들이 취업 문을 두드리고 있어요. 공채를 폐지하거나 축소하고 수시 채용으로 전환한다는 기업이 늘고 있지만, 공채에 대한 관심은 여전히 뜨거운 감자로 남아있죠. (앗뜨뜨!) 한편 미래의 개발자를 꿈꾸는 분들께는 중요한 첫 관문이 하나 있어요. 바로 최근 몇 년 사이 개발자 채용의 필수 코스로 자리잡은 코딩테스트입니다. 👩‍💻 서류 전형에 통과하고 나면 누군가는 발등에 불 떨어진 심경으로, 누군가는 두근두근한 마음을 안고 코딩 테스트를 준비하기 마련이죠. 꽃피는 봄🌼, 바야흐로 ‘코테’의 계절! 스물네 번째 에서는 코딩 테스트가 무엇인지 알아보고, 실제로 코딩테스트를 경험해봤던 인프런 팀원들의 소소하고 진솔한 경..

반응형