일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 티스토리챌린지
- 체크인미팅
- 백엔드개발자
- UNICON2023
- 42서울
- 오블완
- 도커
- 프롬프트엔지니어링
- 인프라
- 생활코딩
- openAI API
- 전국대학생게임개발동아리연합회
- Route53
- 라피신
- 캡스톤디자인프로젝트
- UNIDEV
- 스프링부트
- Redis
- bastion host
- UNICON
- 프리티어
- Spring boot
- 프로그래밍
- CICD
- EC2
- spring ai
- AWS
- 개발공부
- 게임개발동아리
- NAT gateway
- Today
- Total
목록Study/Java (10)
Hyun's Wonderwall
11장: 동시성아이템 82. 스레드 안전성 수준을 문서화하라'한 메서드를 여러 스레드가 동시에 호출할 때 그 메서드가 어떻게 동작하느냐': 해당 클래스의 클라이언트에게 중요한 정보. 가정해서 사용했다가 틀리면 심각한 오류로 이어짐.모든 클래스가 자신의 스레드 안전성 정보를 명확히 문서화해야 한다.synchronized 한정자는 문서화와 관련X ( 'API 문서에 synchronized 한정자가 보이는 메서드는 스레드 안전하다?' -> X. javadoc이 기본 옵션에서 생성한 API문서에는 synchronized 한정자가 포함되지 않는다. 메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않아, 따라서 이것만으로 메서드가 스레드 안전하다고 믿기 어렵다.) 멀티스레드..
9장: 일반적인 프로그래밍 원칙아이템 64. 객체는 인터페이스를 사용해 참조하라인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해질 수 있다. 나중에 구현 클래스를 교체하기 쉬움.- 구현 타입을 바꾸려 하는 동기는? 새 구현 타입이 원래 것보다 성능이 좋거나 신기능을 제공...적합한 인터페이스가 없다면 (당연히 클래스로 참조해야 하는 상황) -> 클래스의 계층구조 중 필요한 기능을 만족하는 가장 상위의 클래스를 타입으로 사용하자. 아이템 65. 리플렉션보다는 인터페이스를 사용하라리플렉션 기능을 이용하면 프로그램에서 임의의 클래스에 접근 가능. 컴파일 당시 존재하지 않던 클래스도 이용할 수 있다.- (단점: 컴파일타임 타입 검사 이점 누릴 수 x, 코드가 지저분하고 장황해짐, 성능 떨어짐..
8장 메서드아이템 55. 옵셔널 반환은 신중히 하라감나옵셔널은 예외 검사와 취지가 비슷. 결과가 없을 수 있으며, 클라이언트가 이 상황을 특별하게 처리해야 할 때 사용한다.반환값 이외의 용도로 쓰는 경우는 드물다.Stream>. Optional의 stream().컨테이너 타입은 옵셔널로 감싸면 안 된다. 빈 List를 반환하는 게 좋다.옵셔널 반환에는 성능 저하가 뒤따라, 성능에 민감한 메서드라면 null을 반환하거나 예외를 던지는 게 나을 수 있다.아이템 56. 공개된 API 요소에는 항상 문서화 주석을 작성하라API를 올바르게 문서화하려면 공개된 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 ㅏㄷㄹ아야 한다.메서드용 문서화 주석: 해당 메서드와 클라이언트 사이의 규약을 명료히 기술요약..
7장 람다와 스트림아이템 46. 스트림에서는 부작용 없는 함수를 사용하라스트림 패러다임의 핵심: 계산을 일련의 변환으로 재구성.- 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다. - 순수 함수: 오직 입력만이 결과에 영향을 주는 함수. 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 x - 이렇게 하려면 스트림 연산에 건네지는 함수 객체가 모두 side effect이 없어야 한다.forEach 연산은 스트림 계산 결과를 보고할 때만 사용하고, 계산 자체에 쓰지 말자.- collect: 축소 전략을 캡슐화한 블랙박스 객체. 스트림의 원소들을 객체 하나에 취합함. 수집기가 생성하는 객체는 일반적으로 컬렉션.- 수집기를 사용하면 스트림의 원소를 손..
6장 열거 타입과 애너테이션 (2/2)아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라EnumMap: 열거 타입을 키로 사용하도록 설계한 아주 빠른 맵 구현체- 내부에서 배열을 사용해 빠름..- EnumMap의 생성자가 받는 키 타입의 Class 객체는 한정적 타입 토큰. 런타임 제네릭 타입 정보를 제공.Map> plantsByLifeCycle = new EnumMap(LifeCycle.class); for (LifeCycle lc : LifeCycle.values()) { plantsByLifeCycle.put(lc, new HashSet()); // 빈 Set 초기화 } for (Plant p : garden) { ..
5장 제네릭 (2/2)아이템 28. 배열보다는 리스트를 사용하라배열와 제네릭 타입의 중요한 차이 2가지: 1. 배열은 공변이다. 2. 배열은 실체화된다. 1. 배열은 공변이다. - 배열: 공변 (variant, 함께 변한다.) (예로 Sub가 Super의 하위 타입이라면 Sub[]는 Super[]의 하위 타입)- 제네릭: 불공변 (invariant) (예로 Type1과 Type2가 있을 때, List은 List의 하위 타입도 상위 타입도 아니다.- 배열에서는 타입호환이 안 되는 곳에 넣는 실수를 런타임에서 알게 되는데(->ArrayStoreException), 리스트는 컴파일할 때 알게 되어 더 타입 안전한 프로그래밍을 할 수 있다. 2. 배열은 실체화된다.- 배열은 런타임에도 자신이 담기로 한 원소의 ..

4장 클래스와 인터페이스 (2/2)아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라.상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 사용하는지(자기사용 패턴) 내부 구현 방식을 설명해 문서를 남겨야 한다.- @implSpec 태그 붙이면 javadoc이 Implementation Requirements 생성해준다 (메서드의 내부 동작 방식 설명.) 효율적인 하위 클래스를 만들 수 있도록 (클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅을 잘 선별하여) 일수 메서드를 protected로 제공해야 할 수도 있다. (드물게는 protected 필드도) 문서화한 것은 그 클래스가 쓰이는 한 반드시 지켜야 한다. 그러지 않으면 내부 구현 방식을 믿고 활용하던 하위..
3장 모든 객체의 공통 메서드아이템 10. equals는 일반 규약을 지켜 재정의하라equals 메서드는 기본적으로 클래스의 인스턴스가 오직 자기 자신과만 같도록 구현되어있다.- 꼭 필요한 경우가 아니면 equals를 재정의하지 않아도 된다.- equals 메서드를 재정의하지 않는 것이 좋은 경우 예시각 인스턴스가 본질적으로 고유 (ex. Thread)인스턴스의 논리적 동치성을 검사할 일이 없음 (ex. Pattern)상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞음클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없음equals를 재정의해야 할 때: 객체 식별성이 아니라 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 ..