공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/Language 20

Writing Beautiful Package in Go

Golang UK Conference 2017 발표. https://youtu.be/cmkKxNN7cs4 go로 개발한 오픈소스 패키지가 여러 사람들에게 유용하고 쉽게 쓰이려면 어떻게 해야 하는지를 설명한 강연 package는 go파일 (_test.go 포함) 로 구성된 하나의 디렉토리. 다른 프로젝트에서 import해서 사용할 수 있음 exported / internal 두 종류가 있음 main 패키지 말고. main 패키지는 command를 의미함 user-centred Design 결국 사람이 쓰는 거니까, 개발하려는 프로덕트의 최종 사용자의 요구사항, 제한조건을 고려해서 설계해야 한다. 따라서 고민해야 할 점 누가 쓸 건지 하려는 건 무엇인지 왜 하려는 건지 굳이 내 패키지를 쓰려는 이유는 뭔지 ..

Go - Context 정리

Context Package https://youtu.be/mgJMIZsWfB4 go의 다양한 패키지에서 사용되고 있는 Context Context의 기능은 크게 세 가지. Deadlines Concellation Signals Request-scoped values Deadline - withTimeout, withDeadline WithDeadline: 시작 시간과 끝 시간을 정하고, 그 시간동안만 실행되도록 (endtime) WithTimeout: 시작 시간을 정하고, 얼마의 시간이 지난 뒤 종료되도록. (Duration) const shortDuration = 1 * time.Millisecond func main() { ctx, cancel := context.WithTimeout(context..

JIT Compiler

Just in Time Compilation, and the Code Cache 자바 컴파일러가 .java -> .class 바이트코드 파일로 변경. 이 변경된 .class 파일이 JVM 위에서 실행된다. 바이트코드로 변환된 후 jvm에서 runtime에 실행되는 구조 : 어느 하드웨어에서건 동일한 실행이 가능하다. 단순히 바이트코드 변환하는 용도뿐만 아니라, 일반적인 인터프리터보다 효율적으로 동작하도록 설계되어 있음. 기본적으로 인터프리터는 코드 한 줄씩 런타임에서 읽어들여 실행하는 구조. 느린 편이다. JVM의 바이트코드 interpretation은 느린 속도를 해결하기 위해 JIT compilation (Just in time compilation) 을 사용한다. 어떤 코드가 가장 자주 실행되는지를..

[Design Pattern] Facade

Facade Facade 패턴은 '하위 시스템을 보다 쉽게 사용할 수 있게 해주는 인터페이스를 정의하는 것' Adapter 패턴과 거의 같은 방식으로 작동하지만, 목적이 다르다. Adapter : 원래 코드를 다른 코드와 작동할 수 있도록 하는 Wrapper를 제공 Facade : 원래 코드를 더 쉽게 처리할 수 있는 Wrapper를 제공 객체나 클래스, 인터페이스가 복잡할 경우, 쉽게 사용할 수 있도록 프론트 인터페이스를 제공하는 형태. 캡슐화되지 않은 코드를 처리할 때 / 원하는 코드를 다시 작성할 수 없을 때 주로 사용한다. 단, 원래의 클래스, 인터페이스 코드가 변경될 경우 Facade 패턴도 변경해야 한다. 패턴의 특징 여러 복잡한 클래스를 하나로 간주해서 편하게 다루는 방법 따라..

[Design Pattern] Strategy

Strategy 패턴 여러 알고리즘을 하나의 추상적인 접근점 (인터페이스)을 만들어서, 인터페이스에서 알고리즘이 서로 교환 가능하도록 하는 패턴. 동일한 목적의 알고리즘 여러 개 중 특정 알고리즘을 선택해야 할 때. 인터페이스는 '기능의 선언 (구현부와 분리)' 역할을 담당. 하나의 인터페이스로 여러 가지 기능을 구현하기 위한 단일 통로를 생성하는 것. ex) 워드에서 프린터 명령어 -> 어느 기종의 프린터를 사용하건 상관없이 프린트 명령어가 실행됨 기능 위임 (Delegation) 예시코드. // AObject : 객체 정의. 이 객체에서 수행할 기능을 인터페이스에 위임하는 방식 public class AObject { BInterface bInterface; // 객체 생성 시, 기능을..

