Java

    [JDBC] Try-with-resources

    JDBC API를 직접 사용하는 경우, Connection, PreparedStatement, ResultSet을 어떻게 하면 잘 닫을 수 있을까? 이 때, 사용할 수 있는 방법이 Try-with-resources이다. Try-with-resources try문 내부에 우리가 사용할 객체를 명시해준다. 이렇게 하면, try-catch 구문을 벗어날 때 해당 객체의 close() 메서드를 호출한다. 따라서 따로 close();를 일일히 해주지 않아도 된다 :) public void delete(String name) throws SQLException { String query = "DELETE FROM History WHERE Name = ?"; try (Connection connection = Dri..

    Java의 Stack도 방어적 복사(defensive copy)를 해야할까?

    우선 우리는 불변 객체를 사용하는 것을 권장한다. 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말한다. 만약, 객체의 내부 상태를 제공하는 메소드를 지원하는 경우 방어적 복사를 통해 제공한다. 그렇다면, 방어적 복사란 무엇일까? 방어적 복사란? 내부의 상태를 제공하는 메소드를 지원하는 경우 (ex. getter) 외부와 내부에서 주소값을 공유하는 인스턴스의 관계를 끊어주기 위해 사용된다. 우선, 아래의 예시 코드를 보자. public class TestClass{ private final List strings; public TestClass() { strings = new ArrayList(); } public List getStringsWithoutDefensiveCopy() { r..

    왜 상속보다는 조합을 사용해야할까?

    개발자가 반드시 정복해야 할 객체지향과 디자인 패턴에서 발췌한 글이 포함되어 있습니다. 요즘 우아한 테크코스를 진행하며 가장 자주 듣는 문장 중 하나인 것 같다. 상속보다 조합(Composition)! 왜 우리는 상속보다 조합을 이용해야할까? 상속과 재사용 상속을 사용하면 쉽게 다른 클래스의 기능을 재사용하면서 추가 기능을 확장할 수 있다. 그러므로 기능의 재사용이라는 측면에서 상속은 아주 매력적인 솔루션이다. 하지만 상속은 변경의 유연함이라는 측면에서 단점을 갖는다. 상속을 통한 재사용의 단점 - 상위 클래스 변경이 어렵다. 상위 클래스에서 무언가 변경이 발생해야 할 때, 그 전파는 하위 클래스까지 이어지게 된다. 특히 계층도가 커질수록 상위 클래스의 변경이 어려워진다. 상속 계층을 따라 상위 클래스의..

    객체지향적 설계란 무엇일까?

    한 객체에 기능이 많아지면 절차 지향적인 구조를 갖게 된다. (절차 지향적인 구조를 갖게 되면 기능과 관련된 데이터를 공유하기 때문에 유연하지 못한 구조를 갖게 된다.) 따라서 객체가 갖는 책임의 크기는 작아질수록 유연함을 얻을 수 있다. (관련 원칙 : SRP) 의존이 순환해서 발생할 경우 꼬리에 꼬리를 문 것 처럼 영향이 전파된다. (변경은 의존 관계를 따라 전이된다.) 내가 변경되면 나에게 의존하고 있는 코드에 영향을 준다. 나의 요구가 변경되면 내가 의존하고 있는 타입에 영향을 준다. 그러므로! 캡슐화가 필요하다. 기능 구현을 캡슐화하면 내부 구현이 변경되더라도, 기능을 사용하는 곳의 영향을 최소화할 수 있다. 캡슐화를 위한 두 개의 규칙 Tell, Don’t Ask 데이터를 물어보지 않고, 기능..

    절차지향은 왜 지양해야 할까?

    개발자가 반드시 정복해야 할 객체지향과 디자인 패턴에서 발췌한 글이 포함되어 있습니다. 우선 책의 1장을 읽으며 기록해뒀던 것들을 스스로 남겨두기 위해 몇 줄 적고 본격 절차지향을 지양해야하는 이유에 대해 작성하겠다.본격 구현 전, 설계를 통해 비슷하게 동작하는 것들을 구분하자서로 다른 이유로 변경되는 코드가 한 메서드에 섞여있으면 향후 유지 보수하기 어렵다. 메서드 내부의 코드들이 모두 같은 목적을 바라보고 있는지 확인해보자소프트웨어는 사용자의 요구 사항을 만족시킴과 동시에, 변화할 수 있어야한다. (요구사항은 언제든 변화할 수 있다.)절차지향을 지양해야하는 이유절차지향과 객체지향 중, 객체지향을 따라야 한다는 말은 많이 들어봤을 것이다. 그런데 도대체 왜? 절차지향보다 객체지향을 지향해야할까라는 의문..

    [Java] Checked Exception vs Unchecked Exception

    아무리 생각해도.. 티스토리의 마크다운은 좀 많이 불편하다.. 그렇다고 다시 github.io로 돌아갈 수도, velog로 돌아갈 수도 없는 노릇이지만.... 이럴 때 어떻게 해야하나요,, 추천 부탁드립니다 :( 오늘은 제이슨의 세번째 자바 기초 강의였던 Java Exception에 대해 듣고, 정리한 내용이다. 우선 Exception의 상속 구조는 다음과 같다. 이미지는 우아한테크코스 수업 자료에서 가져왔는데, 문제가 된다면 얼른! 지우겠습니다 Throwable을 상속하고, Error, Exception이 존재한다. 에러의 경우는 개발자가 에러라는 것을 직접 사용하는 것은 드물다. 여기서 에러를 직접 사용하는 것은 무엇을 의미할까? 우리가 프로그램을 짤 때, 어떤 부분에서 문제가 발생될 것으로 예상될 ..

    [Effective Java] 아이템 6. 불필요한 객체 생성을 막아라.

    아이템 6. 불필요한 객체 생성을 막아라. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 특히 불변 객체는 언제든 재사용할 수 있다. 실행될 때 마다 인스턴스를 새로 만드는 다음과 같은 예제는 절대 추천하지 않는다. 우리는 첫번째 코드 대신, 개선된 두번째 코드를 통해 생성되는 인스턴스의 수를 줄일수도 있을 뿐만 아니라 모든 코드가 같은 객체를 사용함을 보장할 수 있다. String s = new String("joanne"); // NOPE ! String s = "joanne"; // BETTER 우리가 아무렇지 않게 사용하는 객체 중에는 생성 비용이 아주 비싼 객체도 더러 있다. 그것은 바로바로! Pattern 객체이다. Pattern 인스턴스는 입력받은 정..

    [Effective Java] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.

    아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 하나 이상의 자원에 의존하는 클래스의 경우에는 다음과 같이 구현된 경우를 드물지 않게 볼 수 있다. // 정적 유틸리티를 잘못 사용한 예 public clas SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} //객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String type) { ... } } // 싱글턴을 잘못 사용한 예 public clas SpellChecker { private final Lexicon d..

    [Effective Java] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

    아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 만약, 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. 예를 들어, java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서들을 모아놓을 수 있다. 또한 java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수 있다. 또는 final 클래스와 관련한 메서드들을 모아놓을 때에도 사용한다. 이러한 정적 멤버만을 담은 유틸리티 클래스는 인스턴스로 만들지 않고 사용하는 것이 낫다. (🤔 나는 여태까지 뭣도 모르고 정적 팩토리 메서드로 사용했는데, 맞았다니.. 다행이다) 나 말고도, 인스턴스 해당 유틸리티 클래스를 인스턴스화..

    [Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

    Effective Java를 주문해놓고, 이 책 또한 장식용이 될 뻔 했는데 우테코 @로키의 책 읽기 리스트?에 함께 하고 싶어서 열심히 읽게 되었다. 역시 함께하는 사람이 있는 것은 매우 중요하고, 우테코에는 이렇게 동기부여가 되는 크루들이 많아서 배울 점이 많다. 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. 싱글턴(singleton)이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (인스턴스에 대해서도 접은글로 설명을 덧붙여놓았다.) 더보기 그렇다면 인스턴스란? 어떤 클래스에 속하는 각 객체를 인스턴스라고 한다. 좀 뜻이 모호한데, 좋은 예시를 찾다가 해당 블로그에서 제시해주신 예시를 인용하여 설명을 보충해보자. 붕어빵을 만들려면 붕어빵을 찍기 위한 틀이 있어..