계승을 위한 설계와 문서를 갖추지 않은 '이질적(foreign)' 클래스의 하위 클래스를 만들 때 생기는 문제점을 설명하고 있다. 그렇다면 계승을 위한 설계와 문서를 갖춘다는 것은 어떤 의미일까? 상속을 위한 문서에는 재정의 가능 메서드를 내부적으로 어떻게 사용하는지(self-use) 반드시 문서에 남기라는 것이다. public이나 protected로 선언된 모든 메서드와 생성자에 대해, 어떤 재정의 가능 메서드를 어떤 순서로 호출되는지, 그리고 호출 결과가 추후 어떤 영향을 미치는지 문서로 남기라는 것이다. 클래스 내부 동작에 개입할 수 있는 훅(hooks)을 신중하게 고른 protected 메서드 형태로 제공해야 한다. protected 멤버 개수는 가능한 줄여야 한다. 너무 적으면 상속해서 쓰기에 ..
계승은 코드 재사용을 돕는 강력한 도구지만, 항상 최선이라고는 할 수 없다. 계승은 상위 클래스와 하위 클래스 구현을 같은 프로그래머가 통제하는 단일 패키지 안에서 사용하면 안전하다. 이번 절에서 다루는 문제는 '인터페이스 계승' 에는 적용되지 않는다. 어떤 클래스가 다른 인터페이스를 'implement' 하거나, 어떤 인터페이스가 다른 인터페이스를 'extends' 하는 경우에는 해당되지 않는다. 메서드 호출과 달리, 계승은 캡슐화(encapsulation) 원칙을 위반한다. 상위 클래스의 구현은 릴리즈가 거듭될수록 변경되는데 하위 클래스는 수정된 적이 없어도 망가질 수 있다. public class InstrumentedHashSet extends HashSet { private int addCoun..
변경 불가능(immutable) 클래스는 그 객체를 수정할 수 없는 클래스다. 객체 내부의 정보는 객체가 생성될 때 주어진 것이며, 객체가 살아 있는 동안 그대로 보존된다. 자바 플랫폼 라이브러리에는 이런 클래스가 많다. String, 기본 자료형 클래스, BigInteger, BigDecimal 등이 그런 클래스다. 변경 불가능 클래스를 만드는 이유는 단순하다. 우선 변경 불가능 클래스는 변경 가능 클래스보다 설계하기 쉽고, 구현하기 쉬우며, 사용하기도 쉽다. 오류 가능성도 적고, 더 안전하다. 변경 불가능 클래스를 만들 때는 아래의 다섯 규칙을 따르면 된다. 1. 객체 상태를 변경하는 메서드(setter)를 제공하지 않는다. 2. 계승할 수 없도록 한다. 계승을 금지하려면 보통 클래스를 final로 ..
// 이런 클래스는 절대로 public으로 선언하지 말것 class Point { public double x; public double y; } 때때로, 아무 기능도 없는 클래스를 만들고 싶어 질 때가 있다. 하지만 이런 클래스는 데이터 필드를 직접 조작할 수 있어서 캡슐화의 이점을 누릴 수가 없다. API를 변경하지 않고서는 내부 표현을 변경할 수 없고, 불편식도 강제할 수 없고, 필드를 사용하는 순간에 어떤 동작이 실행되도록 만들 수도 없다. 객체지향 개념에 충실하고자 하는 프로그래머에게 이런 클래스는 최악이다. private필드와 public 접근자 메서드(getter/setter)를 제공해야 할 것이다. public 클래스 즉 선언된 패키지 밖에서도 사용 가능한 클래스에서는 접근자 메서드를 제공..
잘 설계된 모듈은 구현 세부사항을 전부 API 뒤쪽에 감춘다. 내부적으로 무슨 짓을 하는지는 신경 쓰지 않는다. 이 개념은 정보은닉(information hiding) 또는 캡슐화(encapsulation)라는 용어로 알려져 있으며, 소프트웨어 설계의 기본 원칙 가운데 하나다. 정보은닉이 좋은 성능을 보장하는 건 아니지만 성능 문제를 일으키는지 프로파일링 하는데 용의 하다. 또한 병행 개발이 가능하며, 다른 코드에 영향 없이 디버깅이나 성능 튜닝을 할 수 있다. 각 클래스와 멤버는 가능한 한 접근 불가능하도록 만들어라. 다시 말해서 정상적인 동작을 보증하는 한도 내에서 가장 낮은 접근 권한을 설정하라는 것이다. 클래스 접근 권한자 package-private(default) public을 붙이지 않으면 ..
compareTo 메서드는 Object에 선언되어 있지 않다. 사실 이 메서드는 Comparable 인터페이스에 포함된 유일한 메서드다. Object의 equals 메서드와 특성은 비슷하지만, 단순한 동치성 검사 이외에 순서 비교가 가능하다. Comparble을 구현한 클래스는 다양한 제네릭 알고리즘 및 컬랙션 구현체와 상호 연동이 가능하다. Comparable 인터페이스를 구현하는 클래스의 객체들은 자연적 순서(natural ordering)를 갖게 된다. compareTo 메서드의 일반 규약은 equals와 비슷하다. 객체의 값이 인자로 주어진 객체보다 작으면 음수를, 같으면 0을, 크면 양수를 반환한다. sgn(expression)은 수학에서의 signum 함수를 나타내는 것으로, -1, 0, 1 ..
Cloneable은 어떤 객체가 복제(clone)를 허용한다는 사실을 알리는 데 쓰려고 고안된 믹스인(mixin) 인터페이스다. 기본적인 문제는 이 인터페이스에는 clone 메서드가 없으며, Object의 clone 메서드는 protected로 선언되어 있다는 것이다. Cloneable 인터페이스에 아무런 메서드도 없다면 대체 Cloneable이 하는 일은 무엇인가? protected로 선언된 Object의 clone 메서드가 어떻게 동작할지 정한다. 만일 어떤 클래스가 Cloneable을 구현하면, Object의 clone 메서드는 해당 객체를 필드 단위로 복사한 객체를 반환한다. Cloneable을 구현하지 않은 클래스라면 clone 메서드는 CloneNotSupportedException을 던진다...
지난 포스팅에 GC(Garbage Collection) 기본에 대해 알아보았다. GC는 크게 Minor GC, Major GC 두 가지 타입으로 나눈다. 이 두 가지 GC가 어떻게 상호 작용하느냐에 따라서 GC 방식에 차이가 나며, 성능에도 영향을 준다. GC 방식 WAS나 자바 애플리케이션 수행 시 옵션을 지정하여 선택할 수 있으며, GC 방식에 따라 처리 절차가 달라지므로 어떤 GC 방식이 있는지 살펴보자. 우선 JDK7을 기준으로 5가지 방식이 있다. 여기 명시된 다섯 가지의 GC 방식은 WAS나 자바 애플리케이션 수행 시 옵션을 지정하여 선택할 수 있다. Serial GC Parallel GC Paralled Old GC(Paralled Compaction GC) Concurrent Mark-Sw..
JAVA 프로그래밍을 한다면 JAVA에서 어떻게 메모리 동작하고 관리가 이루어지고 있는지 알 필요가 있다. JAVA는 백그라운드에서 자동으로 메모리 관리 기능을 제공한다. GC(Garbage Collection)는 백그라운드에서 사용되지 않는 객체를 정리하고 메모리를 확보한다. 따라서, JAVA 프로그래머는 사용하지 않는 객체를 파기하는 등의 문제로 신경 쓰지 않아도 된다. 그러나 이런 프로세스가 JAVA에서 자동으로 진행되는 경우에 그 행위는 보증되지 않는다. 그러므로 JAVA에서 메모리가 실제로 어떻게 동작하는지 아는 것이 중요하다. OutOfMemoryError가 나타나기 전에 높은 성능과 최적화된 애플리케이션을 작성할 수 있고, 문제가 발생하면 빠르게 메모리 누수를 찾을 수 있다. 먼저 JAVA에..
이번에 소개할 내용은 GC(Garbage Collection)가 HotSpot VM에서 작동하는 기본 사항을 설명한다. 프로그램의 성능을 생각하는 개발자라면 GC(Garbage Collection)가 어떻게 처리되는지 기본 지식을 갖고 있어야 한다. GC(Garbage Collection)에 대해서 반드시 암기하고 숙지해야 자바 개발을 할 수 있는 것은 아니다. 자신이 만든 자바 프로그램의 성능을 생각하는 프로그래머라면, GC(Garbage Collection)가 어떻게 처리되는지 기본 지식을 갖고 있는 것이 좋다. GC(Garbage Collection)에 관심을 갖고 관련 내용을 찾을 정도면 프로그래머로써의 한 단계 레벨업을 꿈꾸시는 분들로 생각된다. 우선 JAVA 메모리 스택&힙 영역에 대해 기본적..
- Tomcat
- 리액트
- 프로그래머
- sort algorithm
- 경력관리
- Collection
- SQL
- 회고
- React
- spring
- 자바스크립트
- 이직
- 개발환경
- 성능분석
- 리액트 16
- 오라클 내장 함수
- 제주도 여행
- 제주도 3박4일 일정
- Linux 명령어
- 리눅스 명령어
- Eclipse
- 정렬 알고리즘
- 오라클
- effective java
- 자바
- Maven
- 프로그래머스
- javascript
- Java
- 소프트웨어공학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |