중첩 클래스중첩 클래스는 다른 클래스 내부에 정의된 클래스를 의미한다. 중첩 클래스를 사용하면 외부 클래스의 구현에 대한 세부 사항을 숨길 수 있어 캡슐화와 유지보수성을 향상시킬 수 있다. 하지만, 중첩 클래스의 사용에는 주의가 필요하며, 특히 정적 멤버 클래스는 성능과 메모리 관리 측면에서 더 유리한 경우가 많다.중첩 클래스의 종류중첩 클래스는 크게 다음과 네 가지로 나눌 수 있다:정적 멤버 클래스 (Static Nested Class)비정적 멤버 클래스 (Non-Static Nested Class)익명 클래스 (Anonymous Class)지역 클래스 (Local Class)1. 정적 멤버 클래스정적 멤버 클래스는 외부 클래스의 인스턴스에 종속되지 않으며, 독립적으로 인스턴스화될 수 있다. 이는 외부..
Programming Language/Java
태그달린 클래스는 여러 가지 의미를 하나의 클래스에 결합시키고, 해당 의미를 태그로 구분하여 표현하는 방식이다. 그러나 이는 여러 단점이 있으며, 클래스 계층구조를 활용하는 것이 더 효과적인 방법이다. 아래에서는 태그달린 클래스의 문제점과 이를 개선하기 위한 클래스 계층구조를 활용한 방법을 설명한다.태그달린 클래스태그달린 클래스는 여러 가지 의미를 하나의 클래스에서 표현하고, 해당 의미를 enum이나 tag로 구분하여 사용한다. 이때 주로 switch 문이나 조건문을 사용하여 각기 다른 동작을 구현하게 된다.예시: 태그달린 클래스// 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽)class Figure { enum Shape { RECTANGLE, CIRCL..
Interface인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 인터페이스는 해당 클래스를 사용하는 클라이언트가 클래스의 구현이 아닌, 정의된 메서드를 통해서만 객체와 상호작용할 수 있게 만든다.클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 알려주는 것이다. 인터페이스는 기능을 정의하는 것이 아니라 타입을 정의하는 용도로만 사용해야 한다. 즉, 인터페이스는 구현이 아닌 계약(contract)을 정의하는데 사용된다.상수 인터페이스상수 인터페이스는 메서드 없이, 오직 static final 필드만 포함된 인터페이스를 말한다. 이는 잘못된 사용 사례에 해당하며, Java에서는 상수를 정의할 때 인터페이스를 사용하는 것을..
자바에서는 상속과 구현을 통해 객체 지향적인 관계를 정의한다. 그 중에서도 인터페이스와 추상 클래스는 서로 다른 목적과 장점을 가지고 있다. 이 아이템에서는 추상 클래스보다 인터페이스를 우선적으로 사용해야 하는 이유와 그 활용 방안에 대해 다룬다.자바 다중 구현 메커니즘자바에서는 추상 클래스와 인터페이스를 사용하여 다중 구현을 처리할 수 있다. 이들 각각의 특징은 다음과 같다.추상 클래스다중 상속 불가능: 자바는 다중 상속을 지원하지 않기 때문에, 하나의 클래스만 상속할 수 있다. 이는 상위-하위 클래스 관계에서만 사용되며, 구현을 제공할 수 있다.상속 관계: 추상 클래스는 상위-하위 클래스 관계로 설계되어, 공통적인 동작을 상속받아 구현할 수 있다.제약: 추상 클래스는 구현체가 하나만 존재하고, 상속을..
상속은 객체 지향 프로그래밍에서 코드 재사용을 위한 강력한 수단으로 여겨지지만, 항상 최선의 선택은 아니다. 특히 잘못 사용하면 시스템에 오류를 일으킬 수 있는 위험이 있다. 이 아이템은 상속 대신 컴포지션(Composition) 을 사용해야 하는 이유와 그 장점에 대해 설명한다.상속의 문제점상속은 코드 재사용을 촉진할 수 있지만, 잘못 사용하면 캡슐화를 깨뜨리게 된다. 이는 클래스 간의 관계가 너무 강하게 결합되어, 상위 클래스의 구현이 변경될 때 하위 클래스에 예기치 않은 영향을 미칠 수 있다는 뜻이다. 특히, 상위 클래스의 구현 세부 사항에 의존하게 되면, 하위 클래스의 동작이 예기치 않게 변할 수 있다.상속의 예시와 문제예를 들어, HashSet을 상속받아 원소의 개수를 추적하는 Instrumen..
불변 클래스란 무엇인가?불변 클래스는 그 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 불변 클래스의 주된 특징은 객체를 한 번 생성한 후 상태가 변경되지 않으며, 이를 통해 객체를 보다 안전하게 공유할 수 있다.대표적인 불변 클래스 예시불변 클래스의 대표적인 예시는 다음과 같다:String: 문자열은 불변 객체로, 한 번 생성된 후 그 값이 변경되지 않는다.Boxing Class: Integer, Double 등의 래퍼 클래스는 불변이다.BigInteger, BigDecimal: 이 클래스들은 고정된 값을 갖고 있으며, 값을 변경하려면 새로운 인스턴스를 생성해야 한다.불변 클래스 규칙불변 클래스를 설계할 때 따를 수 있는 규칙은 다음과 같다:1. 객체의 상태를 변경하는 메서드를 제공하지 않는..
캡슐화의 이점을 제공하지 못하는 클래스public 클래스에서 데이터를 직접 필드로 노출시키면 캡슐화의 이점을 제공하지 못하게 된다. 아래와 같은 경우가 대표적이다.class Point { public double x; public double y;}이러한 클래스에는 몇 가지 문제가 있다:내부 표현을 유연하게 변경할 수 없다: 데이터 필드가 공개되어 있어 내부 구현을 수정할 때 API도 함께 수정해야 한다.불변식을 보장할 수 없다: 외부에서 필드를 직접 수정할 수 있어 객체의 일관성을 유지하기 어렵다.필드 접근 시 부수작업을 수행할 수 없다: 필드에 접근할 때 추가적인 로직(검증, 로그 기록 등)을 수행할 수 없다.객체 지향 방식으로 캡슐화한 클래스위 문제를 해결하려면 필드를 모두 private..
자바에서 클래스와 멤버의 접근 권한을 적절히 설정하는 것은 시스템의 유지 보수성과 확장성을 높이며, 보안성을 강화하는 데 중요한 역할을 한다. 이 원칙은 캡슐화(encapsulation)와 밀접하게 연관되어 있으며, 내부 구현을 숨기고 외부에 필요한 인터페이스만 공개하는 방식으로 시스템 설계를 한다.캡슐화의 장점시스템 개발 속도 향상: 내부 구현이 숨겨지므로, 외부에 영향을 주지 않고 자유롭게 수정 가능.시스템 관리 비용 절감: 내부 구현의 변경이 외부에 미치는 영향을 최소화하여 관리가 용이해진다.성능 최적화: 컴포넌트 간 상호작용이 제한되므로 성능 최적화가 가능하다.재사용성 향상: 다른 시스템에서 재사용할 때, 내부 구현을 알 필요 없이 인터페이스만 사용하면 되므로 재사용성이 높아진다.접근 제어 매커니..
Comparable 인터페이스란?compareTo는 Object의 메서드가 아니지만, 동작의 성격은 두 가지만 빼면 Object의 equals와 유사하다.compareTo는 단순 동치성 비교를 넘어 순서까지 비교할 수 있으며, 제네릭 메서드이다.Comparable을 구현했다는 것은 해당 클래스의 인스턴스들이 자연적인 순서(natural order)를 가지고 있음을 의미한다.Comparable을 구현한 객체들은 손쉽게 정렬할 수 있다.예제 코드public class WordList { public static void main(String[] args){ Set s = new TreeSet(); s.add("c"); s.add("b"); s.add("..
Cloneable은 객체를 복제할 수 있음을 명시하는 용도의 믹스인 인터페이스이다.믹스인 인터페이스: 객체 지향 프로그래밍 언어에서 믹스인은 다른 클래스의 부모 클래스가 되지 않으면서 해당 클래스에서 사용할 수 있는 메서드를 제공하는 클래스이다.Cloneable 인터페이스와 clone 메서드java.lang.Cloneable 인터페이스는 Object의 clone() 메서드가 지원되는지 여부를 결정한다. 일반적으로 인터페이스를 구현하는 것은 해당 클래스가 그 인터페이스에서 정의한 기능을 제공한다는 것을 의미하지만, Cloneable은 예외적인 경우로, 이 인터페이스는 상위 클래스에 정의된 메서드의 동작 방식을 변경하는 역할을 한다.다음은 Object 클래스에 정의된 clone() 메서드의 기본 형태이다:p..