
Effective Java 9. try-with-resources를 사용하자
2022. 10. 4. 23:36
Java/Effective Java
try-finally 전통적으로 자원이 제대로 닫힘을 보장하기 위해서는 try-finally가 쓰였다. 하지만 해당 방식은 아래와 같이 두 가지 문제점이 있다. 문제점 자원이 많아질 수록 try 중첩문이 발생하여 복잡해진다. 아래 예시에서 try 문에서 exception 이 발생할 경우, finally 문에서도 exception 이 발생한다. 그럼 finally 문의 로그만 남아 실제로 try 문에서 난 에러는 surpressed 되며, 디버깅하기가 힘들어진다. try { return br.readLine(); } finally { br.close(); } 실제고, 2007년 당시 자바 라이브러리에서 close 를 제대로 구현한 비율은 3분의 1정도라고 한다. try-with-resources 이에 대한..

Abstract class vs Interface / 어떨 때 사용해야 할까?
2022. 8. 28. 18:32
Java
프로그래밍을 하다보면 추상 클래스(Abstract class)를 사용할 지, 인터페이스(Interface)를 사용할 지 고민이 될 때가 많다. 보통은 웬만하면 interface로 처리를 하려고 하는데, 어떨 때는 두 가지 경우 모두 사용해보며 더 나은 방식을 채택하기도 했다. 오늘은 강의를 듣다가 두 가지의 차이점에 대해 정리를 해주셔서 이 부분을 정리해보려 한다. 일반적으로 Interface를 Abstract class보다 선호한다 abstract class와 interface 모두 추상화를 하는 데에 사용이 된다. 차이점이 있다면 abstract class는 적어도 하나의 메소드는 추상화하여 메소드 바디가 없어야 하고, interface는 전체 메소드를 추상화하여 메소드 바디가 없어야 한다. 따라서,..

Spring Boot 프로젝트 생성하기
2022. 7. 15. 23:58
Spring
오늘은 Spring Boot 프로젝트를 만드는 방법에 대해서 알아보겠습니다. IntelliJ Ultimate를 사용하시는 분들은 에디터 자체에서 스프링 프로젝트를 생성할 수 있도록 기능을 제공하고 있어 손쉽게 프로젝트 생성이 가능합니다. 본 포스트는 저와 같이 학생 계정이 끝났거나 에디터에 돈을 쓰지 않은 IntelliJ Community를 사용하시는 분들을 위한 가이드입니다. Spring Initializr Spring Boot 프로젝트 생성을 간단하게 하기 위해 Spring Initializr를 제공하고 있습니다. 사실 대단한 것을 해준다기 보다는 UI 상에서 필요한 라이브러리들을 추가하고 간단하게 프로젝트를 생성해줍니다. Spring Initializr 링크 UI를 아주 간단하고 간편하게 만들어놔서..

