본문 바로가기

전체 글

(276)
PS 노베이스의 ICPC 도전 가이드 읽기 전 참고 이 글은 대학교에 입학 전 PS, 심지어 제대로 된 코딩 경험조차 없는 사람이 ICPC를 준비하는 법에 대한 법을 사족과 함께 설명한다. 각 주제 제목의 접두사에 사족이면 (사족)을 붙였으므로 정보 습득만을 필요로 하면 사족은 건너뛰고 보면 된다. 애매하면 붙이지 않았다. 이 사람은 뭐 하는 사람인가? 2021 Seoul Regional Persea Gratissima로 참가하여 예선 52위 2022 Seoul Regional FastIO로 참가하여 본선 24위를 했다. 글을 쓰는 2024년 지금은 개발자로 일하면서 추후 진로를 고민하고 있다. 비록 수상 기록은 없지만 나같이 경험 없는 사람이 대회에 도전하고자 할 때 참고가 되면 좋을 것 같다. (사족) 어떻게 시작했는가? "뭔가 프로그래..
리팩터링 2판 요약 - 챕터 6 6.1 함수 추출하기 배경 코드 이해를 돕기 위함 절차 함수를 새로 만들고 목적을 잘 드러내는 이름을 붙인다. 추출할 코드를 원본 함수에서 복사해 새 함수에 넣는다. 추출한 코드 중 원본 함수의 지역 변수를 레퍼런스 하거나 추출한 함수의 유효범위를 벗어나는 변수는 없는지 검사한다. 있다면 매개변수로 전달한다. 변수를 다 처리하면 컴파일 추출한 코드 부분을 새로 만든 함수의 호출로 바꾼다. 테스트한다. 추출한 함수와 비슷한 코드가 다른 곳에 있는지 살펴보고 있으면 추출한 함수로 바꿀지 결정한다. 6.2 함수 인라인하기 배경 6.1의 반대로 함수 이름보다 코드 그 자체가 이해하기 쉬운 경우가 있다. 절차 다형 메서드(Polymorphic Method)인지 확인. 그렇다면 하면 안 된다. 함수를 호출하는 곳을..
리팩터링 2판 요약 - 챕터 3 코드에서 나는 악취 냄새나면 당장 갈아라. -육아 원칙 3.1 기이한 이름 - Mysterious Name 함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 무슨 일을 하고 어떻게 사용하는지 명확히 알 수 있어야 함. 이름만 잘 지어도 문맥 파악에 걸리는 시간을 절약할 수 있음. 책에서는 관련 기법으로 함수 선언 바꾸기, 변수 이름 바꾸기, 필드 이름 바꾸기가 등장할 예정. 3.2 중복 코드 - Duplicated Code 똑같은 코드를 하나로 통합하여 더 나은 프로그램을 만들 수 있다. 중복된 코드는 서로의 차이점을 찾게 되는 부담이 생긴다. 함수 추출하기, 문장 슬라이드하기, 메서드 올리기 기법으로 개선할 수 있다. 3.3 긴 함수 - Long Function 함수를 짧게 구성하면 이해, 공유, 선..
리팩터링 2판 요약 - 챕터 2 2.1 리팩터링 정의 명사: 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법 동사: 소프트웨어의 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다. 겉보기 동작(Observable Behavior): 리팩터링 전과 후의 코드가 완벽히 똑같이 작동해야 함. 성능의 차이가 발생하고 같은 결과를 보여주기만 하면 됨. 2.2 두 개의 모자(Two hats) Two hats는 일인이역을 뜻함. 소프트웨어 개발의 목적을 "기능 추가", "리팩터링"으로 구분함. 소프트웨어를 개발할 때는 기능 추가 모자와 리팩터링 모자 두 개를 자주 바꾸면서 개발함. 본인이 어떤 모자를 썼는지 인지할 필요가 있음. 2.3 ..
[Unity] 유니티 오브젝트의 null 확인 Preface: UnityEngine.Object 유니티에서의 모든 게임 오브젝트는 UnityEngine.Object로부터 상속을 받는다. UnityEngine.Object는 유니티 엔진에서 생성된 C++ 내부 구현 객체와 C#에서 해당 객체의 포인터를 참조하는 인터페이스 클래스로 구성되어 있다. 여기서 C++은 unmanaged 언어라 프로그래머가 객체의 메모리 해제 시점을 결정할 수 있지만 C#은 managed 언어이기 때문에 메모리 해제를 GC에 맡겨야 하는 차이가 있다. UnityEngine.Object의 파괴 유니티로 코딩을 하면서 UnityEngine.Object(혹은 그를 상속하는)를 파괴하려고 하면 Destroy() 또는 DestroyImmediate()를 호출하게 된다. 이때 위에 언급한..