본문 바로가기

Programming/Java33

[이펙티브자바] 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라. 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라. 핵심정리 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 "삽입"될 뿐이다. 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. ex) Collection 클래스의 removeIf 디폴트 메서드 Collection 인터페이스를 구현한 synchronizedCollection 입장에서는 매우 위험 synchronizedCollection은 동기화를 통해서 한번에 오직 한 쓰레드만 해당 오퍼레이션을 실행해야 하는데, removeIf 메서드 내에는 동기화 관련 로직이 없기 때문에 안전하지 않은 접근이 됨 (CurrentModificationExcept.. 2023. 4. 2.
[이펙티브자바] 아이템18. 상속보다는 컴포지션을 사용하라. 아이템18. 상속보다는 컴포지션을 사용하라. 핵심정리 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 인터페이스 상속(implementation) 얘기가 아니라 구체적인 구현 상속에 한해서 상위 클래스에서 제공하는 메서드 구현이 바뀐다면... 상위 클래스에서 새로운 메서드가 생긴다면... 예시) HashSet의 addAll 메소드 내부 로직에서 add 메소드 호출하는 것을 알고 사용해야 함. -> 만약 addAll의 내부 구현이 바뀐다면 하위 클래스들의 로직도 바뀌어야 함 - 캡슐화 깨지는 것 super.addAll 호출 시, 내부적으로 상속하여 overriding add를 호출하여 count가 두 번 집계됨 상속을 받지 않고 위임한 composition에서는 sideEffect.. 2023. 3. 19.
[이펙티브자바] 아이템15. 클래스와 멤버의 접근 권한을 최소화하라 아이템15. 클래스와 멤버의 접근 권한을 최소화하라. 핵심정리1: 구현과 API를 분리하는 “정보 은닉”의 장점 (모듈화, 캡슐화) l 시스템 개발 속도를 높인다 (여러 컴포넌트를 병렬로 개발할 수 있기 때문) n 인터페이스 정의서를 바탕으로 서로 다른 모듈을 동시에 개발할 수 있음 l 시스템 관리 비용을 낮춘다 (컴포넌트를 더 빨리 파악할 수 있기 때문) n 인터페이스 위주로 코드를 살펴보면 코드 파악과 디버깅이 용이함 l 성능 최적화에 도움을 준다 (프로파일링을 통해 최적화할 컴포넌트를 찾고 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 개선할 수 있기 때문) n 성능의 병목 지점 파악이 용이함 (병목이 일어나는 컴포넌트만 개선하면 됨) l 소프트웨어 재사용성을 높인다 (독자적인 컴포넌트라면) l.. 2023. 3. 12.
[도서] 켄트 벡의 구현패턴 - 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 켄트 벡의 구현패턴 - 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 내용 정리 http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960770317 켄트 벡의 구현 패턴 - 교보문고 읽기 쉬운 코드를 작성하는 77가지 자바 코딩 비법 | [ 책 소개 ] 기능적으로 올바르게 동작한다고 해서 모두 훌륭한 코드는 아니다. 훌륭한 코드는 프로그래머의 의도를 일관되게 전달해서, 다른 www.kyobobook.co.kr 커뮤니케이션을 돕는 프로그래밍 기법 단계 생각을 하며 프로그래밍하는 것. 다른 사람들의 중요성을 인정하는 것. 다른 사람의 존재도 내 존재만큼 중요하다는 생각을 한 후 그러한 생각을 실천으로.. 2022. 2. 10.
main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업들 java.lang 패키지를 T 메모리의 스태틱 영역에 배치한다. import된 패키지를 T 메모리의 스태틱 영역에 배치한다. 프로그램 상의 모든 클래스를 T 메모리의 스태틱 영역에 배치한다. main() 스택 프레임이 stack frame 안에 할당 (스택 프레임의 각 메소드 영역은 여는 중괄호때 생성되고 닫는 중괄호를 만나면 소멸) 메서드의 인자 args를 저장할 변수 공간을 stack frame에 할당 main() 메서드 안의 첫 명령문 실행 main() 의 닫는 괄호 : main() 메서드 스택 프레임 소멸 -> T 메모리 소멸, JVM 기동 중지, JRE가 사용했던 시스템 자원을 운영체제에 반납 2021. 4. 25.
[whiteship 온라인 스터디] 15주차 과제: 람다식 github.com/whiteship/live-study/issues/1515주차 과제: 람다식 · Issue #15 · whiteship/live-study목표 자바의 람다식에 대해 학습하세요. 학습할 것 (필수) 람다식 사용법 함수형 인터페이스 Variable Capture 메소드, 생성자 레퍼런스 마감일시 2021년 3월 6일 토요일 오후 1시까지.github.com목표자바의 람다식에 대해 학습하세요.학습할 것 (필수)람다식 사용법함수형 인터페이스Variable Capture메소드, 생성자 레퍼런스0. 자바의 람다식?함수적 프로그래밍을 위해 자바8부터 람다식(Lambda Expressions) 지원람다식은 익명 함수(anonymous function)를 생성하기 위한 식. 객체 지향 언어보다는 함수.. 2021. 3. 4.
[whiteship 온라인 스터디] 13주차 과제: I/O github.com/whiteship/live-study/issues/13 13주차 과제: I/O · Issue #13 · whiteship/live-study 목표 자바의 Input과 Ontput에 대해 학습하세요. 학습할 것 (필수) 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream Byte와 Character 스트림 표준 스트림 (System.in, System.out, System github.com 목표 자바의 Input과 Ontput에 대해 학습하세요. 학습할 것 (필수) 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream B.. 2021. 2. 27.
[whiteship 온라인 스터디] 14주차 과제: 제네릭 github.com/whiteship/live-study/issues/14 14주차 과제: 제네릭 · Issue #14 · whiteship/live-study 목표 자바의 제네릭에 대해 학습하세요. 학습할 것 (필수) 제네릭 사용법 제네릭 주요 개념 (바운디드 타입, 와일드 카드) 제네릭 메소드 만들기 Erasure 마감일시 2021년 2월 27일 토요일 오후 1시까 github.com 목표 자바의 제네릭에 대해 학습하세요. 학습할 것 (필수) 제네릭 사용법 제네릭 주요 개념 (바운디드 타입, 와일드 카드) 제네릭 메소드 만들기 Erasure 0. 제네릭이란? 자바5에 추가된 기능. 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 됨. 타입 변환(casting)을 제거함. 제네릭 .. 2021. 2. 27.
[whiteship 온라인 스터디] 12주차 과제: 애노테이션 github.com/whiteship/live-study/issues/12 12주차 과제: 애노테이션 · Issue #12 · whiteship/live-study 목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 마감일시 2021년 2월 6일 토요일 오후 1시까지. github.com 목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 0. 애노테이션의 용도 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공 ex) @Override 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동.. 2021. 2. 25.