전체 글 40

Lazy<T>

Lazy란? .NET은 4.0 이후 버전에서 Lazy 형식을 제공한다. Lazy을 사용하면 객체 생성에 있어서 초기화 지연이 가능하다. 이게 무슨 말이냐면, T 형식의 객체가 Lazy를 사용하면 최초로 호출되는 시점에 생성된다는 것이다. 예시 아래 Lazy의 사용 예시를 보자. public class LazyCallClass { private Lazy _test; public LazyTest Test => _test.Value; public LazyCallClass() { _test = new Lazy(() => new LazyTest()); Console.WriteLine($"{nameof(LazyCallClass)} is created."); } } public class LazyTest { } st..

SOLID원칙 - ISP(Interface Segregation Principle)

ISP(Interface Segregation Principle)이란? 특정 클라이언트가 자신이 이용하지 않는 메서드 등의 멤버에 의존하면 안된다. ISP(Interface Segregation Principle)은 직역하면 인터페이스 분리 원칙이다. 다시 말하자면 특정 객체가 특정 인터페이스를 상속받아 구현할 때 불필요한 메서드나 멤버가 있으면 안된다는 원칙이다. 스마트폰에 빗대서 설명해보자. 아래에 SmartPhone의 기능을 정의한 인터페이스가 있다. 스마트폰처럼 음악을 재생시킬 수 있고 메세지, 전화 기능도 구현되어 있으며 검색 기능까지 구현되어 있다. public interface ISmartPhone { void PlayMusic(); void SendMessage(); void Call();..

SOLID원칙 - LSP (Liskov Substitution Principle)

LSP(Liskov Substitution Principle)이란? 상위 타입의 객체를 하위 타입의 객체로 치환하여 사용하여도 프로그램은 정상적으로 동작해야 한다. LSP(Liskov Substitution Principle)은 상속이 이루어진 클래스간에 상위 타입에 하위 타입의 객체를 치환하여 사용할 때에도 프로그램의 안정성이 보장되어야 한다는 것을 뜻한다. 객체지향 프로그래밍을 해왔던 개발자에겐 너무도 당연하게 스며들어 있는 개념이다 예시 클래스 상속 구조 아래와 같이 Person, ChildA, ChildB를 정의한다. ChildA와 ChildB는 Person을 상속받고 Person의 GetName 함수를 Override하고 있다. public class Parent { public virtual ..

github pull request 템플릿 페이지 만들기

배경 github을 사용하여 프로젝트를 관리하다보면 pull request(이하 PR)을 아주 많이 요청하곤 한다. PR 요청을 할 때에는 다른 개발자의 이해를 돕기 위해서 작업에 대한 설명을 함께 기재해야 한다. 이때 유용하게 사용할 기능을 설명하고자 한다. Pull Request 템플릿 만약 PR 요청시 고정된 패턴의 설명문 형식이 필요하다면 pull request 템플릿을 사용하면 된다. 파일 형식 파일은 Markdown(MD) 형식이다. 템플릿 파일을 Markdown 형식으로 기재하여 특정 위치에 놓는다면 PR 요청시 자동으로 템플릿이 로드된다. 이때 파일명은 PULL_REQUEST_TEMPLATE.MD로 생성한다. 파일 위치 %PROJECT_FOLDER%\.github\PULL_REQUEST_T..

SOLID원칙 - SRP (Single Responsibility Principle)

SRP(Single Responsibility Principle)이란? 클래스는 하나의 책임만 가져야 한다. SRP(Single Responsibility Principle)은 하나의 객체가 하나의 책임만을 가져야한다는 원칙이다. 아주 간단하고 명료한 명제이지만 소프트웨어 개발에 있어서 "책임"이라는 단어의 범주는 한 마디로 표현하기가 어렵다. 그래도 굳이 한 마디로 표현하자면 논리적으로 설계된 하나의 기능이라고 볼 수 있다. 다만 여기서 말하는 기능의 기준은 클래스가 정의한 메서드나 상속 구조, 사용자의 수를 말하는 것은 아니다. 예를 들어보자. 누군가 당신에게 뉴스 웹 페이지에서 기사 내용을 가져와 프로그램에 나타내는 소프트웨어 개발을 요청했다고 하자. 당신은 웹페이지 주소에서 뉴스 내용을 가져오는 ..

스테이트 패턴 (State Pattern)

스테이트 패턴(State Pattern)이란? 어떠한 객체가 특정 상태에 따라 다른 행동을 해야할 때 사용할 수 있는 패턴을 스테이트 패턴(State Pattern)이라고 한다. if문이나 switch 문을 통해 객체의 상태를 객체내에서 충분히 정의할 수 있다. 다만 상태의 경우가 많아질수록 내부적으로 처리해야하는 코드가 많아지고 객체 코드가 지저분해지며 유지 보수가 점점 어려워진다. 따라서 상태를 캡슐화하여 이를 객체 단위로 유지한다. 물론 객체내 코드가 단순해지는 장점은 있지만 분명 단점이 존재한다. 상태마다 클래스를 정의해야하므로 프로젝트내 클래스가 다소 많아질 수도 있다. 이를 적절하게 사용해야 할 것이다. 코드 가독성 증가 객체내 코드 단순화 프로젝트내 객체가 많아져 관리가 어려워질 수 있음. ..

싱글톤 패턴 (Singleton Pattern)

싱글톤 패턴(Singleton Pattern)이란? 싱글톤 패턴(Singleton Pattern)의 개념은 아주 간단하다. 전체 프로그램에서 하나의 인스턴스만 유지되는 형식을 뜻한다. 장점 프로젝트 어디에서나 해당 인스턴스에 접근할 수 있다. 한 번만 인스턴스가 생성되기 때문에 메모리를 절약할 수 있다. 단점 하나의 인스턴스이기 때문에 하나의 기능이 다른 기능에 영향을 미치지 않는지 늘 고민해야한다. ( OCP에 어긋날 수 있음.) 예제 싱글톤 패턴을 사용하는 방법은 아래와 같다. static 직접 선언 Framework에서 제공하는 기능 이용 static 직접 선언 클래스 정의 싱글톤으로 생성할 클래스 내부에 정적 변수를 생성하여 유일하게 생성한 인스턴스를 반환한다. public class User {..

[C#] FileNotFoundException 발생

배경 최근 회사에서 여러 제품에서 공통으로 참조해서 사용하기 위해서 유틸리성의 공용 다이얼로그 프로젝트를 만들었다. 별도의 프로젝트로 테스트코드까지 작성하여 완성시킨 뒤, 현재 제품에 적용하는 중에 FileNotFoundException가 발생하였다. 회사에서 업무를 진행하다가 종종 발생하는 Exception이나 그 동안 해결 방법을 기록해두지 않아 10~20분을 구글링을 하게 되었다. 다음에 같은 상황이 발생했을 때 해결 시간을 1~2분으로 축소하기 위해 이렇게 기록해두려 한다. 원인 회사내의 프로젝트간 참조 구조는 간단하게 위와 같이 나타낼 수 있다. ProjectA는 솔루션의 메인 프로젝트로서 실질적인 프로그램의 실행을 담당한다. ProjectB의 경우는 ProjectA에서 호출할 프로그램의 기능들..

SOLID원칙 - OCP (Open Closed Principle)

OCP(Open Closed Principle)이란? 객체는 확장에 대해 열려있어야 하고 수정에 대해서는 닫혀 있어야 한다. 위의 말처럼 소프트웨어는 기존 코드의 수정없이 새로운 기능이 추가될 수 있도록 설계되어야 한다. 다시 말해서 이미 개발된 클래스를 다른 클래스나 모듈에서 사용하고 있을 때, 기능 추가의 작업이 수행된다면 사용하는 부분에서의 코드 수정은 없어야 한다라는 말이다. 예시 아래의 예시를 살펴보자. MoviePlayer라는 객체가 있다고 하자. MoviePlayer는 "IronMan"이라는 영화를 입력받아서 재생시키는 기능을 구현하고 있다. public class MoviePlayer { public void Play(IronMan ironMan) { ironMan.Play(); } } p..

Jaywapp.BuilderWizard

github GitHub - jaywapp/Jaywapp.BuilderWizard: Wizard dialog for creating Builder patterns Wizard dialog for creating Builder patterns. Contribute to jaywapp/Jaywapp.BuilderWizard development by creating an account on GitHub. github.com BuilderWizard란? 빌더 패턴에서 개체를 만드는 마법사 다이얼로그니다. 사용자는 다른 View를 만들고 추가하여 빌더 패턴에서 개체를 만들 수 있습니다. 사용방법 1. Builder 빌더의 개체를 정의합니다. 이는 IJayBuilder 인터페이스를 상속하여 정의합니다. publi..