Java
-
[Java] 이펙티브 자바 (4) - 제네릭Java 2020. 4. 18. 15:45
아이템 26. 로 타입은 사용하지 말라 Generic Type(제네릭 타입) 일련의 매개변수화 타입(parameterized)을 정의 클래스(혹은) 인터페이스 이름이 나오고, 이어서 안에 실제 타입 매개변수들을 나열 제네릭 활용시 타입만 취급하는지의 정보가 주석이 아닌 타입 선언 자체에 녹아들게 됨 -> 컴파일러가 의도하지 않은 동작시 컴파일 오류를 발생시킴 Raw Type(로 타입) 제네릭 타입을 하나 정의하면 그에 딸린 로 타입도 함께 정의 타입 선언에서 제네릭 타입 정보가 전부 지워진 것처럼 동작하는데, 제네릭이 생기기 전 코드와 호환되도록 하기 위한 궁여 지책 로 타입을 그냥 사용시 제네릭이 안겨주는 안전성과 표현력을 모두 잃게 됨(컴파일 오류가 아닌 런타임 오류!) Unbounded Whildc..
-
[Java] 이펙티브 자바 (3) - 클래스와 인터페이스Java 2020. 4. 18. 11:51
아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 정보 은닉(캡슐화)의 장점 - 시스템 개발 속도를 높임 - 시스템 관리 비용을 낮춤 - 성능을 높여주진 않지만, 성능 최적화에 도움을 줌 - 소프트웨어 재사용성을 높임 - 큰 시스템을 제작하는 난이도를 낮춰줌 자바 정보 은닉의 핵심 - 접근 제한자 - 접근 제한자를 제대로 활용하는 것이 정보 은닉의 핵심. 기본 원칙 - 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 함 - public 클래스에서 멤버의 접근 수준을 protected 또는 public으로 변경시, 공개 API가 되므로 영원히 지원해야 함(유지보수) -> 클래스의 공개 API를 세심히 설계 후, 그 외 모든 멤버는 private로 만들고, 같은 패키지에서 접근해야 한다면 package-..
-
[Java] 이펙티브 자바 (2) - 모든 객체의 공통 메서드Java 2020. 4. 18. 01:13
아이템 10. equals는 일반 규약을 지켜 재정의하라 equals를 재정의하지 않아야 할 때(하나라도 해당한다면) - 각 인스턴스가 본질적으로 고유 - 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없음 - 상위 클래스에서 재정의한 equals가 하위 클래스도 딱 맞는 경우의 하위 클래스 - 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없음 실수로라도 equals가 호출되는 것을 막고 싶다면? equals를 override하되, AssertionError를 던지도록 구현해두기 equals를 재정의해야 할 때 - 객체 식별성(object identity)이 아닌 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 ..
-
[Java] 이펙티브 자바 (1) - 객체 생성과 파괴Java 2020. 4. 18. 00:28
아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 정적 팩터리 메서드가 생성자보다 좋은 장점 다섯 가지 1. 이름을 가질 수 있음 2. 호출될 떄마다 인스턴스를 새로 생성하지 않아도 됨 3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있음 4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있음 5. 정적 팩터리 메서드를 작성하는 시점에서 반환할 객체의 클래스가 존재하지 않아도 됨 정적 팩터리를 사용했을 때의 단점 1. 상속을 하려면 public or protected 생성자가 필요하므로 정적 팩터리 메서드만 제공할 경우 하위 클래스를 만들 수 없음 2. 정적 팩터리 메서드는 프로그래머가 찾기 어려움 정적 팩터리 메서드에 흔히 사용하는 명명 방식 - from : 매개변수 하나..
-
[Java] GOF 디자인패턴 용어 정리Java 2020. 4. 16. 18:01
생성패턴 Abstract Factory Pattern(추상 팩터리 패턴) - 패턴 설명 : 다양한 구성요소(Product)별로 '객체의 집합'(Factory)을 생성할 때 유용. 서로 관련있는 객체들을 묶어 팩터리 클래스로 만든 후 팩터리를 조건에 따라 생성하도록 다시 팩터리를 만들어서 객체를 생성하는 패턴 - Abstract Factory : (예) 컴퓨터 생성 - 모니터 생성, 본체 생성 - Concrete Factory : (예) 삼성컴퓨터 생성 - 삼성모니터생성, 삼성본체생성 / LG컴퓨터 생성 - LG모니터생성, LG본체생성 - Abstract Product : (예) 모니터 / 본체 - Concrete Product : (예) 삼성모니터, LG모니터 / 삼성본체, LG본체 Builder Pat..
-
자바의 I/OJava 2020. 3. 13. 20:06
I/O란? Intput/Output의 약자로 입력과 출력, 간단히 입출력이라 함 입출력 : 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것 예) 키보드로부터 데이터를 입력, System.out.println()을 이용해 화면에 출력 스트림(stream) 자바에서 I/O를 수행하려면, 즉 어느 한 쪽에서 다른 한 쪽에 데이터를 전달하려면 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요함, 이것을 스트림(stream)이라 정의(단, 람다의 스트림과는 다른 개념) 스트림 : 데이터를 운반하는데 사용되는 연결 통로 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름으로, 물이 한 쪽 방향으로만 흐르는 것과 같이 스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동..
-
Stream(스트림) - 8. 스트림의 변환Java 2020. 3. 11. 22:34
스트림 -> 기본형 스트림 // Stream -> IntStream mapToInt(ToIntFunction mapper) // Stream -> LongStream mapToLong(ToLongFunction mapper) // Stream -> DoubleStream mapToDouble(ToDoubleFunction mapper) 기본형 스트림 -> 스트림 // IntStream -> Stream // LongStream -> Stream // DoubleStream -> Stream boxed() // IntStream/LongStream/DoubleStream -> Stream mapToObj(DoubleFunction mapper) 기본형 스트림 -> 기본형 스트림 // IntStream ->..
-
Stream(스트림) - 7. Collector 구현 (최종연산 3/3)Java 2020. 3. 11. 22:14
Collector 작성 Collector인터페이스를 구현 Collector Interface 직접 구현해야 하는 5개의 메서드 public interface Collector { Supplier supplier(); BiConsumer accumulator(); BinaryOperator combiner(); Function finisher(); Set characteristics(); // 컬렉터의 특성이 담긴 Set 반환 ... } characteristics()를 제외하면 모두 반환타입이 함수형 인터페이스 = 4개의 람다식 supplier() 작업 결과를 저장할 공간 제공 accumulator() 스트림의 요소를 수집(collect)할 방법 제공 스트림 요소를 어떻게 supplier가 제공한 공간에..