본문 바로가기

JAVA

(133)
자바 8 #스트림(Stream) 스트림스트림은 자바8에서 연산의 스케줄링은 구현체에 맡기며, 값들의 묶음을 처리하고 원하는 작업을 지정하는데 필요한 핵심 추상화이다.예) 특정 메서드에서 리턴하는 값들의 평균을 계산하려고 한다면각 요소를 대상으로 해당 메서드를 호출하여 이 값들의 평균을 얻고 싶다고 명시한다.각 부분의 합계와 카운트를 계산하고 결과를 합치기 위해 다중 스레드를 사용해 연산을 병렬화하는 일을 스트림 라이브러리에 맡긴다. 스트림컬렉션을 처리할 때 보통은 요소들을 순회하면서 각 요소를 대상으로 작업한다.String contents = new String(Files.readAllBytes(Paths.get("c:\\alice.txt")), StandardCharsets.UTF_8); //파일을 문자열로 읽어온다.List word..
자바8 #인터페이스 디폴트 메서드와 정적메서드 디폴트 메서드많은 프로그래밍 언어에서 함수 표현식을 컬렉션 라이브러리와 통합한다.이는 종종 루프를 이용한 버전보다 짧고 이해하기 쉬운 코드로 이어진다.예) for(int i =0; i
자바8 람다 #레퍼런스 메서드 레퍼런스다른 코드에 전달하려고 하는 액션을 수행하는 메서드가 이미 존재할 수도 있다.예) 버튼을 클릭할때마다 단순히 이벤트 객체를 출력하고 싶을 경우button.setOnAction(event -> System.out.println(event)); 하지만 setOnAction 메서드에 println 메서드만 전달할 수 있다면 더 좋을것이다.button.setOnAction(System.out::println); System.out::println 표현식은 람다 표현식 x -> System.out.println(x) 에 해당하는 메서드 레퍼런스(method reference)이다 예) 대소문자를 가리지 않고 문자열을 정렬하고 싶은 경우Arrays.sort(strings, String::compare..
자바8 람다 #함수형 인터페이스 함수형 인터페이스자바에는 Runnable, Comparator 등 코드 블록을 캡슐화하는 수많은 기존 인터페이스가 있다.람다는 이러한 기존 인터페이스와 호환된다. 단일 추상메서드(single abstract method)를 갖춘 인터페이스의 객체를 기대할 때 람다 표현식을 사용할 수 있다.그리고 이러한 인터페이스를 함수형인터페이스(functional interface)라고 한다. 함수형 인터페이스가 단일 추상 메서드를 포함해야하는 이유는?인터페이스에 있는 모든 메서드는 추상 메서드이다. 실제로 언제나 인터페이스에서 toString이나 clone 같은 Object 클래스의 메서드를 재선언할 수 있었고, 이러한 재선언은 해당 메서드를 추상메서드로 만들지 않는다.자바8에서는 인터페이스에 비추상 메서드를 정의할..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제 요약 요약작성하는 코드의 80%정도를 구체 클래스가 아닌 인터페이스를 이용해야 하며, 이는 요구사항이 변경되었을 때 프로그램을 쉽게 바꿀 수 있도록 해주는 유연성을 제공해준다.우리는 객체를 인스턴스화하는 실제 클래스 대신 클래스가 구현하고 있는 인터페이스를 통해 객체를 생성하도록 돕는 여러 패턴을 보았다. Singleton - 제한된 수의 객체를 생성한다.Abstract Factory - 관련된 객체 군(family)중 하나를 생성하도록 해주는 '팩토리'. 이때 생성되는 객체의 구체 타입은 인터페이스를 통해 가려진다. 구체 타입이 아닌 인터페이스를 통해 프로그래밍하기 때문이다.Template Method - 기반 클래스에서 일반 알고리즘을 정의하고, 파생 클래스에서 알고리즘을 사용하는 추상 메소드를 오버라이딩..
자바8 람다 람다lambda expression 람다 표현식은 나중에 한번 이상 실행할 수 있도록 전달할 수 있는 코드 블록이다. 지금까지 자바에서 코드블록class Worker implements Runnable {public void run() {for(int i=0; i 표현식)(String first, String second) -> Integer.compare(first.length(), second.length()) 이와 같은 표현식은 단순한 코드 블록으로, 변수들의 명세와 함게 코드에 전달해야 한다. 2) 표현식 하나로 표현할 수 없는 계산을 수행한다면? 중괄호 {}로 감싸고 명시적인 return 문을 사용한다.(String first, String second) -> {if(first.length() ..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제3 Template Method와 Factory Method 패턴updateBuffer()는 템플릿 메소드(Template Method) 패턴의 예이다.Template Method에서는 기반 클래스 코드가 오버라이딩 가능한 메소드를 호출하고, 메소드의 구현은 기반클래스를 구현한 상속 클래스에서 제공한다.기반 클래스의 메소드는 대부분의 경우 abstact이지만, 때로는 디폴드 연산을 구현하고 있을 수도 있다. Template Method 패턴에서는 기반 클래스가 알고리즘을 정의하고 이 알고리즘에서 오버라이딩 가능한 메소들을 호출한다. 그리고 기반 클래스를 상속한 파생클래스에서 각 메소드를 재저의하여 알고리즘의 행위를 커스터마이징 한다. Template Method 패턴은 가능한 절제해 사용해야한다.클래스 자체..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제2 다중상속다중(구현)상속을 지원하는 언어는 클래스 정의에서 여러 개의 extends 관계를 허용한다.만약 구현 상속이 나쁘다면 분명 다중 구현 상속은 더 나쁘다.하지만 다중 상속의 '개념'이 유용할 때가 있다.예를 들어 메뉴바를 가진 프레임 윈도인 '메뉴 사이트'를 소개하는데 애플리케이션의 메인 윈도는 프레임윈도(JFrame)이면서 또한 MenuSite이다.메뉴 사이튼 두기반 클래스의 모든 속성을 지니고 있으며, 이런 상황에서의 다중 상속은 합당하다. 다중 상속'개념'이 유용할 경우가 있다. JFrame을 확장하고 MenuSite 인터페이스를 구현하며, 모든 MenuSite 연산을 기본 구현 객체에 위임한다.개념적으로 이는 다중 상속과 같은 기능을 한다.이런 위임 기반의 해결책은 경험있는 개발자들은 흔히 ..