2020년 3월 17일 GA 예정인 JDK 14 의 몇가지 피처들을 정리해본다. Pattern Matching for instanceof (Preview) 런타임에 객체의 타입을 확인하는 instanceof 연산자는 보통 아래와같은 관용구(idiom)로 많이 사용된다. if(obj instanceof String) { String s = (String) obj; } 이 instanceof 연산자를 확장하여 아래와같은 문법을 지원한다. if(obj instanceof String s) { // String 타입의 s 변수 사용 } 코틀린에 대한 경험이 있는 사람이라면 바로 느꼈겠지만 코틀린의 스마트 캐스팅과 유사한 문법으로 보인다. 다만 한가지 좀 이해하기 어려운 스펙이 있는데 if (obj instanc..
면접관으로 들어가서 알고있는 디자인 패턴이 어떤게 있는지를 질문해보면 가장 많이 나오는 대답이 MVC패턴과 싱글톤 패턴이다. 커뮤니티를 봐도 디자인패턴에 대한 질문은 싱글톤의 비중이 압도적이다. 개인적으로 싱글톤이 왜 이렇게 인기가 많을까 생각해봤는데 패턴이 추구하는 바가 비교적 명확하고, 처음 패턴을 공부하는 초보 개발자들이 적용하기에도 가장 만만해서 그런게 아닐까싶다. 그럼 이제 싱글턴 패턴에 대해 알아보자. 싱글턴 패턴은 애플리케이션 내에서 하나의 클래스가 하나의 인스턴스만 생성하는걸 강제하는 패턴이다. 자바에서 객체를 생성하는 메커니즘은 생성자를 이용해서 객체를 생성하는 것이다. public class Singleton { public Singleton() { } } Singleton single..

햄버거 클래스를 만든다고 생각해보자. 이번 예제부터는 코틀린으로 작성해보려한다. 자바랑 좀 다르긴 하지만 이해하는데 큰 어려움을 없을거라고... 생각한다..... open class Hamburger(private val bun: String, private val patty: String) { open fun materials(): String = "$bun $patty" } 기본 햄버거다. 햄버거 번과 패티를 갖고있다. message() 메서드는 그저 재료들을 나열하는 문자열을 반환하는 간단한 클래스다. 치즈토핑이 추가된 치즈버거를 만들고싶다. 어떻게 구현할 수 있을까? open class CheeseBurger(private val cheese: String, bun: String, patty: S..
generic 을 이용한 배열 객체를 생성할때는 컴파일단에서 에러가 발생하게된다. List[] lists = new ArrayList[10]; ArrayList 의 배열을 만들고자하는 코드다. 대충 쉽게 이해하면 일종의 2차원 배열이라고 볼 수 있다. 하지만 이 코드는 'generic array creation' 이라는 컴파일 에러와 함께 컴파일 되지않는다. 왜 이럴까? 먼저 제네릭이 추구하는 바가 뭔지를 알아보고, 배열과 제네릭 리스트의 차이를 이해해야 컴파일러가 저걸 왜 막는지 이해할 수 있다. 제네릭이 추구하는 바는 타입 안정성이다. 제네릭이 사용된 코드는 타입 안정성을 보장해야한다. 타입 안정성이 보장될 수 없다면 제네릭은 사용될 이유가 없다. 그런데 배열과 제네릭의 차이점으로 인해 제네릭 배열은..

1. 축구경기 국가대표 축구경기가 있다고 생각해보자. 골이 들어갈때마다 네이버와 다음 각 포털의 데이터가 변경되어야한다. 이를 어떻게 구현하면 될까? 첫번째 방법은 담당자가 축구를 보다가 골이 들어갈때마다 데이터를 변경해주는 수동 방법이있다. 수동방법을 몰라서 이 포스팅을 하는건 아니니 넘어가자. 두번째 방법은 축구협회에서 현재 골득점 상황을 알려주는 API를 제공한다고 가정했을때(제공안해주면 크롤링을 해서라도..), 각 포털사가 지속적으로 API를 호출하면서 데이터 변경 유무를 체크하는 방법이 있을 수 있다. 이 방식으로 구현하면 적어도 담당자가 직접 수작업은 하지않아도 되니 자동화가 가능해진다. 다만 축구협회 API를 호출하는 주기를 어떻게 잡을것인지가 중요하다. 너무 짧게 잡으면 축구협회 API에 ..

1. 코드 스멜 게임을 만든다고 생각해보자. 각각의 몬스터들을 객체로 만드려고한다. 객체를 만드려면 일단 클래스가 있어야하니 클래스를 정의하자. public abstract class Monster { public abstract void attack(); } 몬스터들간의 다형성을 위해 Monster 추상 클래스를 정의했다. 이번 포스팅은 attack() 메서드부분을 리팩토링해나가는 과정을 작성하려한다. 그래서 메서드는 attack() 만 간단하게 정의했다. public class Knight extends Monster { @Override public void attack() { System.out.println("칼 공격!"); } } Knight 몬스터를 정의했다. Knight 몬스터 외에 Ske..
이펙티브자바를 보던중 평소에 잘 모르는 상태로 혼용하고있던 네이밍 컨벤션에 대해 잘 설명해주고있어 정리한다. from: 하나의 매개변수를 받아서 인스턴스를 생성 of: 여러개의 매개변수를 받아서 인스턴스를 생성 instance or getInstance: 인스턴스를 반환하지만 동일한 인스턴스임을 보장하지 않는다. 보통 singleton을 구현할때 많이 사용하는 네이밍이지만 singleton이랑은 무관하게 매번 신규 생성될 수 있다. create or newInstance: 매번 새로운 인스턴스를 반환한다. instance or getInstance 의 서브셋 개념이라고 볼 수 있을듯 getXxxx: getInstance와 같으나 호출하는 클래스와 다른 타입의 인스턴스를 반환할때 사용 예를들어 Date.g..
ParallelStream java8에 추가된 parallelStream 은 멀티스레드 프로그래밍을 매우 쉽게 해준다. 개발자가 직접 스레드 혹은 스레드풀을 생성하거나 관리할 필요없이 parallelStream(), parallel() 만 사용하면 알아서 ForkJoinFramework 를 이용하여 작업들을 분할하고, 병렬적으로 처리하게된다. public static void main(String[] args) { parallel(); single(); } private static void parallel() { long start = System.currentTimeMillis(); long sum = LongStream.range(0, 1_000_000_000).parallel() .sum(); S..
spring bean 설정시 lite mode 라는게 있어서 찾아보고, 그에대해 정리해보려한다. 일단 lite mode 는 java 설정에서만 사용할 수 있다. 보통의 java 설정파일을 알아보자. @Configuration public class BeanConfig1 { @Bean public ObjectMapper objectMapperBean() { return new ObjectMapper(); } }평소에 많이 사용하는 java 설정 내용이다. @Bean 애노테이션을 이용해 spring bean 을 생성한다. 그리고 이 java 클래스가 설정 클래스임을 나타내기위해 @Configuration 애노테이션을 사용한다. @Configuration 애노테이션은 설정 클래스임을 나타내며 그 자신도 spr..
빠르게 알아보자. 포스팅은 gradle 기준으로 설명한다. build.gradle에 아래 설정을 추가해준다. test { useJUnitPlatform() } spring starter test 에서 기존 junit을 제외해준다. dependencies에서 아래처럼 설정해준다. testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude module: 'junit' } 이제 junit5 의존성을 추가해줄차례다. testImplementation('org.junit.jupiter:junit-jupiter-api') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') 위 ..
- Total
- Today
- Yesterday
- Spring
- mariadb
- DesignPattern
- clean code
- programming
- backend개발환경
- TEST
- db
- code
- 정규표현식
- MySQL
- JavaScript Core
- http
- java8
- frontcode
- go-core
- java
- frontend개발환경
- OOP
- servlet
- Jackson
- toby
- EffectiveJava
- JPA
- generics
- javascript
- Kotlin
- Design Pattern
- spring cloud
- Git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |