N° 01 — 목록

'Backend Development' (45)

  1. Backend Development/Java

    Java - 09. exception

    throws Exception이 최악의 예외 처리인 이유 — 예외 계층과 자원 관리메서드 시그니처에 throws Exception이라고 적힌 코드를 본 적이 있는가. "뭔가 예외가 날 수 있는데, 구체적으로 뭔지는 모르겠고, 어차피 호출하는 쪽에서 처리해"라는 뜻이다. 이것은 예외 처리가 아니라 예외 무시다. 호출하는 쪽은 catch (Exception e)를 강제받고, 정작 복구할 수 있는 정보는 없다."복구할 수 있으면 checked, 못 하면 unchecked." — 이 한 문장이 Java 예외 시스템의 핵심이다. (JLS §11) 이 글은 checked vs unchecked의 선택 기준, try-with-resources의 자동 자원 관리, 그리고 "예외를 삼키면 안 되는 이유"를 풀어간다.예외..

    · 댓글
  2. Backend Development/Java

    Java - 08. record sealed enum

    보일러플레이트를 없앤 Java의 세 가지 타입 — record, sealed, enumPoint 클래스를 만든다고 하자. x, y 필드, 생성자, getter, equals, hashCode, toString — Java에서 불변 데이터 객체 하나를 제대로 만들려면 50줄이 필요했다. Lombok @Value로 줄여봤지만, 그것은 서드파티 라이브러리에 대한 의존이었다.Java 16에 record가 들어왔다. public record Point(double x, double y) {} — 한 줄. 컴파일러가 나머지를 다 만들어 준다. (JEP-395) 왜 Java는 30년이나 지나서야 이 한 줄을 가능하게 했을까? 이 글은 record, sealed, enum 세 가지 현대 타입이 기존 코드를 어떻게 바꾸..

    · 댓글
  3. Backend Development/Java

    Java - 07. interface and abstract

    interface에 메서드 본문이 들어간 이유 — default method와 다중 구현의 충돌Java 8 이전의 interface는 순수한 명세였다 — 메서드 선언만 있고 본문이 없는 계약서. 그런데 라이브러리를 배포했는데, 나중에 새 메서드를 추가해야 한다면? 그 인터페이스를 구현한 모든 클래스가 컴파일 에러로 깨진다. 이 문제를 해결하기 위해 default method가 도입됐다 — interface에 본문이 있는 메서드를 넣을 수 있게 됐다. (JEP-126, Java 8) "이미 구현체를 가진 메서드를 interface에 넣을 수 있다"는 작은 변화가, Java 컬렉션 API 전체에 함수형 프로그래밍을 가능하게 했다.하지만 두 interface가 같은 이름의 default method를 가지면 ..

    · 댓글
  4. Backend Development/Java

    Java - 06. inheritance and polymorphism

    equals를 override하면 hashCode도 해야 하는 이유 — 상속과 다형성의 계약해시맵에 객체를 넣었다. 같은 키로 조회했는데 null이 돌아온다. equals()로 비교하면 true인데. 원인은 hashCode()를 함께 override하지 않았기 때문이다.쉽게 말하면: HashMap은 객체를 넣을 때 hashCode()로 "몇 번 서랍에 넣을지"를 결정한다. 그런데 equals()는 "같은 사람이야"라고 하는데, hashCode()는 "다른 서랍 번호"를 돌려준다 — 서랍이 안 맞으니 찾을 수 없다. 이것이 equals와 hashCode의 계약 위반이다.이 현상은 다형성(polymorphism)과 동적 디스패치(dynamic dispatch)의 결과다. 이 글은 상속, override, O..

    · 댓글
  5. Backend Development/Java

    Java - 05. class and object

    private 필드에 public setter를 붙이면 캡슐화가 아니다 — 클래스 설계의 함정많은 Java 튜토리얼이 "캡슐화 = 필드를 private으로 하고 getter/setter를 만드는 것"이라고 가르친다. 이 설명은 틀렸다.생각해 보자: private int balance;에 public void setBalance(int b) { this.balance = b; }를 붙였다. 외부에서 balance = -1000000을 직접 못 할 뿐, setBalance(-1000000)으로 똑같이 음수 잔액을 만들 수 있다. 비밀번호를 자물쇠로 걸어두고 열쇠를 현관에 두는 것과 같다.진짜 캡슐화는 "객체가 자신의 상태를 스스로 보호하는 것"이다. 이 글은 클래스와 객체의 생성, 접근 제어, 생성자 설계를..

    · 댓글
  6. Backend Development/Java

    Java - 04. array and string

    String s = "ab"; s += "c";가 새 객체를 만드는 이유 — 불변 문자열과 배열의 세계웹 서버 로그를 조합하려고 루프 안에서 String message += line + "\n";을 실행했다. 데이터가 적을 때는 잘 돌아간다. 그러다 처리량이 늘어나면 GC 로그에 java.lang.String 객체가 폭발적으로 쌓이고, 결국 OutOfMemoryError가 발생한다. "문자열 더하기"가 왜 이런 결과를 부르는가?답은 단어 하나에 있다: String은 불변(immutable)이다. +=는 기존 문자열을 수정하지 않고 새 String 객체를 생성한다. (JLS §15.18.1) 이 글은 String의 불변성이 만드는 모든 결과 — String pool, StringBuilder, 성능, th..

    · 댓글