본문 바로가기

전체 글

(93)
요소의 가시성을 최소화 하라 간결한 API를 선호하는 여러가지 이유가 있다작은 인터페이스는 배우고 유지보수하기 쉬움변경을 가할 때는 기존의 것을 숨기는 것보다 새로운 것을 노출하는 것이 쉬움외부에서 사용하고 있는 요소들은 변경하기 어렵고 (사용하고 있는 모든 부분이 영향을 받기 때문에), 가시성과 관련된 제한을 변경하는 것은 더 어렵다.또한, 클래스의 상태를 나타내는 프로퍼티를 외부에서 변경할 수 있다면 클래스는 자신의 상태를 보장할 수 없다. 규약을 모르는 사람들은 클래스의 상태를 마음대로 변경할 수 있으므로 클래스의 불변성이 무너질 가능성이 있다.세터를 private으로 설정한다면 외부에서 강제로 바꿀 수 없기 때문에 많이 사용된다. class CounterSet( private val innerSet: MutableSet..
Bottom Navigation 1.res/menures->우클릭->new->android resurece file반드시 resource타입을 menu로 해주어야함menu->우클릭->new->menu resource filemenu타입의 res폴더에 xml파일을 하나 만듬 menu폴더에 xml 코드 작성  (3 ~ 5) main activity 작성 각 화면 프래그먼트 생성 main activity 설정 class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener { private val binding: ActivityMainBinding by lazy { ActivityMainBinding.infl..
외부 API를 랩해서 사용하라 API 설계자가 안전하지 않다고 하거나 API 설계자가 안전하다고 해도 신뢰할 수 없다면 해당 API는 불안정하다.그리고 당연하게도 이 불안정한 API를 과도하게 사용하는 것은 위험하다. 어쩔수 없이 활용해야한다면 이 API를 로직과 직접 결합시키지 않는 것이 좋다. 그래서 외부 라이브러리 API를 랩(wrap)해서 사용한다. 랩해서 사용하면 다음과 같은 장점(자유와 안정성)이 있다.문제가 있다면 wraaper만 변경하면 되서 API 변경에 쉽게 대응할 수 있다.프로젝트의 스타일에 맞춰서 API의 형태를 조정할 수 있다.특정 라이브러리에서 문제가 발생하면 래퍼를 수정해서 다른 라이브러리를 사용하도록 코드를 쉽게 변경할 수 있다.필요한 경우 쉽게 동작을 추가하거나 수정할 수 있다. 단점으로는 다음과 같다...
API 안정성을 확인하라 세상에 있는 자동차의 운전방법이 다르다면, 자동차를 운전하기 전에 모든 운전방법을 배야한다.이처럼 일시적으로 사용되는 인터페이스를 배우는것은 굉장히 귀찮고 의미없다.프로그래밍에서도 안정적이고 표준적인 API를 선호한다.주요 이유는 다음과 같다.API가 변경되고 개발자가 업데이트했다면, 변경에 대응하기가 곤란해진다.특히 다른 개발자가 API를 사용한 경우에는 익숙하지도 않아 더욱 어려울 것이다.개발자가 안정적인 라이브러리로 업데이트 하는것을 두려워하는것은 매우좋지 않은 상황이다.사용자가 새로운 API를 배워야 한다.새로 배운다는것은 꽤힘들고 고통스럽기 때문에 많은 사람이 이를 피하나, 오래된 지식때문에 보안문제가 발생한다.따라서 안정적이지 않은 모듈을 많이 공부하는 것보다 안정적인 모듈부터 공부해 두는것이..
변화로부터 코드를 보호하려면 추상화 사용하라 함수, 클래스 등의 추상화로 실질적인 코드를 숨기면 사용자가 세부사항을 알지 못해도 괜찮다는 장점이 있다. 그리고 이후에 실질적인 코드를 원하는 대로 수정할 수도 있다. 예를 들어 정렬 알고리즘을 함수로 추출하면 이를 쓰는 코드에 어떤 영향도 주지 않고 함수 성능을 최적화할 수 있다.자동차 제조업체와 엔지니어는 자동차 내부의 원하는 걸 마음대로 바꿀 수 있다. 작동만 제대로 된다면 사용자는 뭐가 바뀐지 전혀 모를 것이다. 여기선 추상화를 통해 변화로부터 코드를 보호하는 행위가 어떤 자유를 가져오는지 확인한다. 가장 간단한 추상화인 상수부터 알아본다.  상수 리터럴은 아무것도 설명하지 않는다. 따라서 코드에서 반복 등장할 때 문제가 된다. 이런 리터럴을 상수 프로퍼티로 변경하면 해당 값에 의미있는 이름을 ..
함수 내부의 추상화 레벨 통일하자 계층이 잘 분리되면 어떤 계층에서 작업할 때 그 아래의 계층은 이미 완성되어 있으므로, 전체를 이해할 필요없이 해당 계층만 생각하면 됩니다.  추상화 레벨 계층 레벨이 높아질 수록 물리 장치와 프로세서로부터 멀어집니다.높은 레벨일 수록 걱정해야 하는 세부적인 내용들이 적어져서 단순함을 얻지만, 제어력을 잃을 수 있습니다.예를 들어 C언어는 메모리 관리를 직접 할 수 있지만, 자바는 가비지 컬렉터가 자동으로 메모리를 관리해 줍니다.따라서 자바는 메모리 사용을 최적화하는 것이 힘듭니다.   추상화 레벨 통일 코드도 추상화를 계층처럼 만들어서 사용할 수 있으며, 이를 위한 기본적인 도구가 바로 함수입니다.함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙(Single Level of Abstract..
모의 면접 정리 sharedpreference란 앱의 데이터를 키값으로 저장 하도록 하는 안드로이드 클래스입니다 루팅을 통해 쉽게 정보가 보여집니다 그뿐만 아니라 동기적으로 작동하며 값을 읽거나 쓸 때 블로킹 될수 있습니다.  ui 스레드에거 사용할 경우 응답성을 저하 시킬 수 있습니다   RESTful API 설계 원칙 웹 표준을 활용하여 시스템 간의 상호 운용성을 제공하는 방법입니다. REST는 자원(Resource)의 표현(Representation)에 의한 상태 전달을 의미하며, 웹의 기본적인 기술과 프로토콜을 사용합니다. RESTful API의 핵심 원칙에는 자원의 식별, 메시지를 통한 자원의 조작, 자기 서술적 메시지, 애플리케이션 상태의 엔진으로서의 하이퍼미디어 등이 있습니다. 이러한 원칙을 통해 RESTf..
제네릭 타입과 variance 한정자 활용 다음과 같은 제네릭 클래스가 있다고 합시다.class Cup위의 코드에서 타입 파라미터 T는 variance 한정자(out 또는 in)가 없으므로, 기본적으로 invariant(불공변성)입니다.invariant(불공변성)라는 것은 제네릭 타입으로 만들어지는 타입들이 서로 관련성이 없다는 의미입니다.예를 들어 Cup와 Cup, Cup와 Cup은 어떠한 관련성도 갖지 않습니다. fun main() { val anys: Cup = Cup() // Error: type mismatch val nothing: Cup = Cup() // Error: type mismatch}만약에 어떤 관련성을 원한다면, out 또는 in이라는 variance 한정자를 붙입니다.out은 타입 파라미터를 covariant..