가변인수 메서드가변인수?가변인자는 메서드의 매개변수를 동적으로 처리할 수 있도록 해준다.이를 사용하면 메서드 호출 시 전달되는 인자의 개수를 동적으로 변경할 수 있다.메서드를 호출하고자 할때 인수의 갯수가 가변적일 때 가변인수를 처리하면 손 쉽게 처리할 수 있다.public void exampleMethod(String... strings) { // 가변인자로 선언된 문자열 배열에 대한 처리 // strings는 문자열 배열로 처리됨}void sum(String... str) { for(String a:str) { System.out.println(a); }}가변인수 메서드를 호출하면, 가변인수를 담기 위한 배열이 자동으로 만들어진다.내부로 감춰야 했을 이 배열을 클라이..
추상 클래스, 인터페이스 비교공통점:타입을 정의하기 위한 다중 구현 메커니즘인스턴스 메소드(디폴트 메서드)를 구현 형태로 제공차이점:추상 클래스:추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스 > 새로운 타입 정의에 제약인터 페이스:어떤 클래스 타입에 있건 인터페이스를 정의한 클래스는 해당 인터페이스 타입 가능 취급 > 다중 상속 가능인터페이스 장점 : 기존 클래스도 인터페이스 타입이 될 수 있다.기존 클래스에도, 새로운 인터페이스를 구현하도록 하면 되기 때문에 기존 클래스도 인터페이스 타입이 될 수 있다.Comparable, Iterable, AutoCloeable 인터페이스가 새로 추가되었을 때, 자바의 수많은 기존 클래스가 해당 인터페이스들을 구현한 채 릴리즈 되었다..
상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야한다.@implSpec 사용 → 자바독 도구가 생성을 해줌public class ExtendableClass { /** * This method can be overridden to print any message * * @implSpec * Please use System.out.println(). */ protected void doSomething() { System.out.println("hello"); } }문서로 남기는 것 말고도 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여 protected메서드 형태로 공개해야 할 수도 있다• 훅 : hook: 클래스의 내부 동작 과정 중간에 끼어들 ..
상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다상속은 캡슐화를 깨트리게 된다내부구현이 노출된다하위 클래스가 상위 클래스에 강하게 의존 및 결합이 되는 설계이다메서드 호출과 달리 상속은 캡슐화를 깨뜨린다.캡슐화 : 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.문제 1. 상위 클래스가 어떻게 구현되느냐에 따라 하위클래스의 동작에 이상이 생길 수 있다문제 2. 다음 릴리스에서 상위 클래스에 새로운 메서드를 추가한다면?하위 클래스에서 재정의하지 못한 그 새로운 메서드를 사용해 허용되지 않은 원소를 추가할 수 있다문제 1 예시public class InstrumentedHashSet extends HashSet ..
불변클래스란?인스턴스의 내부 값을 수정할 수 없는 클래스불변클래스 예시 → String, 박싱 클래스, BigInterger, BigDecimal가변클래스보다 설계하고 구현하고 사용하기 쉽다오류가 생길 여지가 적고 안전하다클래스를 불변으로 만드는 5가지 규칙객체의 상태를 변경하는 메서드를 제공하지 않는다setter가 존재하지 않아야한다클래스를 확장할 수 없도록 한다class의 선언을 final로 선언하는 방법 존재생성자를 private으로 막아 상속을 막는다**> 정적 팩토리 메서드 사용**모든필드를 private로 선언한다시스템이 강제하는 수단을 이용해서 설계자의 의도를 명확히 드러내도록 한다.모든필드를 final로 선언한다클라이언트에서 직접 접근해 수정하는 것을 막아준다.public final로 선언..
안좋은 클래스 예시class Point{ public double x; public double y;}package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우캡슐화의 이점제공 xAPI를 수정하지 않고는 내부 표현을 바꿀 수 없다불변식을 보장하지 않는다접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.public class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public void setX(int x) {..
정보 은닉(캡슐화)이란?내부의 데이터와 구현을 외부로 부터 숨기는 것→ 이를 통해, A는 자신의 역할만 잘 수행하도록 하고, A를 사용하는 B는 A가 내부적으로 어떻게 수행되는지에는 알 필요가 없다정보은닉의 장점시스템 개발속도 향상 → 여러 컴포넌트를 병렬로 개발시스템 관리비용을 낮춘다. → 각 컴포넌트를 빨리 디버깅가능, 교체 용이정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움 → 다른 컴포넌트에 영향을 주지않고 특정 컴포넌트만 최적화 가능소프트웨어 재사용성 향상 → 의존성 없다면 다른곳에서 재사용 가능큰 시스템 제작 난이도 낮춘다 → 개별 컴포넌트 동작 검증 가능클래스와 인터페이스의 접근 제한자 사용 원칙모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다.톱레벨 클래스와 인터페이스에..
정적 팩터리와 생성자로 객체생성시 매개변수가 많을때 대응이 어렵다는 제약이 있다.이런 상황에는 점증척 생성자 패턴(telescoping constructor pattern)으로 매개변수에 대응되는 생성자를 늘려가는 방식으로 대응점증척 생성자 패턴(telescoping constructor pattern)이란?생성자를 필수 매개변수 1개만 받는 생성자, 필수 매개변수 1개와 선택 매개변수 1개를 받는 생성자, 선택 매개변수 2개를 받는 생성자 등에 형태로 매개변수 개수만큼 생성자를 늘리는 방식public class NutritionFacts { private final int servingSize; // (ml, 1회 제공량) 필수 private final int servings; ..
일반적인 인스턴스 생성 방법은 public 생성자다.정적 팩터리 메서드(static factory method) 로도 클래스 인스턴스를 생성 할 수 있다.정적 팩터리 메서드란?객체 생성을 흔히 사용하는 생성자가 아닌 정적(static) 메서드로 객체를 생성하는 메서드정적 팩터리 메서드의 장점1. 이름을 가질 수 있다.일반적으로 생성자의 경우 객체를 생성할 때, 반활될 객체의 특성을 설명할 수 없다. → 이름을 따로 못가지기 때문에ex)public class ExampleCalendar { private int year; private int month;}public static void main(String[] args) { // 생성자로 객체를 생성 ExampleCalendar calendar ..