널 가능성 코틀린을 비롯한 최신 언어에서 null에 대한 접근 방법은 가능한 한 이 문제를 실행 시점에서 컴파일 시점으로 옮기는 것이다. 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 커파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄인다. 널이 될 수 있는 타입 코틀린과 자바의 차이점 중 하나는 코틀린 타입 시스템이 널이 될 수 있는 타입을 명시적으로 지원한다는 점이다. 코틀린은 null이 될 수 있는 변수를 메소드 파라미터로 받을 수 있으면 호출을 금지함으로써 많은 오류를 방지한다. int strLen(String s){ return s.length; } 이 함수의 파라미터로 null이 들어오면 NullPointerException이 발생한다...
분류 전체보기
목(Mock)객체를 스터빙(stubbing) 할때 아래와 같이 사용한다. when(..).thenReturn(..) List mockedList = mock(List.class); when(mockedList.get(0)).thenReturn("foo"); 스파이(Spy)객체도 위와같이 스터빙(stubbing)을 할 것같지만, 위와 같이 사용하면 안된다. 그 이유는 스파이 객체는 리얼 객체이기 때문이다. 스파이(Spy) 객체에서는 when(object)을 사용하면, 실제 객체가 호출되버린다. 따라서 스파이(Spy)객체에서는 when을 사용하지 않고 doReturn(..).when(..)을 사용해야한다. Sometimes it's impossible or impractical to use when(Obje..
이번에 얕은 mockito지식을 가지고 테스트를 하다가, 엄청난 삽질을 했다.. 반성합니다. 내가 한 삽질과 mockito 프레임워크 내용을 정리할 겸 포스팅을 하게되었다. @Mock, @Spy, @MockBean, @SpyBean 와 관련되 내용과 내가 삽질을 한 이유를 적어보겠다. 일단, Mockito 어노테이션의 의미를 알아보자. Mocito 어노테이션은 아래와 같은 것들이 존재한다. @Mock @MockBean @SpyBean @InjectMocks @Mock : mock 객체를 만들어 반환(실제 인스턴스 없이 가상의 mock 인스턴스를 직접 만들어 사용) @Spy : spy 객체를 만들어 반환(실제 인스턴스를 사용해서 mocking 함, Spy 객체는 행위를 지정하지 않으면 객체를 만들 때 사용..
코틀린 람다의 독특한 기능은 바로 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 하는 것이다. 그런 람다를 수신 객체 지정 람다(lamda with receiver) 라고 부른다. with 함수 어떤 객체의 이름을 반복하지 않고도 그 객체에 대해 다양한 연산을 수행할 수 있을 때 사용한다. fun alphabet(): String{ val result = StringBuilder() for(letter in 'A'..'Z'){ result.append(letter) } result.append("\nNow I know the alphabet!") return result.toString() } 이 예제에서 result에 대해 다른 여러 메..
컬렉션 연산시 지연(lazy), 즉시(eagerly) 계산의 차이는 무엇인가? 즉시(eagerly)연산은 커렉션함수를 연쇄할 때마다 계산 중간 결과를 새로운 컬렉션에 임시로 담는다. 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지 않고 컬렉션 연산을 연쇄한다. people .filter { it.lastName != null } .filter { it. age!= null } .find { it.age == 31 } people.asSequence() // 컬렉션을 시퀀스로 변환 .filter { it.lastName != null } // Intermediate operation .filter { it. age!= null } // Intermediate operation .find {..
들어가기전.. ES6 문법을 Node로 실행하기 https://www.daleseo.com/js-babel6-node/ Node를 사용하면 자바스크립트(.js)을 실행시킬 수 있다. 위 블로그에 설명이 잘나와있다.(나도 따라함...ㅎㅎ 사실Vue 프로젝트 안에서만 사용해봤기 때문에.. 신기하다..) https://www.daleseo.com/js-module-import/ >> Hello World! >>> CORN : 30 >>> Hello World! >>> CORN : 30 단일 객체 내보내기/불러오기 하나의 자바스크립 모듈 파일에서 단 하나의 객체를 내보내고 불러오는 방법을 알아보자 내보내기(export) 단일 객체를 내보낼 때는 export default 키워드를 사용한다. export defa..
Vue 프로젝트 빌드시(npm run build) 디폴트로 ROOT/dist 디렉토리로 결과물이 생성되게 된다. 이 빌드 결과물 경로를 설정하기 위해서는 약간의 설정이 필요하다. Vue cli3 이상 버전에서는 webpack 설정이 내부로 감춰져있기 때문에 설정파일을 따로 만들어줘야한다. vue.config.js를 ROOT에 생성하자. vue.config.js const path = require("path"); module.exports = { outputDir: path.resolve(__dirname, "./docker/dist"), }outputDir 옵션을 사용하면 되는데, 위와 같이 변경을 하고 npm run build를 시행하게 되면 ROOT/docker/dist 하위에 결과물이 떨어지게 된..
Docker를 활용해서 nginx위에 vue를 올리는 프로젝트 셋팅을 하다가 아래와 같은 에러를 만났다. COPY failed: Forbidden path outside the build context ?? 으잉 이게 무슨에러일까 일단 나의 폴더구조는 아래와 같다. 텍스트로 표현하자면.. Vue project ㄴ docker ㄴ Dockerfile ㄴ src vue.config.js package.json 이런식이고 Dockerfile은 아래와 같다. FROM nginx:1.13 COPY ../dist/ /usr/share/nginx/html/ COPY etc/nginx/nginx.conf /etc/nginx/ COPY etc/nginx/conf.d /etc/nginx/conf.d/ CMD ["nginx..
필수적인 함수: filter 와 map filter함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. data class Person(val name: String, val age: Int) fun main() { val list = listOf(1, 2, 3, 4) println(list.filter { it%2 == 0 }) val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.filter { it.age > 30 }) } filter 함수는 컬렉션에서 원치 않은 원소를 제거한다. 하지만 filter는 원소를 변환할 수는 없다. 원소를 변환하려면 map 함수를 사용해..
코틀린 람다 맛보기 컬렉션에서 직접 탐색하기 data class Person(val name: String, val age: Int) fun findTheOldest(people: List){ var maxAge = 0 var theOldest: Person? = null for(person in people){ if(person.age > maxAge){ maxAge = person.age theOldest = person } } println(theOldest) } >> val people = listOf(Person("Corn", 31), Person("HB", 27)) >> findTheOldest(people) Person(name=Corn, age=31) 경험이 많은 개발자라면 순식간에 이런 ..