(Java) JSON.simple을 이용하여 JSON 파일 읽고 쓰기
2022. 5. 30. 20:51
Java
간단한 JSON 파일을 읽어 파싱하는 예제를 해보겠습니다. 너무 간단하고 쉬운데 외우지는 않아서 매번 검색하기가 귀찮아서 정리를 해두어야겠습니다... 😢 개발 환경 개발 환경은 아래와 같습니다. Java 11 Gradle 6.8 Gradle 설정하기 이제 Simple JSON 라이브러리를 사용하기 위해 build.gradle 파일에 아래와 같이 dependency를 추가해줍니다. Simple Json Gradle dependencies { implementation 'com.googlecode.json-simple:json-simple:1.1.1' // ... } JSON 파일 작성하기 우선 Formatter를 통해 예쁘게 JSON을 작성합니다. 온라인 포매터 JsonFormatter를 이..

Head First Design Patterns 14. Compound Pattern
2022. 3. 25. 23:18
Design Patterns
컴파운드 패턴(Compound Pattern)의 정의 컴파운드 패턴(Compound Pattern)이란 하나의 디자인 문제를 해결하기 위해 여러 패턴을 함께 사용하는 것을 뜻합니다. MVC 패턴도 바로바로 컴파운드 패턴의 한 예시입니다. MVC 집중 탐구 Controller가 존재하는 이유 모델(Model)을 조작하는 임무를 뷰(View)에서 수행한다면, 뷰에서 두 가지 역할을 하게 되면서 코드가 복잡해지는 문제가 있습니다. 뷰를 모델에 너무 밀접하게 연관시켜야 한다는 문제가 있습니다. 이러한 경우, 재사용하기가 아주 힘들어집니다. 컨트롤러(Controller)를 사용하면 모델과 뷰의 결합을 끊어줄 수 있어서 나중에 확장하기가 용이합니다. MVC에 사용된 디자인 패턴 모델(Model) : 옵저버 패턴(O..

Head First Design Patterns 13. Proxy Pattern
2022. 3. 19. 23:26
Design Patterns
프록시 패턴(Proxy Pattern)의 정의 프록시 패턴(Proxy Pattern) - 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 프록시 패턴에서 접근을 제어하는 활용은 아래와 같습니다. 원격 프록시(remote proxy) 프록시 패턴을 써서 원격 객체에 대한 접근을 제어할 수 있습니다. 다른 JVM에 들어있는 객체의 대변인에 해당하는 로컬 객체입니다. 가상 프록시(virtual proxy) 프록시 패턴을 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있습니다. 실제 객체 생성을 미루게 해 주는 기능을 제공하기도 합니다. 보호 프록시(protection proxy)를 써서 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있습니다.

Head First Design Patterns 12. State Pattern
2022. 3. 18. 21:22
Design Patterns
스테이트 패턴(State Pattern) 예제 개선할 샘플 코드 reference code to refactor 위의 예제는 현재 상태에 따라서 수행하는 동작이 달라지는 Gumball Machine을 구현한 것입니다. 각 메소드는 아래와 같이 현재 상태에 따라서 수행하는 동작이 달라지게 됩니다. GumballMachine.java public void insertQuarter() { switch (state) { case SOLD_OUT: System.out.println("SOLD OUT"); break; case NO_QUARTER: state = HAS_QUARTER; System.out.println("Inserted quarter"); break; case HAS_QUARTER: System.o..

Head First Design Patterns 11. Composite Pattern
2022. 3. 13. 21:20
Design Patterns
컴포지트 패턴(Composite Pattern) 디자인 컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 구성할 때 쓰는 디자인 패턴입니다. 우선, 객체는 트리 구조와 동일하게 1. Leaf 노드와 2. Leaf 노드가 아닌 Composite 노드가 있습니다. 이 두 객체는 상위 개념인 Component 클래스를 상속받고 재귀적인 구조를 구성합니다. 상위 클래스인 Component 클래스는 이 두 객체에서 구현해야하는 모든 함수를 포함하고 있습니다. Composite 클래스는 자식이 있는 구성요소의 행동을 정의하고 자식 구성요소를 저장하는 역할을 합니다. Leaf 클래스는 그 안에 들어있는 원소에 대한 행동을 정의합니다. 컴포지트 패턴(Composite Pattern) 예제 아래 다..

Head First Design Patterns 10. Iterator Pattern
2022. 3. 12. 22:39
Design Patterns
이터레이터 패턴(Iterator Pattern)은 언제 필요할까? code reference 두 개의 구성 객체에서 하나는 정보를 ArrayList 데이터 타입로 가지고 있고 하나는 정보를 Array 데이터 타입으로 가지고 있을 경우, 아래와 같이 각각 다른 loop 를 통해 탐색을 해야합니다. ArrayList - size() 함수 이용 Array - 배열에 들어있는 원소의 크기 변수 이용 Waitress.java public void printMenu() { ArrayList breakfastItems = pancakeHouseMenu.getMenuItems(); for (int i = 0; i < breakfastItems.size(); i++) { MenuItem menuItem = (MenuIt..

Head First Design Patterns 9. Adapter Pattern
2022. 3. 11. 20:47
Design Patterns
객체지향 어댑터(Adapter) 어댑터(Adapter)는 클라이언트로부터 요청을 받아서 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 합니다. 어댑터 패턴(Adapter Pattern) 예시 reference code 레퍼런스 코드를 확인해보면 클라이언트에서 Turkey 를 기존에 제공하는 클래스인 Duck 으로 변환시켜주기 위해 TurkeyAdapter 코드를 추가하였습니다. TurkeyAdapter.java public class TurkeyAdapter implements Duck { Turkey turkey; public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; } @Override public voi..

Head First Design Patterns 8. Template Method Pattern
2022. 2. 27. 22:22
Design Patterns
템플릿 메소드 패턴(Template Method Pattern) 예제 code reference 템플릿 메소드(Template Method)에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다. 아래 예시를 살펴보면 CaffeineBeverage 클래스에서 알고리즘을 독점하고 있는 것(prepareRecipe)을 볼 수 있습니다. 그리고 이 알고리즘의 일부 구현만 서브 클래스에 의존합니다. 그래서 알고리즘은 한 군데에 있기 때문에 그 부분만 고치면 됩니다. CaffeineBeverage.java public abstract class CaffeineBeverage { final void prepareRecipe() { boilWater(); brew(..

Head First Design Patterns 7. Facade Pattern
2022. 2. 26. 09:37
Design Patterns
퍼사드 패턴(Facade Pattern)의 정의 퍼사드 패턴(Facade Pattern)은 하나 이상의 복잡한 인터페이스를 깔끔하면서도 말쑥한 퍼사드(겉모양, 외관 등을 뜻함)으로 덮어주는 패턴입니다. 일련의 복잡한 클래스들을 단순화하고 통합된 클래스를 제공합니다. Head First Design Patterns에서는 아래와 같이 퍼사드 패턴을 정의합니다. 퍼사드 패턴(Facade Pattern) 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다. 최소 지식 원칙 Design Pattern 7. 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라. 시스템을 디자인 할 때, 어떤 객체든 그 객체와..