목록전체 글 (194)
개발 기록
# 멤버 클래스는 되도록 static으로 만들어라 중첩 클래스 : 다른 클래스 안에 정의된 클래스중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야한다. 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야한다.종류정적 멤버 클래스(비정적) 멤버 클래스익명 클래스지역 클래스1. 정적 멤버 클래스- 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버 에도 접근할 수 있음 (일반 클래스와의 차이점)- 일반 클래스처럼 독립적으로 동작할 수 있으며, 바깥 클래스의 인스턴스 없이도 생성 가능.- 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자.public class OuterClass { // private 멤버 private final..
## 21 인터페이스는 구현하는 쪽을 생각해 설계하라 ### 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다.1. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 '삽입' 될 뿐이다. - 디폴트 메서드 : 인터페이스에 있는 구현 메서드 (메서드 앞에 default 예약어. 구현부 {} 가 있다.)- - 기본 메서드는 이미 구현되어 있기 때문에 호출하여 사용할 수 있다.public interface MyInterface { // 추상 메서드 void abstractMethod(); // 기본 메서드 default void defaultMethod() { // 기본 구현 코드 System.out.println("This..
(18) 상속보다는 컴포지션을 사용하라 - 여기서 말하는 상속은 인터페이스 상속이 아닌 (클래스가 다른 클래스를 확장하는) 구현 상속을 말함- 구현 상속 (서브클래싱): 코드를 재사용하기 위해 부모 클래스를 상속받는 것.부모 클래스의 기능을 그대로 물려받아 재사용하거나, 필요한 부분만 수정하여 사용하는 방식- 인터페이스 상속 (서브타이핑): 다형성을 위해 부모 클래스와 자식 클래스가 동일한 인터페이스를 공유하도록 하는 것.부모 클래스에서 정의된 메서드를 자식 클래스가 반드시 구현 ### 상속의 문제점1. 캡슐화를 해친다.- 상위 클래스의 구현이 바뀌면 하위 클래스의 동작에 이상이 생길수 있다.- self-use 패턴 ( 한 메소드가 같은 클래스 내의 다른 메서드를 사용하는 패턴 ) 사용시,- 상위 ..
(15) 클래스와 멤버의 접근권한을 최소화해라 - 정보은닉 : 소프트웨어에서 사용하는 객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법 ### 정보은닉의 장점1. 시스템 개발 속도를 높인다. (병렬 개발 가능)- 정보은닉을 위해 인터페이스를 설계하게 되면 , 인터페이스를 사용하는 쪽, 구현하는 쪽 동시에 개발 진행 가능.내부 로직이 없어도 메서드 자체를 호출 가능하기 때문에 개발 가능. 2. 시스템 관리 비용을 낮춘다.- 인터페이스를 통해 각 컴포넌트를 더 빨리 파악할 수 있다. 다른 컴포넌트로 교체하는 부담도 적다. 3. 성능 최적화에 도움을 준다.- 정보은닉 자체가 성능에 도움이 되는 것은 아니고, 다른 컴포넌트에 영향을 주지 않고 특정 컴포넌트만 최적화 가능하다. 4. 소프트웨어 재사용성을 ..
(12) toString을 항상 재정의하라 [toString의 일반 규약]- 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야한다- 모든 하위 클래스에서 이 메서드를 재정의하라 [호출]-println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 사용됨-> toString을 제대로 재정의하지 않으면 쓸모없는 메시지만 로그에 남을 것이다. [메서드 구현시 고려사항]1. 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다.-- 그렇지 않았을 때의 문제점 : 왜 실패 했는지 알 수 없음Assertion failure: expected {abc, 123}, but was {abc, 123}.// 단언 실패: 예상값 {abc, 123},..
(11) equals를 재정의하려거든 hashCode도 재정의하라- 재정의 하지 않으면 hashCode 일반 규약을 어기게 되어 HashMap 같은 컬렉션의 원소로 사용할 때 문제가 발생함. - Object 명세 규약-- equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 같은 값을 반환해야 한다.-- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.-- equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 ..
(7) 다 쓴 객체 참조를 해제하라 가비지 컬렉터가 있더라도 메모리 관리에 신경써야 함! *메모리 누수* 가비지 컬렉션 언어에서는 메모리 누수를 찾기가 어려움.객체 참조를 하나 살려두면 그 객체 + 그 객체가 참조하는 모든 객체 +.. 를 회수 하지 못 함. 해법! 1. 해당 참조를 다 썼을 때 null 처리 (참조 해제)**예외적인 경우에 사용 : 자기 메모리를 직접 관리하는 클래스일때ex. 스택 클래스에서 pop 메서드를 제대로 구현 (꺼낸 객체는 참조가 더 이상 필요 없음)public Object pop() { if (size = 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = nul..
(6) 불필요한 객체 생성을 피하라 1. String s = new String("bikini"); -> String s = "bikini";- new String 은 실행될 때 마다 String 인스턴스를 새로 만든다.- 개선된 코드는 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용함.- jvm에서는 문자열을 캐싱한다.자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다. name1과 name2 변수가 동일한 문자열 리터럴을 참조할 경우 name1과 name2는 동일한 String 객체를 참조하게 된다출처: https://woonys.tistory.com/221 [WOONY's 인사이트:티스토리]Java의 Heap에는 String Pool 이라는 특별한 영역에서 ..