| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- submodule sourcetree
- Kotlin
- GIT
- 코틀린
- 쿼터뷰
- 유니티
- Android Studio
- 서브모듈 pull
- Unity
- 2d게임
- 목서버
- 개발
- 안드로이드개발
- 안드로이드
- java
- 티스토리
- gitlab submodule
- 게임개발
- github submodule
- github
- 앱개발
- DataBinding
- 타이쿤
- 안드로이이드 submodule
- 카페오냥
- 내 맘대로 정리한 안드로이드
- 앱
- 서브모듈 sourcetree
- firebase
- Android
- Today
- Total
목록Android (25)
Uing? Uing!!
기본적으로, 하나의 패키지명은 하나의 고유한 앱을 의미한다. 그리고, 같은 패키지명을 가진 앱은 같은 기기에 설치될 수 없다. 그러므로, 같은 앱은 기기에 두 개 이상 설치할 수 없다. 하지만 같은 종류의 앱을 여러 타입, 또는 여러 버전으로 나누어 빌드하고 싶을 수도 있다. 아래 두 상황을 대표적인 예로 들 수 있다. (공식 문서에서도 이 두 가지를 예로 들어 설명한다.) 1) 출시용과 디버그용 앱을 분리하기 위해서 - 이 경우 디버그용 앱에는 몇 가지 기능들이 추가될 것이다. 2) 무료앱과 유료앱을 분리하기 위해서 - 이 경우 무료앱에서는 유료앱의 기능들이 잠김 상태로 표시될 것이다. 이런 경우에 사용할 수 있는 것이 Build Varients(빌드 변형)이다. Build Varients(빌드 변형)..
MVVM 구조를 사용한다면 흔히 뷰모델에서 LiveData를 사용하여 데이터나 이벤트를 변경하고, 액티비티 등의 onCreate 부에서 이 LiveData에 Observer를 달아 데이터가 변경되었을 때 화면에 반영하곤 한다. 그렇다면 이렇게 설계했을 때에는 항상, Q. LiveData로 들어가는 모든 값들이 observe될 수 있을까? 결론만 말하자면, NO이다. 두 가지 이유가 있는데 하나는 1) observer의 상태, 다른 하나는 2) postValue의 동작 방식과 관련이 있다. 1) Observer가 Active하지 않은 경우 기본적으로 LiveData는 액티비티, 프래그먼트 등의 수명주기와 긴밀하게 연결되어 작동한다. 특히 안드로이드 Developers의 LiveData 개요를 보면 이런 설..
아래 코드는 Animal이라는 클래스와 이를 상속받은 Dog와 Cat이라는 클래스이다. open class Animal { open fun makeSound() { println("making sound...") } } class Dog : Animal() { override fun makeSound() { println("bark!") } } class Cat : Animal() { override fun makeSound() { println("meow~") } } Animal 클래스의 인스턴스에 대해 makeSound() 메소드를 호출하면 "making sound..."라는 결과값이 출력된다. 반면 Dog, Cat 클래스의 인스턴스에 대해서는 이 문자열이 아닌 "bark!" 또는 "meow~"만이 ..
생성자(constructor) 클래스의 생성자를 설정하는 데에는 다양한 방법이 있다. 아래처럼 주 생성자를 설정하는 방법이 가장 대표적이라고 할 수 있겠다. class Dog(val name: String, val age: Int) 하지만 여러 종류의 생성자가 필요한 경우도 있다. 이를테면 name, age 중 일부만 가지고 생성하고 싶다면 이렇게 쓸 수 있을 것이다. class Person { private var name: String = "" private var age: Int = 0 constructor() constructor(name: String) { this.name = name } constructor(name: String, age: Int) { this.name = name this..
dp, sp, px 안드로이드에서 폰트 크기를 설정할 때 나는 일반적으로 sp를 사용한다. 다만 실제 디자인에서는 상황에 따라 sp가 아닌 dp, 심지어 px를 사용하는 경우도 있다. 안드로이드 개발자 문서에서는 dp와 sp, px에 대해 이렇게 설명한다. dp (밀도 독립형 픽셀) - 화면의 물리적인 밀도에 기반한 추상적인 단위입니다. 이 단위는 160dpi(인치당 도트 수) 화면에 상대적이며 화면에서 1dp는 대략 1px와 같습니다. 더 높은 밀도의 화면에서 실행한다면 1dp를 그리는 데 사용되는 픽셀의 수는 화면의 dpi에 적절한 배율로 확장됩니다. 마찬가지로 더 낮은 밀도 화면에서 실행한다면 1dp에 사용되는 픽셀 수는 축소됩니다. dp 대 픽셀의 비율은 화면 밀도에 따라 달라지지만, 반드시 정비..
사건의 발단 프로젝트 내에 구현할 인터페이스가 있었고, 이 인터페이스에 맞추어 구현한 객체가 있었다. 분명히 인터페이스에서 요구하는 모든 메소드를 다 구현한 상황이었다. 그런데 잘만 작동하던 코드가 갑자기 메소드가 구현되지 않았다며 java.lang.AbstractMethodError를 뽑아내는 것이다! 삽질의 과정 다시 확인해 봐도 메소드는 다 구현되어 있었다. 가장 최근에 수정한 코드가 무엇인가 생각해 보니, 이 메소드의 파라미터들을 수정했었다. 뭔가 파라미터의 내용과 순서를 바꾸는 과정에서 이전 빌드 내용과 충돌이 일어난 게 아닐까 싶었다. 삽질의 결과 나름대로 헤맨 것 치고는 해결법은 단순했다. 안드로이드 스튜디오에서 clean build -> rebuild를 하였더니 바로 해결되었다. 결론이 너..
dp to px 안드로이드에서 크기를 다루다 보면 Dp(Density-Independent Pixel)에서 px(pixel)로 변환해 사용해야 하는 경우가 있다. dp에서 px로 변화하는 방법으로는 두 가지가 있다. 1. 전역 함수 정의하기 아래와 같은 dp2px 함수를 UIUtil 등의 object 안에 정의하거나, 또는 그냥 전역 함수로 정의하여 사용할 수 있다. fun dp2px(dp: Float, context: Context) = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics) val px = dp2px(dp, context) 2. Resources.getDimensionPix..
꿈에 그리던 회사의 문턱 안으로 들어섰다.서류 등록부터 최종 면접까지는 총 5개의 절차가 있었고, 절차를 다 밟기까지는 무려 2달이라는 긴 시간이 걸렸다.매 절차마다 무언가를 준비했고 또 무언가를 배웠다. 그걸 잊지 않고자 이 글을 작성한다.(혹시라도 팀원분이 이 글을 발견하게 된다면 몹시 부끄러워질 것 같아서 기업명은 검색에 안 잡히게 줄였다.) 지원 계기8월 수료를 앞두고 5월쯤 취준을 시작했다.아직 수료까지 3달이 남은 데다, 수료하고 졸업을 미뤄도 되는 상황이어서 마음이 꽤 여유로웠던 것 같다.경력도 없는 주제에 새내기때부터 늘 꿈만 꾸던 기업의 경력 수시채용을 바로 기웃거렸으니 말이다. 홈페이지의 수시채용란에는 안드로이드 개발 관련 채용공고가 여러 개 올라와 있엇다.그중 몇몇은 내 관심분야와 맞..