본문 바로가기

JAVA

(133)
병렬 프로그래밍 병렬 프로그래밍 여러가지 일을 동시에 처리하기 위한 기법은 크게 병행(Concurrency), 병렬(Parallel) 그리고 분산(Distribute)으로 구분한다. 병행은 하나의 CPU 코어에서 소프트웨어적인 기법으로 동시에 여러 작업을 교차하면서 실행하는것. (프로그램 성질) 병렬은 여러 개의 코어에 작업을 배분해서 동시에 작업을 실행하는 것. (기계적인 특징) 멀티코어 환경에서 병렬과 병행 작업이 동시에 일어난다. 작업이 여러 코어에 배분될뿐만 아니라 하나의 코어에서 여러 작업이 병행해서 동작한다. 컨커런트 API 웹 기반 개발이 일반화 되면서 멀티 스레드 프로그래밍이 강조 되었다. 컨커런트 API가 멀티 스레드 모델보다 개발이 좀 더 쉽긴 하지만 멀티 스레드를 대체하기 위한 것은 아니다. 데몬 프..
이펙티브 자바 # 3 클래스와 멤버의 접근권한을 최소화 잘 설계된 컴포넌트의 차이점은 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지에 달려있다. 오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉 or 캡슐화 장점 시스템 개발 속도(여러 컴포넌트를 병렬로 개발 가능) 시스템 관리 비용 낮춤(각 컴포넌트를 더 빨리 파악하여 디버깅 할수 있고, 다른 컴포넌트로 교체하는 부담이 적음) 정보은닉 자체가 성능을 높여주지 않지만, 성능 최적화에 도움(다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화 가능) 소프트웨어 재사용성을 높임 큰 시스템을 제작하는 난이도를 낮춤(시스템 전체가 완성되지 않는 상태에서도 개별 컴포넌트의 동작을 검증 가능)..
이펙티브 자바 #1 생성자 대신 정적 팩터리 메서드를 고려하라 장점 이름을 가질수 있다. 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다. 반환 타입의 하위 타입 객체를 반환할수 있다. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래가 존재하지 않아도 된다. Date d = Date.from(instant); Set fceCards = EnumSet.of(JACK, QUEEN, KING); BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); StackWalker luke = StackWalker.getInstance(options); Object newArray = Array.newInsta..
스프링 부트 기본설정 및 기본 테스트 gradle 설정 build.gradle buildscript { ext { springBootVersion = '2.1.7.RELEASE' } repositories { mavenCentral() jcenter() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group 'com.swan.ee' version '1.0-SNAP..
Swagger-UI url 변경 @Configuration @EnableSwagger2 @Import(BeanValidatorPluginsConfiguration.class) public class SpringFoxConfig extends WebMvcConfigurationSupport{ @Bean public Docket apiDocket() { return new Docket(DocumentationType.SWAGGER_2) .useDefaultResponseMessages(false) .select() .apis(RequestHandlerSelectors.basePackage(CommonConstants.BASE_PACKAGE_NAME)) .paths(PathSelectors.ant("/api/v1/**")) .build() ..
애그리게이트 애그리게이트란? 객체지향 프로그래밍에서는 여러개의 객체가 모여 한 가지 의미를 갖는 하나의 객체가 된다. 이렇게 객체가 모여 이룬 객체는 어떤 불변조건(어떤 처리를 수행하는 동안 참을 유지해야 하는)을 유지해야 한다. 이 불변 조건은 언제나 유지돼야 하지만, 객체가 가진 데이터를 변경하는 조작을 무제한 허용하면 이를 유지하기 어렵다. 따라서 객체를 다루는데도 질서가 필요하다. 애그리게이트는 경계와 루트를 갖는다. 애그리게이트의 경게는 애그리게이트에 포함되는 대상을 결정하는 경계다. 그리고 루트는 애그리게이트에 포함되는 특정한 객체이다. 외부에서 애그리게이트를 다루는 조작은 모두 루트를 거쳐야한다. 애그리게이트에 포함되는 객체를 외부에 노출하지 않음으로서 불변 조건을 유지할수 있다. User | | V V..
자바 코딩의 기술 - #2 코딩 스타일 2.1 매직 넘버를 상수로 대체 void setPreset(int speedPreset) { if (speedPreset == 2) { setTargetSpeedKmh(16944); } else if (speedPreset == 1) { setTargetSpeedKmh(7667); } else if (speedPreset == 0) { setTargetSpeedKmh(0); } } 변경 static final int STOP_PRESET = 0; static final int PLANETARY_SPEED_PRESET = 1; static final int CRUISE_SPEED_PRESET = 2; static final double STOP_SPEED_KMH = 0; static final double..
자바 코딩의 기술 - #1 코드 정리 1.1 쓸모없는 비교 피하기 if(microscope.isInorganic(sample) == true) 변경 if(microscope.isInorganic(sample) 불 표현식은 불 원시값과 비교하지 않아도 된다. 1.2 부정피하기 if(!microscope.isHumanoid(sample)) { retrun Result.ALIEN; } else { retrun Result.HUMANOID; } 변경 if(microscope.isHumanoid(sample)) { retrun Result.HUMANOID; } else { retrun Result.ALIEN; } 코드를 읽을때 일반적으로 긍정 표현을 이해하기가 더 쉽다. 1.3 boolean 표현식을 직접 반환 boolean isValid() { i..