본문 바로가기

전체 글

(93)
이름 있는 전달 인자(argument)를 사용하라 코드에서 아규먼트의 의미가 명확하지 않은 경우가 있습니다. 다음 예를 살펴 봅시다val text = (1..10).joinToString { "|" }|는 무엇을 의미 할까요? 만약 joinToString에 대해서 알고 있다면, 이 것이 구분자(separator)를 의미한다는 것을 알 것입니다. 모른다면 이를 접두사(prefix)로 생각할 수도 있을 것입니다. 따라서 명확하지 않게 보일 수도 있습니다. 파라미터가 명확하지 않은 경우에는 이를 직접 지정해서 명확하게 만들어 줄 수 있습니다. 다름 코드처럼 이름 있는 아규먼트를 사용하면 됩니다.val text = (1..10).joinToString (separator = "|") 또는 다음과 같이 변수를 사용해서도 의미를 명확하게 할 수 있습니다.val s..
프로퍼티는 동작이 아니라 상태를 나태내야 한다 프로퍼티란 필드와 accessor 메서드를 자동으로 생성해 주는 문법을 의미한다. getter와 setter를 사용하는 것은 사용자의 선택에 따른 옵션이다.  코틀린 프로퍼티는 자바의 필드와 비슷해 보이지만 다른 개념 입니다.///코틀린의 프로퍼티val name: String? = null//자바의 프로퍼티String name = null;둘다 데이터를 저장한다는 점은 같지만 프로퍼티에는 더 많은 기능이 있습니다. 일단 기본적으로 프로퍼티는 사용자의 정의 세터와 게터를 가질 수 있습니다.val name: String? = null get() = field?.toUpperCase() set(value){ if(!value.isNullOrBlank()){ field..
DTO와 DTA 그리고 Entity DAO데이터 베이스에 접근하는 객체프로젝트의 서비스 모델에 해당하는 부분과 데이터베이스를 연결하는 역할데이터 CRUD 작업을 시행하는 클래스, 데이터에 대한 CRUD 기능을 전담하는 오브젝트사용이유 : 효율적인 커넥션 관리와 보안성. DAO는 비즈니스 로직을 분리하여 도메인 로직으로부터 DB와 관련한 메커니즘을 숨기기 위해 사용DTO데이터를 전달하기 위한 객체로직을 가지지 않는 순수한 데이터 객체여러 레이어간 데이터를 주고 받을 때 사용할 수 있고 주로 view와 controller사이 활용가변 객체로도 불변 객체로도 활용 가능getter, setter 메소드를 포함한다, 다른 비즈니스 로직은 포함하지 않는다 - 데이터 전달 만을 위한 객체 그래서 다른 로직이 필요하지 않는다VO값 자체를 표현하는 객체D..
리시버를 명시적으로 참조하라 무언가를 자세하게 설명하기 위해서 명시적으로 긴 코드를 사용할 때가 있습니다. 대표적으로 함수와 프로퍼티를 지역 또는 톱레별 변수가 아닌 다른 리시버로부터 가져온다는 것을 나타낼 때가 있습니다. 예로 클래스 메서드라는 것을 나타내기 위한 this가 있습니다.class User: Person() { private var beersDrunk: Int = 0 fun drinkBeers(num: Int) { // ... this.beersDrunk += num // ... }}비슷하게 확장 리시버(확장 메서드에서의  this)를 명시적으로 참조하게 함 수도 있습니다. 비교를 위해서 일단 리시버를 명시적으로 표시하지 않은 퀵소트구현을 살펴 봅시다fun ..
MVVM 패턴 MVVM 패턴은 MVC 패턴에서 Controller를 빼고 ViewModel을 추가한 패턴입니다. MVVM 동작 과정 사용자의 Action들은 View를 통해 들어옵니다.View에 Action이 들어오면 ViewModel에 Action을 전달합니다.ViewModel은 Model에게 데이터를 요청합니다.Model은 ViewModel에게 요청받은 데이터를 응답합니다.ViewModel은 응답 받은 데이터를 가공하여 저장합니다.View는 Data Binding을 이용해 UI를 갱신시킵니다.역할 및 동작 원리View:레이아웃과 화면을 보여주는 역할사용자 인터페이스를 담당하는 부분입니다.사용자가 보는 화면을 표시하고, 사용자 입력을 처리합니다.보통 XAML과 같은 마크업 언어를 사용하여 디자인됩니다.ViewMode..
변수 타입을 확실하게 지정하기 코틀린은 개발자가 타입을 지정하지 않아도, 타입을 지정해서 넣어주는 타입 추론 시스템을 갖추고 있습니다.class test { val num = 10 val name = "Marcin" val ids = listOf(12,112,554,997)} 이는 개발 시간을 줄여줄 뿐만 아니라 유형이 명확할 때 코드가 짧아져 가독성이 향상 됩니다.  하지만 유형이 명확하지 않을 때는 납용하지 않는게 좋습니다 val data = getSomeData() 위의 코드는 타입을 숨기고 있습니다. 가독성을 위해 중요한 정보는 숨겨서는 안됩니다.  '코드를 읽으면서 함수 정의를 확인하면 되지 않나? ' 라고 생각 할수도 있지만 이는 곧 가독성이 떨어진 다는 이야기랑 같습니다. 또한 코드 정의로 확인 할수 없는..
Unit을 리턴하면 안되는 이유 Boolean이 true 또는 false를 가지는거 처럼 Unit? 또는 Unit이라는 값을 가질 수 있습니다. 따라서 Boolean과 Unit 타입은 서로 바꿔서 사용할 수 있습니다. 일반적으로 Unit?을 사용한다는건 이런 경우 입니다.fun keyIsCorrect(key: String): Boolean = // ... {} if (!keyIsCorrect(key)) return  다음 코드 처럼 사용할 수도 있습니다. fun verifyKey(key: String): Unit = // ... {}verifyKey(key) ? : return Unit?으로 boolean을 표현하면 오해의 소지가 있으며 예측하기 어려운 오류를 만들 수 있습니다. 기본적으로 Unit을 리턴하거나 이..
Android의 4대 컴포넌트 Android 4대 컴포넌트는 Activity (액티비티), Service (서비스), Broadcast Receiver (브로드캐스트 수신자), Content Provider (콘텐츠 제공자) 이렇게 네가지가 있습니다 액티비티는 액티비티는 사용자 인터페이스를 포함한 화면 하나를 나타냅니다. 예를 들어 이메일 앱이라면 목록을 표시하는 액티비티가 하나 있고, 이메일을 작성하는 액티비티가 또 하나가 존재합니다. 서비스는 서비스는 백그라운드에서 실행되는 구성 요소로, 오랫동안 실행되는 작업을 수행하거나 원격 프로세스를 위한 작업을 수행합니다.. 예를 들어 서비스는 사용자가 다른 일을 하는 동안에 백그라운드에서 음악을 재생하거나, 데이터를 가져옵니다. 브로드캐스트 수신자는 브로드캐스트 수신자는 시스템이 정기적인..