[Design Pattern] Bridge

Bridge 두 가지 개념을 먼저 정리해야 한다. 기능 클래스 계층. = 새로운 기능을 추가하고 싶은 경우 구현 클래스 계층. = 새로운 구현을 추가하고 싶은 경우 즉, 클래스를 생성할 때 생성의도를 먼저 고민해야 한다. 기능을 추가할 것인가? 구현을 추가할 것인가? public interface IRobot { void powerOn(); void powerOff(); } public class RobotModel1 implements IRobot { @Override public void powerOn() { System.out.println("type1 : power on"); } @Override public void powerOff() { System.out.println("type1 : pow..

[Design Pattern] Decorator

Decorator 객체 결합으로 기능을 동적으로 유연하게 확장할 수 있게 하는 패턴. 기본 기능에 추가할 수 있는 기능 종류가 많은 경우, 각 추가 기능을 Decorator 클래스로 정의한 뒤 필요한 Decorator 객체를 조합하는 식으로 설계함 상속을 통해 확장할 수도 있지만, 디자인 유연성 면에서 상속은 비추천 기존 코드를 수정하지 않고도 확장할 수 있도록 Decorator 패턴 사용 ex) 자바 입출력의 Filter Stream 기능. 단점 자잘한 객체가 많이 추가되므로, Decorator 패턴을 너무 많이 사용할 경우 코드가 필요 이상으로 복잡해질 수 있다. Component를 초기화하기 위한 코드가 복잡해진다. Decorator로 Wrapping해야 하는 경우가 종종 생김. 따라서 보통 Fac..

[Design Pattern] Adapter

Adapter Pattern 한 클래스의 인터페이스를, 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 역할. 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스를 연결하는 역할. 이미 제공되어 있는 것 / 필요한 것 사이의 차이를 없앤다고 보면 된다 Wrapper 패턴이라고도 불림. 다른 용도로 사용할 수 있도록 변경해주는 개념 두 가지 종류가 있다. Class 기반 Adapter (상속을 사용한 방법) Instance 기반 Adapter (위임을 사용한 방법) 기존의 클래스를 개조해서 필요한 클래스를 생성하는 방법. 일반적으로 기존의 클래스 == "잘 만들어졌고, 버그가 발생하지 않는다는 걸 오랜 시간 사용하며 증명한 코드". 이 클래스를 더 많은 곳에서 다양한 방식으로 사용하기 위해 고..

[Design Pattern] Observer

Observer 패턴 한 객체의 상태가 바뀌면, 해당 객체에 의존하는 다른 모든 객체에게 notice 전송 + 자동으로 내용이 갱신되는 one to many 방식의 의존성을 정의한 객체. Subject 객체의 bCheck 변수 - 해당 객체가 변경되었는지 여부를 알리는 boolean. bCheck가 false이면, Subject 객체에 의존하는 Observer 객체에게 값 변경이 있음을 알린다. Observer 객체는 update() 메소드로 Subject값이 어떻게 변경되었는지 확인하고, 변경된 값에 대응되는 메소드를 실행한다. 자바의 Observer 내장패턴 사용하기 Push방식, Pull방식 모두 사용가능함. java.util.Observer 인터페이스 구현 후 Observable 객체의 addOb..

[Design Pattern] Builder

Builder 패턴 객체 생성 시 흔히 사용되는 패턴. Dot chain 문법이라고도 부른다. 빌더 패턴을 다루는 두 가지 설명 GoF Design Pattern: 객체의 생성 / 조립 방법을 분리할 목적 Effective Java의 builder Pattern GoF의 패턴보다는 좀 더 코딩위주의 활용법. 코드 가독성 / 유지보수성을 위해 빌더 패턴을 권장함 객체 일관성, 불변성 (변경불가능) 등의 특징을 강조 규칙, 생성자 인자가 많을 경우 builder 패턴을 권장하는 편. effecitve java의 builder pattern은 깔끔하고 유연하게 객체를 생성하기 위한 기법. @Getter @Setter @AllArgsConstructor // 생성자에서 특정 필드만 제거한 채 구현하려면, 그만큼..