[Modern Java In Action] 4. 스트림

우리는 자바를 사용할때 컬렉션(Collection)으로 데이터를 그룹하하고 처리할 수 있다.

  • 컬렉션으로 질의문(query)을 통해 원하는 데이터를 걸러낼수없을까?
  • 엄청 커다란 컬렉션을 효율적으로 처리하려면 어떻게할수있을까? 자바에서는 이와 같은 고민에서 출발하여 나온것이 스트림(Stream)이다. 스트림에 대해 알아보자.

Continue reading

java enum의 아주 기본적인 내용만 활용하기

상태값들을 enum을 통해서 관리하려고하는데 enum 사용의 국룰이 뭔지 명확치 않아 찾아보고 거기서 기본적인 내용만 정제해서 활용해보았다.
활용할때는 java enum을 검색했을때 나오는 아래 블로그들 내용을 참고했으며 아마 현시점에서 enum관련해서 제일 상위로노출되는 사람들이 제일 많이 참고하는 블로그일듯

Continue reading

[Effective java] item47. 반환타입으로는 스트림보다 컬렉션이 낫다

시퀀스 리턴시 최고의 리턴 타입은?

원소 시퀀스를 반환하는 API를 개발할 일이 생겼다면? 어떤타입을 반환하는 방법이 최선일까?
당연히 컬렉션으로 반환하는것이 최선이다. 왜냐면 스트림으로 처리하기를 원하는 사용자와 반복으로 처리하길 원하는 사용자 모두를 다 만족시킬수 있으니까.
스트림은 iterable인터페이스가 정의한 추상메서드들을 전부 포함하지만 extend하고있지 않고있어서 반복문을 사용할수는 없음. (나중에 java가 수정되서 스트림이 iterable 메서드들 사용할수있게되면 그때 되서나 stream을 반환하라고 저자가 권유하고있음)
단, 만약 사용자가 Stream만 사용하길 원한다면 Stream을, Iterable만 사용하길 원한다면 Iterable만 반환해도 괜찮다.

Continue reading

[Effective java] item46. 스트림에서는 부작용 없는 함수를 사용하라

스트림은 함수형 프로그래밍에 기초한 패러다임이다. 따라서 그냥 가져다 쓴다는 생각보다는, 이 패러다임 자체를 이해해야한다.
(함수형 프로그래밍의 개념에 대해서는 차후 다시 정리. 간단히 말해서는 순수한 함수를 작성해 사용해서 share/mutable한 상황을 겪지 않는 안정적인 프로그래밍을 지향하는 방식)

Continue reading

[Effective java] item12. toString을 항상 재정의하라

Object이 기본 toString 메서드는 보통 클래스_이름@16진수 해시코드 를 반환함. 그러나 toString 일반규약에 따르면 간결하면서도 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야한다. 또한 모든 하위 클래스에서 이 메서드를 재정의하라 고 명시하고있다. toString 메서드를 잘 재정의하면 println, assert, 디버거가 객체를 출력할 때 자동으로 불리므로 훨씬 사용하고 디버깅하기쉬워진다.

Continue reading

[Object] 12. 다형성

앞에서 배운 상속의 목적은 코드 재사용이 아니다. 상속은 타입계층을 구조화하기 위해 사용해야한다.
상속을 통해 타입 계층을 구조화하여 다형성을 구현하는 방법에 대해 알아보자.

Continue reading

[Object] 11. 합성과 유연한 설계

상속 : 부모클래스와 자식클래스를 연결해서 부모 클래스의 코드를 재사용. is-a 관계. 의존성이 컴파일 타임에 해결됨. 정적인 관계.
합성 : 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해서 부분 객체의 코드를 재사용. has0a 관계. 의존성이 런타임에 해결됨. 동적인 관계

Continue reading

[Object] 08. 의존성 관리

잘 설계된 객체지향 어플리케이션은 작고 응집도높은 객체들로 구성된다. 때문에 객체들간 협력은 필수적이다. 협력하기 위해서는 객체끼리 서로 어떤 기능인지 알고있어야한다. 이런 다른 객체에 대한 지식은 객체간 의존성을 낳는다.
협력을 위해서는 의존성이 필수적이지만 과도한 의존성은 유지보수를 어렵게 만든다.
따라서 객체지향의 핵심은 필요한 의존성은 유지하고 변경을 방해하는 의존성은 제거하는것이다.
충분히 협력적이면서 변경을 방해하지않는 유연한 객체를 만ㄷ르기 위한 의존성 관리 방법을 알아보자.

Continue reading

[Object] 07. 객체분해

불필요한 정보를 제거하고 현재의 문제 해결에 필요한 핵심만 남기는 작업을 추사오하라고 한다.
큰 문제를 해결 가능한 작은 문제로 나누는 작업을 분해라고 한다.

Continue reading

[Object] 4. 설계 품질과 트레이드 오프

객체지향 설계의 핵심은 역할, 책임, 협력이다. 그 중에서 가장 중요한것은 책임이다. 채임을 어떻게 할당하냐에 따라 객체지향 어플리케이션 전체의 품질을 좌우한다.
훌륭한 설계란 합리적인 비용 안에서 변경을 할 수 있는 구조를 만드는것이다. 이를 위해서는 높은 응집도와 낮은 결합도가 필요하다. 그러려면 설계할때 객체의 책임에 초점을 맞춰야한다.
그런데 기존에는 주로 데이터중심관점에서 개발이 많이 이루어졌다. 데이터 중심의 설계를 살펴보고 어떤 단점이 있는지를 파악하여 책임 할당 원칙을 더 쉽게 이해해보자.

Continue reading

[Object] 3. 역할, 책임, 협력

객체지향패러다임의 관점에서의 핵심은 역할(role), 책임(responsibility), 협력(collaboration)이다.
객체지향의 본질은 협력하는 객체들의 공동체를 창조하는것 이다.
객체지향 설계의 핵심은 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다.
역할, 책임, 협력을 충분히 고민한 뒤에 이를 구현하는것이 클래스, 상속, 협동인것이다.

Continue reading

Generic 타입이란?

Generic type이란 데이터 타입을 아직 명시하지 않은 상태. class 안에서 사용하는 데이터 타입을 미리 정의하지 않고 class를 instance화 하는 시점에서 데이터타입을 지정해주는 방식.
ex. List 에서 T 가 generic type

Continue reading

JAVA의 Optional Class

Optional 은 존재할수도 있지만 안할수도있는 객체. 즉 null이 될 수도 있는 객체를 감싸는 Wrapper class이다. 기존 nullable 객체들의 경우 런타임에 NPE(NullPointerException) 예외를 발생시키거나 NPE 방어를 위해 들어간 null 체크 로직때문에 코드 가독성과 유지보수성이 떨어졌다. 이런 nullable 객체를 다루기 위해 등장한것이 Optional이다.

Continue reading

mutex와 semaphore 차이점

mutex와 semaphore 차이점

mutex와 semaphore는 동기화(syncronize)기법으로 동일 메모리 영역(자원)에 서로 다른 스레드가동시 접근할때 어떤것을 우선할지 접근 스레드의 실행 순서를 지정하는 방법이다. 두 동기화기법이 어떤 차이가 있는지 알아보자.

Continue reading

Pagination


© 2020. by berrrrr

Powered by berrrrr