4. 객체 생성을 막을 때는 private 생성자를 사용하라 정적 메소드나 필드를 모아놓고 사용하는 유틸리티 클래스의 경우는 객체를 만들 목적의 클래스가 아니다 - 대표적으로 java.lang.Math, java.util.Arrays, java.util.Collections 객체를 만들 생각이 없다고 생성자를 만들지 않으면.. 객체 생성을 막을 수 있는 것이 아니라 디폴트 생성자가 만들어진다. * 디폴트 생성자: 객체가 생성될 때 사용자가 초깃값을 명시하지 않으면 컴파일러가 자동으로 생성해주는 생성자 - NoArgsConstructor와 같음 클래스를 abstract로 추상 클래스로 만든다고 해도 소용없다. -> 하위 클래스를 정의하면 객체 생성이 가능해지기 때문. 그럼 어떻게? => private 생성..
3. private 생성자나 enum 자료형은 싱글톤 패턴을 따르도록 해라 (중요) 여기서의 싱글톤 패턴은 스프링 컨테이너에 의해 관리되는 싱글톤이 아니기에, 안티패턴의 문제점을 갖고있는 싱글톤임을 참고!! # 싱글톤 패턴이 안티패턴으로 불리는 이유 ========= 1. private 생성자를 갖고있어 상속 불가 2. 테스트 하기 어려움 (목 객체로 대체할 수 없음) 3. 객체지향의 의도와 전혀 맞지않음 => 위 문제점들은 스프링에서는 "스프링 컨테이너"의 활약으로 모두 해결된다 ========================================== 싱글톤은 생성자를 private로 선언해두고, 싱글톤 객체는 정적 팩토리 메서드( getInstance() )를 이용하거나, 정적 필드를 통해 얻어오..
2. 생성자 인자가 많을때는 빌더 패턴 생성자에 들어가는 파라미터 개수가 많을 경우 사용해볼만한 패턴은 다음과 같다 1. 점층적 생성자 패턴 - 필수 인자만 받는 생성자 하나 정의 - 그 이후부터 선택적 인자를 추가해가면서 생성자를 계속 쌓아나가는 방식 - 각 파라미터가 무슨 값인지 의미를 알기 어렵고, 자료형이 같은 인자들끼리 순서를 잘못 넣어 문제를 일으킬 가능성이 상당히 높다. 2. 자바빈 패턴 - 일단 인자 없는 생성자(NoArgsConstructor)를 호출해서 빈 객체를 만듬 - 그 다음에 setter 프로퍼티를 이용해서 값을 하나하나 채워주는 방식 - 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체의 일관성이 일시적으로 깨질 수 있다. - 변경 불가능(immutable)한 클래스를 ..
1. 생성자 대신 정적 팩토리 메서드를 사용할 수 없는지 생각해보자 일반적으로 클래스를 통해 객체를 만드는 것은 public으로 선언된 생성자(Constructor)로 이뤄진다. 하지만 이외에도 방법이 하나 더 있는데, 바로 public으로 선언된 정적 팩토리 메소드(static factory method)를 사용하는 것. 1. 이름이 있다. - 생성자 메서드의 이름은 클래스 이름으로 고정되기 때문에 이름 그 자체로 의미를 주기 어렵고, 생성자에 전달되는 파라미터만으로는 어떤 객체가 생성되는지를 설명할 수 없다. - 정적 팩토리 메서드는 이름만 잘 지으면 사용하기도 쉽고 코드의 가독성도 좋아진다. - 같은 시그니처(signature)를 갖는 생성자를 여러개 정의할 필요가 있을 때는 생성자를 사용하기보다는..
서적을 읽고 복습하기 위해 작성한 게시글입니다. # 에러의 종류 1. 컴파일 에러 - 컴파일 시에 발생하는 에러 2. 런타임 에러 - 실행 시에 발생하는 에러 3. 논리적 에러 - 실행은 잘 되는데 의도와 다르게 동작하는 에러 - 소스코드를 컴파일 하면 컴파일러가 소스코드에 대해 기본적인 검사를 수행하고 에러가 있는지를 확인해준다. - 오타, 잘못된 구문, 자료형 체크 등 기본적인 검사 수행. - 컴파일러는 실행 도중에 발생할 수 있는 잠재적인 오류까지 모두 잡아내지는 못한다. - 이왕 에러가 날거면 컴파일 에러가 최고의 에러 # 에러(Error)와 오류(Exception) 에러(Error) - 프로그램 코드에 의해 수습될 수 없는 심각한 오류 오류(Exception) - 프로그램 코드에 의해 수습될 수..
인터페이스는 다른 클래스를 작성하는데 도움을 줄 목적으로 사용되는 일종의 추상클래스라고 할 수 있다. 추상 클래스보다 추상화 정도가 높아 추상 메서드 이외에 일반 메서드나 멤버변수를 가질 수 없다. 오직 추상 메서드와 상수만을 가질 수 있다. - 모든 멤버변수는 public static final (상수)여야 하며, 이를 생략하면 컴파일러가 자동으로 붙여준다 - 모든 메서드는 public abstract (추상 메서드)여야 하며, 이를 생략하면 컴파일러가 자동으로 붙여준다. (예외: static 메소드와 default 메소드) 모든 메서드가 추상 메서드이기 때문에, 인터페이스를 구현하는 클래스는 해당 메서드를 반드시 구현(implements)하여 사용해야한다. - 예외적으로 default 메서드로 지정된..
# 추상 클래스란? 추상 클래스란, 완성되지 않은 메서드를 포함하고 있는 클래스를 뜻한다. 아직 미완성인 클래스이기 때문에 인스턴스를 생성할 수 없으며, 상속을 통해서 자손 클래스에 의해 완성될 수 있다. - 추상 클래스는 자손 클래스에게 어느정도 갖춰진 틀을 제공해줌으로써 효율적인 설계를 돕는다. - 클래스 앞에 'abstract' 키워드를 붙임으로써 추상 클래스임을 표시한다. - 추상 클래스는 추상 메서드를 포함하고 있다는 점을 제외하고는 일반 클래스와 동일하다. (멤버 변수와 메서드 역시 가질 수 있다.) * 추상 메서드가 없는 클래스에도 abstract를 붙여 추상 클래스로 만들 수 있다! -> 클래스의 인스턴스를 생성하지 못하게 하고 싶을 때 사용 * 왜 추상 클래스를 사용하는가? 추상화란, 기..
책을 읽고 개인적으로 복습하기 위해 작성한 게시글입니다. 1. 람다식이란? 람다식(Lambda Expression)은 메서드를 하나의 식(Expression)으로 표현한 것이다. - 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어진다 - 이때문에 람다식을 '익명 함수', '익명 객체'라고도 한다. 람다식의 의의는 람다식으로 인해 메서드를 변수처럼 다룰 수 있게 됐다는 것이다. - 기존에는 메서드를 사용하기 위해서는 클래스와 객체를 생성하고 나서야 메서드를 사용할 수 있었으나, 람다식은 람다식 그 자체만으로 메서드의 역할을 수행할 수 있다. 2. 람다식을 작성하는 방법 메서드에서 이름과 반환타입을 제거하고, 매개변수 선언부와 몸통 { } 사이에 화살표(->)를 추가하면 끝이다. * 리턴값이 존재..