일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바ORM표준JPA프로그래밍
- 딥러닝
- Hibernate
- 이펙티브자바
- Database
- DeepLearning
- 자료구조
- JPA
- MySQL
- Python
- 포인트클라우드
- 프로그래머스
- 자율주행
- 네트워크
- 자바
- 장애물인식
- Spring Batch
- 논문
- 파이썬
- Java
- 알고리즘
- 운영체제
- 논문리뷰
- 디자인패턴
- 아두이노
- Jetson
- 배달로봇
- persistance context
- 영속성컨텍스트
- cartograhper
- Today
- Total
목록이펙티브자바 (13)
제리 devlog
중첩 클래스 중첩 클래스 : 다른 클래스 안에 정의된 클래스를 말함. 중첩 클래스는 자신을 감싼 클래스에서만 사용되어야 한다. 만약 다른 쓰임새가 있다면 톱 레벨 클래스로 만들어야 함. public class A { private class B{ ... } } 중첩 클래스의 종류 : 정적 맴버 클래스, (비정적) 맴버 클래스, 익명 클래스, 지역 클래스 정적 맴버 클래스를 제외한 나머지는 내부 클래스에 해당됨. 정적 맴버 클래스 //정적 맴버 클래스 public class A { private static class B{ ... } } 특징 1. 정적 맴버 클래스는 다른 클래스 안에 선언되고 바깥 클래스의 private맴버에도 접근 할 수 있다는 점을 제외하면 일반 클래스와 같다. 2. 정적 맴버 클래스..
인터페이스 : 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 전달하는 것이다. 인터페이스는 오직 이 용도로만 사용해야한다. 인터페이스를 잘못 사용한 예 )상수 인터 페이스 상수 인터페이스란 메서드 없이 static final 필드로만 가득한 인터페이스를 말한다. 클래스에 정규화된 이름을 쓰는걸 피하고자 종종 사용한다고함 public interface PhysicalConstants { //아보가도르 수(1/몰) static final double AVOGADROS_NUMBER = 6.002_140_857e23; //_기호는 숫자 리터럴의 값에는 영향을 주지않고 읽기는 훨씬 간편하게 해줌 //볼츠만 상수 (J/K) static final double BO..
자바의 다중 구현 매커니즘 : 인터페이스, 추상 클래스 자바 8부터는 인터페이스도 default 메서드를 제공할 수 있다. 인터페이스 vs 추상 클래스 공통점 선언 내용은 존재하지만 구현 내용은 없다(추상 메서드를 갖는다) 인스턴스로 생성할 수 없다. 목적 인터페이스 : 함수의 껍데기만 존재해서 구현을 강제한다. 구현 객체가 같은 동작을 하도록 보장한다. Has - A 추상 클래스: 추상 클래스를 상속 받아 기능을 이용하고 추가시킨다. Is - A 다중 상속 인터페이스 : 여러개의 인터페이스를 구현할 수 있다. 추상 클래스 : 여러 클래스를 상속 받을 수 없다. 책 본문 내용중 타입이라는 표현은 구현해야하는 메서드를 아울러 표현하는 것으로 이해했다. 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 ..
상속의 위험성 외부 클래스를 상속할 때의 위험성은 앞선 '상속보다 컴포지션을 사용하라'라는 게시글에서 다뤘다. 여기서 외부란 프로그래머 통제권 밖에 있어서 언제 어떻게 변경될지 모른다는 뜻이다. 예를 들어 Set, List같이 프로그래머가 직접 다루지 않는 클래스들을 말한다. 상속은 문서화를 요구한다. 메소드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야한다. 즉, 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야한다. 상속용 클래스에서 재정의 가능한 메서드는 어떻게 동작하는지 문서화해야할 필요가 있다. 만약, 재정의 가능한 메서드가 내부의 다른 재정의 가능한 메서드를 호출해서 사용하는 상황이라면 기능이 오동작 할 수 있다. 재정의 가능한 메서드는..
상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만든다. 여기서 말하는 상속이란 클래스와 클래스 간에 상속(구현 상속)을 말하며 인터페이스를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 상황과는 무관하다. 상속의 문제점 public class InstrumentedHashSet extends HashSet { //추가된 원소의 수 private int addCount = 0; public InstrumentedHashSet(int initCap, float loadFactor){ super(initCap, loadFactor); } @Override public boolean add(E e) { addCount++; return supe..
저자는 최적화를 최대한 지양하라고 한다. 최적화는 좋은 결과보다는 해로운 결과로 이어지기 쉽고, 섣불리 진행하면 특히 더 그렇다. 성능 때문에 견고한 구조를 희생시켜서는 안된다. 빠른 프로그램보다 좋은 프로그램을 작성해야한다. 좋은 프로그램은 정보 은닉 원칙을 따른다. 그렇기에 개별 구성요소의 내부를 독립적으로 설계할 수 있다. 시스템의 나머지에 영향을 주지않고도 각 요소를 다시 설계할 수 있는 것이다. *정보 은닉 : 캡슐화에서 가장 중요한 장점으로 다른 객체에게 자신을 숨기고 자신의 연산을 통해서만 접근하게한다. 객체의 정보를 직접 꺼내오지 않으므로 유지 보수에 용이해진다. ex) 객체의 필드 명이 바뀐경우 혹은 특정 로직이 바뀐 경우 객체의 값을 꺼내 처리한 부분을 모두 찾아 수정해야함 public..
객체는 클래스가 아닌 인터페이스로 참조하라. 이 말이 무슨 뜻일까? //좋은 예 Set set = new LinkedHashSet(); //나쁜 예 LinkedHashSet set = new LinkedHashSet(); 객체를 생성할 때 LinkedHashSet으로 객체를 만들지만 업캐스팅을 사용하고있다. 업캐스팅을 사용하게되면 상위 인터페이스에 있는 구현체를 사용할 수 있지만 LinkedHashSet만이 가진 메서드를 사용할 순 없다. 인터페이스가 갖는 유연성 더 나은 성능이나 신기능을 사용하기위해 원래 구현했던 타입을 변경하는 경우가 있다. //좋은 예 LinkedHashSet -> HashSet으로 구현체를 변경해도 코드가 변하지 않음 Set set = new HashSet(); set.add(...