베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • leetcode
    • 운영체제
    • 데이터베이스
    • 백준
    • Spring
    • 함수형인터페이스
    • C++
    • 토비스프링
    • 자바
    • 스프링시큐리티
    • BFS
    • 스프링
    • 스레드
    • java
    • 코드업
    • jpa
    • 자바8
    • dfs
    • 이펙티브자바
    • 알고리즘

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    개발서적/Effective Java

    [Effective Java] 태그 달린 클래스보다는 클래스 계층구조를 활용하라

    2023. 5. 25. 01:48

    태그 달린 클래스는 단점 한가득이다.

    1. 열거 타입 선언, 태그 필드, switch문 등 쓸데없는 코드가 많다.
    2. 여러 구현이 한 클래스에 혼합되어 있어서 가독성이 좋지 않다.
    3. 다른 의미를 위한 코드도 함께 하니 메모리도 많이 사용한다.
    4. 필드들을 final로 선언하려면 해당 의미에 쓰이지 않는 필드들까지 생성자에서 초기화해야 한다.
    5. 인스턴스 타입만으로는 현재 나타내는 의미를 알 길이 없다.
      => 태그 달린 클래스는 장황하고, 오류를 내기 쉽고, 비효율적이다.
    class Figure {
        enum Shape { RECTANGLE, CIRCLE };
        	
        final Shape shape;
        
        // 다음 필드들은 모양이 사각형일 때만 쓰인다
        double length;
        double width;
        
        // 이 필드는 모양이 원(Circle)일 떄만 쓰인다
        double radius;
    }

    클래스 계층구조를 활용하는 서브타이핑

    1. 계층구조의 루트가 될 추상 클래스를 정의하고, 태그 값에 따라 동작이 달라지는 메서드들을 루트 클래스의 추상 메서드로 선언한다. 동작이 일정한 메서드들은 일반 메서드로 추가한다.
    abstract class Figure {
        abstract double area();
    }
    1. 루트 클래스를 확장한 구체 클래스를 의미별로 하나씩 정의한다.
    class Circle extends Figure {
        final double radius;
    
        Circle(double radius) {
            this.radius = radius;
        }
    
        @Override double area() { return Math.PI * (radius * radius); }
    }

    클래스 계층구조를 활용하는 경우 다음과 같은 장점이 있다.

    1. 추상 메서드가 잘 구현이 되었는지 컴파일러가 체크해준다.
    2. 루트 클래스의 코드를 건드리지 않고 독립적으로 계층구조를 확장핳고 함께 사용할 수 있다.
    3. 타입 사이의 자연스러운 계층 관계를 반영할 수 있어 유연성과 컴파일타임 타입 검사 능력을 높여준다.
    class Square extends Rectangle {
        Square(double side) {
            super(side, side);
        }
    }
    저작자표시 비영리 변경금지 (새창열림)
      '개발서적/Effective Java' 카테고리의 다른 글
      • [Effective Java] raw 타입은 사용하지 말자
      • [Effective Java] 멤버 클래스는 되도록 static으로 만들라
      • [Effective Java] 인터페이스는 타입을 정의하는 용도로만 사용하라
      • [Effective Java] 인터페이스는 구현하는 쪽을 생각해 설계하라
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바