본문 바로가기

전체 글382

[Effective Java] Try-finally 대신 Try-with-Resources로 자원 해제하기 오늘은 실무에서 굉장히 많이 사용하는 Try-with-resources 문법에 대해 정리해두려고 한다. Try-with-resources 는 Java 7 부터 도입된 문법인데 기존의 try-finally 에 비해 장점이 있어 실무에서 많이 사용된다. 먼저 기존에 사용하던 try-finally 방법에 대해 말씀드리겠다. 아래 예시를 보자. public static void main(String args[]) throws IOException { FileInputStream fis = null; BufferedInputStream bis = null; try { fis = new FileInputStream("test.txt"); bis = new BufferedInputStream(fis); int dat.. 2023. 1. 31.
[Effective Java] Primitive Type 과 Wrapper Class 자바에는 여러 기본 자료형(Primitive Type) 과 해당 자료형에 대한 Wrapper Class를 제공한다. 우리는 이 Wrapper Class를 이용해 기본형을 객체로 생성해 이용할 수가 있다. 각 기본형에 해당하는 Wrapper Class 와 사용 방법은 아래와 같다. 기본형 Wrapper Class 예시 boolean Boolean Boolean a = new Boolean(true); boolean b = new Boolean("false"); char Character Character a = new Character('a'); byte Byte Byte a = new Byte(3); Byte b = new Byte("100"); short Short Short a = new Short(.. 2023. 1. 30.
[Effective Java] Config 파일에 DI (Dependency Injection) 사용하기 요즘 Spring을 활용한 프로젝트를 많은 사람들이 하고, 실무에서도 많은 프로젝트가 Spring을 이용해서 개발되고 있다. 토이프로젝트를 만들거나 할때는 상관없지만, 실제로 유저에게 제공할 서비스를 만드는 경우라면 여러 환경을 고려해야한다. 개발자의 pc 에서 접근하는 local 영역, 개발 서버인 dev , 테스트 서버인 test, 실제 유저에게 오픈할 live 서버 등 이렇게 많은 환경에서 다른 정보를 제공해야하는 경우가 많다. 아래 특정 프로젝트의 Config 파일을 보자. @Configuration public class ToyPJTConfig { private static final String apiUrl = "https://~~~~~"; ... } api 서버 url 을 이런식으로 상수화 .. 2023. 1. 28.
[Effective Java] 인스턴스 생성을 막기 위해 private 생성자를 이용하자 코드를 작성하다 보면 특정한 기능을 손쉽게 사용하기 위해 특정한 헬퍼 클래스나 유틸리티 클래스를 만드는 경우가 있다. (객체지향적인 관점에서 봤을때 권장하는 방법은 아니나 굉장히 많은 회사에서 이렇게 사용한다.) 예시로 특정한 정보를 체크하기 위한 기능을 모아놓은 CheckManager 클래스가 있다고 가정하자. public class CheckManager { public static boolean isAdult(int age) { // 나이 체크 } public static boolean isPossibleAmount(int amount) { // 사용 가능 금액 체크 } public static boolean isAvailableUser(User user) { // 유저 정책 체크 } } 위의 코드.. 2023. 1. 28.
[Design Pattern] Singleton Pattern 우리는 객체를 하나만 사용하기 위해 Singleton 패턴을 많이 활용한다. Singleton 을 구현하기 위해 몇가지 방법이 있는데 간단하게 말씀드려보겠다. public static member 해당 방법은 인스턴스를 초기화 시킨 뒤 고정시켜 사용하는 방법이다. 사용자는 변수에 직접 접근하여 사용하여야 한다. 이렇게 사용하면 의도하지 않은 객체 생성을 막을 수 있다. public class Member { public static final Member INSTANCE = new Member(); private Member() { } } private static final field 해당 방법은 getInstance라는 메서드를 통해 instance에 접근하는 방법이다. 인스턴스 변수에 직접 접근하는.. 2023. 1. 28.
[Effective Java] 생성자 대신 Static Factory Method를 사용하자 아래 내용은 Effective Java를 읽고 내용을 정리한 것입니다 :) 보통 개발자가 클래스의 인스턴스를 얻기 위해서 생성자를 사용한다. 허나 객체지향 개발자라면 Static Factory Mehtod를 이용하여 인스턴스를 얻는 방법도 알아두어야 한다. 아래 Laptop 클래스를 보자. public class Laptop { private String model; private String company; public Laptop(String model, String company) { this.model = model; this.company = company; } } public 생성자의 아주 간단한 예를 살펴볼 수 있다. 보통 of 나 from 같은 정적 팩토리 메서드를 만들어 아래처럼 대체할 .. 2023. 1. 27.
2022년 개발자 회고 23년이 된지 벌써 20일이나 지나버렸다. 더 늦기전에 작년한해 동안의 경험을 기록해두려한다. 1. 성장의 한해 6년차인 내가 말하기엔 조금 부끄러운 얘기지만 22년은 개발자로서 제대로 성장한 한해였다. 21년말 좋은 기회가 주어져 개발하기 참좋은 회사로 이직을 했었는데 많은 것을 배웠고 보람과 성취를 이룰수 있었다. 1년동안 총 5 개의 프로젝트를 수행했고 개인적으로 만족하는 결과를 만들어 냈다. 진짜 개발자가 되는데 한걸음 더 다가간 것 같아 좋았다. 도움을 주신 많은 분께 감사의 말씀을 전한다. 2. 능동적인 사람 지금 회사에 오기전에 은행 IT 부서에서 근무했었는데 지금 생각해보면 나는 굉장히 수동적인 사람이었다.상사가 시키는 대로 기계처럼 일을 했었다. 하지만 현재 회사에 와서 조금 능동적인 사.. 2023. 1. 21.
추상적인 책임 vs 상세한 책임 앞선 글들에서 객체지향 설계의 품질은 책임을 어떻게 설정하는가에 달려있다고 했다. 객체지향 설계를 하다보면 책임의 레벨을 어떻게 설정해야할지 고민할 때가 올 것이다. 오늘은 어떤 수준의 책임을 만들어내는 것이 적합한지에 대해 이야기 해보고자 한다. 1번 상황 위의 상황을 보자. 이와 같은 경우는 책임에 대한 자율성이 높지만 너무 추상적인 책임이다. 이러한 경우에는 자율성이 높은 만큼 잘못된 의도대로 책임이 수행되지 않을 수 있다. 2번 상황 위와 같은 경우는 1번과는 다르게 아주 상세한 수준으로 구현이 되었다. 이렇게 하면 정확하게 의도한대로 책임을 수행하긴 하지만 책임에 대한 자율성이 제한된다. 마치 신입직원(?)처럼 팀장에게 의존할 수 밖에 없는 형태이다. 3번 상황 1번 상황에서의 일하라라는 책임은.. 2022. 10. 25.
[Design Pattern] Composite 패턴 정리 Composite pattern 오늘은 Composite Pattern 에 대해 정리를 해 두고자한다. 해당 패턴은 전체와 부분을 하나의 단위로 추상화해야할 경우 사용된다. 클라이언트 입장에서 메시지 수신자가 부분인지 전체인지에 상관없이 동일한 메시지를 통해 동일한 방식으로 대상과 상호작용해야할 경우 사용하는 패턴이다. 아래는 Composite Pattern 을 다이어그램으로 그린 형태이다. Composite pattern에서 협력에 참여하는 역할과 책임을하는 구성요소를 살펴보자. Component 는 클라이언트와 협력할 수 있는 공용인터페이스를 정의하는 역할을 수행한다. 예시로 든 다이어그램에서는 추가, 제거, 포함된 하위 컴포넌트 반환 등의 역할을 수행한다. Leaf 는 공용 인터페이스에 대한 오퍼레.. 2022. 10. 11.