제네릭을 사용하면 타입을 컴파일러에 알려주고 컴파일러가 알아서 형변환 코드를 추가해 준다. 5장은 이런 제네릭을 사용할 때 주의사항과 팁을 알려준다. 용어 정리 제네릭 타입 제네릭 클래스/인터페이스 : 클래스와 인터페이스 선언에 타입 매개변수가 쓰인다. (List) 제네릭 클래스/인터페이스를 통틀어 제네릭 타입이라 한다. 매개변수화 타입 각 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 이름 (List) 로 타입 제네릭 타입을 하나 정의하면 로 타입도 함께 정의된다. 로 타입은 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. (List에서 List) 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작한다. (제네릭 없던 코드와 호환되기 위함) 한글 용어 영문 용어 예 매개변수..
4장은 클래스와 인터페이스를 사용할 때 주의할 점과 유용한 팁을 알려준다. 15. 클래스와 멤버 접근 권한 최소화 잘 설계된 컴포넌트는 내부 구현 정보를 완벽하게 숨겨, 구현과 API를 깔끔하게 분리한다. 다른 컴포넌트와 소통할 때에는 오직 API만 사용하고 서로의 내부 동작 방식은 알 필요가 없다. 이 개념은 정보 은닉 또는 캡슐화로, 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉 장점 정보 은닉을 잘 하면 컴포넌트들을 서로 분리해 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해준다. 여러 컴포넌트 병렬로 개발해 개발 속도 높임 컴포넌트 파악이 쉽고 교체 부담도 적어 시스템 관리 비용 낮춤 성능 최적화에 도움을 줌 소프트웨어 재사용성 높임 개별 컴포넌트 동작을 검증할 수 있..
3장은 모든 Object를 상속받는 객체가 공통적으로 가지는 equals와 hashcode, tostring과 같은 final이 아닌 메서드를 구현할 때 주의할 점에 대해 다룬다. 10. equals 재정의 java에서는 객체 식별성을 확인해 동치성을 확인한다. 이때 논리적인 동치성을 확인해야 할 때 equals를 재정의해야 한다. equals를 재정의하지 않는 상황 각 인스턴스가 본질적으로 고유할 때 동작하는 개체를 표현하는 클래스 (Thread) 인스턴스의 논리적 동치성을 검사할 일이 없을 때 상위 클래스에서 재정의한 equals가 하위 클래스에 딱 맞을 때 대부분의 Set 구현체 : AbstractSet이 구현한 equals를 상속받아 사용 클래스가 private, package-private이고 ..
이전부터 이펙티브 자바 책을 보고 싶었는데, 2월 한 달 동안 이 책을 보려고 한다. 원래는 클린 코드를 마저 보려고 했으나 자바를 깊이 있게 이해하고, 공부한 후에 클린 코드 책을 보는 것이 더 도움이 될 것 같아 이펙티브 자바를 먼저 보게 되었다. 그동안 깊게 생각하지 않고 권장되는 방법으로 사용하던 것들도 있고, 지양해야 하는 방법을 사용한 적도 있다. 앞으로 짜게 될 코드들은 모두 이유가 있는 코드들이길 바란다. 2장은 객체를 생성하고 파괴하면서 주의해야 할 점들에 관한 내용이다. 객체를 어떻게 생성하는지, 어떤 객체를 생성해야 하는지, 파괴를 언제 어떻게 하는지 등과 같이 알고 사용하면 너무 좋은 내용들로 구성되어 있었다. 싱글톤이면 어떤 것이 좋은지 모르고 싱글톤으로 만들어 사용하거나, 의존 ..
static 변수를 분명 100으로 초기화해줬는데, 0이 되는 문제가 발생했다!! class BookManagerImpl{ private static int MAX_SIZE = 100; private BookManagerImpl() { System.out.println(MAX_SIZE); //this.MAX_SIZE = 100; //System.out.println(MAX_SIZE); this.books = new Book[MAX_SIZE]; this.size = 0; } } 생성자에서 찍어 보니 처음에 0, 100으로 다시 초기화하니 100으로 찍혔다. 대체 왜 이런 일이 발생했을지 궁금해서 static, static final, final, 아무 필드 없이 만들어봤다. none : 100으로 초기화됨..
Singleton 실제로 생성되는 객체가 하나 (한 번만 메모리 할당) 사용하는 경우 객체 구별 필요 없는 경우 (수정 가능한 멤버 변수 없이 기능만 있는 경우) stateless한 객체 객체 재생성/삭제에 많은 비용이 들어 재사용이 유리한 경우 프로그램 안에 해당 객체가 단 한 개만 있어야 할 때 여러 부분에서 해당 객체 공유할 때 이벤트 스케쥴링/처리 객체 기본 적용 외부에서 생성자 접근 금지 → 생성자 private 내부에서 직접 객체 생성 → 멤버 변수, private 외부에서 접근 가능하도록 getter 생성 (setter 불필요) 객체 없이 외부 접근 가능하도록 getter, 변수에 static 추가 → 외부에서는 언제나 getter 통해 객체 참조, 하나의 객체 재사용함 장점 메모리 절약 가..
JVM ( Java Virtual Machine ) OS 위에서 Java 실행시켜줌 → OS에 종속받지 않음 프로그램 실행 중 런타임 데이터 영역 사용 컴파일러에 의해 자바 바이트 코드로 변경된 소스코드를 JIT 컴파일러가 바이너리 코드로 변환 JVM 구조 class loader class file을 읽으며 JVM 수행 (런타임 시 동적 로드) 클래스 처음 참조할 때, 로드/링크함 Execution Engine 바이트 코드를 기계어로 변경 Runtime Data Area에 있는 클래스 실행시킴 인터프리터 (Interpreter) 바이트 코드를 명령어 단위로 읽어 실행 (느림) JIT 컴파일러 (Just in Time) 인터프리터 방식으로 실행하다 적절 시점에 반복되는 바이트 코드를 전체 컴파일해 기계어로..
프로젝트를 진행하면서 기능 구현에서 스트림을 사용할 때마다 구글링해서 사용했다. (왜 그렇게 사용하는지 잘 모르지만 모두가 사용하는 방법대로 그냥 사용해옴) 마침 스터디 주제가 람다와 스트림이어서 이번에 정리하고자 한다. 스트림 연산은 람다식(함수형 인터페이스)을 인자로 사용하기 때문에 람다식과 함수형 인터페이스를 먼저 살펴본 후 스트림에 대 살펴볼 것이다. 람다식 (Lambda Expression) 자바 8 버전부터 지원했고 이것으로 자바는 객체지향언어와 함수형언어의 장점을 모두 가지게 되었다. 람다식은 메서드를 하나의 식으로 표현한 것인데 메서드의 이름과 반환값이 없기 때문에 익명 함수라고 부른다. 람다식은 일급 객체로 변수나 데이터에 담을 수 있고, 함수의 매개 변수로 전달될 수 있으며 함수의 반환..