전체 글

전체 글

    [Android] MVVM 패턴 적용기 - 2

    GitHub - k906506/MVVM: 🔨 MVVM이 뭐에요? 🔨 MVVM이 뭐에요? Contribute to k906506/MVVM development by creating an account on GitHub. github.com MVVM 두 번째 시간이다. 갑작스럽게 찾아온 이유는 졸프를 진행하다가 RecyclerView 를 Room 을 사용해서 MVVM 패턴 으로 구현했는데 정상적으로 작동하지 않아서 RecyclerView + Room + MVVM 을 정리하고 코드를 다시 보려고 한다. 우선 MVVM 을 구현하기 위해서는 위의 그림을 이해하고 넘어가는 것이 좋다. 그림에서 주의깊게 봐야할 것은 화살표의 방향 이다. 모든 화살표가 단방향으로 연결 되어있고 상위 요소는 하위 요소를 참조한다. 참조..

    [코틀린 완전정복] 공변성, 반공변성, 무변성

    가변성 변할 수 있다? 가변성이 뭐에요? 🙄 코틀린 에서의 가변성은 형식 매개변수가 클래스 계층에 영향을 주는 것을 말한다. 예를 들어 형식 A의 값이 필요한 모든 클래스에 형식 B의 값을 넣어도 문제가 없다면 B는 A의 하위 형식이 된다. 아래 코드를 보자. val integer : Int = 1 val number : Number = integer // Number는 상위 자료형, Int는 하위 자료형 Int형으로 선언한 integer 변수가 Number형으로 선언한 number 변수에 할당해도 아무 문제가 없는 것을 볼 수 있다. 이게 바로 가변성이다. 또 다른 예로는 Int?와 Int가 있다. Int?는 null도 포함하므로 Int?가 Int의 상위 자료형이 된다. 가변성의 3가지 유형 기본적으로..

    [코틀린 완전정복] 제네릭

    제네릭 제네릭 , 다른 언어를 이미 경험하고 왔다면 낯선 단어는 아니다. 뭐 대충 얘기하면 자료형 을 나중에 선언하는? 그런 느낌이다. 우선 확실하게 집고 넘어가보자. 그래서 제네릭이 뭐고 왜 쓰는거에요? 🤔 제네릭 은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정하는 방법이다. 제네릭이 나오게 된 배경은 자료형의 객체들을 다루는 메소드나 클래스에서 컴파일 시간에 자료형을 검사하여 적당한 자료형을 선택하기 위해서이다. 제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안정성을 높이고 형 변환의 번거로움이 줄어든다. 제네릭의 사용 방법 제네릭은 앵글 브래킷 사이에 형식 매개변수 를 넣어 선언하고 하나 이상의 형식 매개변수를 지정할 수 있다. 형식 매개변수는 자..

    [코틀린 완전정복] 여러 종류의 클래스

    보통 클래스 는 속성과 동작을 가지기 때문에 프로퍼티 와 메소드 를 멤버로 가진다. 먄약 특정 동작을 가지지 않고 오로지 데이터 저장을 위해 사용한다면 일반적인 클래스에서의 구현 부분은 필요가 없을 것이다. 구현부를 작성하지 않으면 그만큼 메모리를 덜 사용하게 되고 자원의 낭비를 막을 수 있게 될 것이다. 이처럼 코틀린에서는 데이터 저장을 위한 클래스가 있는데 바로 데이터 클래스 이다. 데이터 클래스 보통 데이터 전달을 위한 객체를 DTO(Data Transfer Object) 라고 부른다. 구현 로직을 가지고 있지 않고 순수한 데이터 객체를 표현하기 때문에 속성과 속성에 접근하고자 하는 게터와 세터 를 가진다. 추가적으로 toString(), equals() 과 같은 데이터를 표현하거나 비교하는 메소드..

    [코틀린 완전정복] 추상 클래스와 인터페이스

    추상 클래스 추상 클래스 VS 인터페이스 추상 클래스 는 대략적인 설계의 명세와 공통의 기능을 구현한 클래스이다. 즉, 구체적이지 않은 것이다. 추상 클래스 를 상속하는 하위 클래스 는 추상 클래스의 내용을 더 구체화 해야 한다. 오잉? 그럼 추상 클래스랑 인터페이스는 같은 거 아냐? 🤔 엄밀히 말하면 다르다. 인터페이스 역시 대략적인 설계 명세를 구현하고 인터페이스 를 상속하는 하위 클래스 에서 이를 구체화하는 것은 동일하다. 하지만 인터페이스에서는 프로퍼티의 상태 정보를 저장할 수 없다. 다시 말하면 인터페이스 에서는 프로퍼티의 초기화 가 불가능하다는 것이다. interface Vehicle { val name : String val color : String val weight : Double } ..

    [TIL] 22.04.20

    공부한 것 정처기 21년 3회차 알게된 것 [1과목] 소프트웨어 설계 1. 람바우 분석 기법 - 객체 모델링 -> 동적 모델링 -> 기능 모델링 순으로 진헹 - 객체 모델링 : 정보 모델링이라고도 부르며 클래스 다이어그램을 작성 - 동적 모델링 : 상태 다이어그램을 작성 - 기능 모델링 : 자료 흐름도(Data Flow Diagram)을 작성 2. 요구사항 개발 프로세스 도출(요구사항 수집) -> 분석 -> 명세 -> 확인(요구사항 검증) 3. 애자일 개발 프로세스 - 익스트림 프로그래밍 : XP, 고객과 함꼐 2주 정도의 반복 개발, TDD - 스크럼 : 30일마다 동작 가능한 제품을 제공하는 스프린트 개발 4. UML 관계 - 일반화 : Generalization, 실선 삼각 화살표, 일반적인 것과 ..

    [TIL] 22.04.18

    공부한 것 정처기 21년 1회차 알게된 것 [1과목] 소프트웨어 설계 1. 디자인 패턴 - 생성 패턴 : 추상 팩토리, 빌더, 팩토리 메소드, 프로토타입, 싱글톤 - 구조 패턴 : 어댑터, 브리지, 컴퍼지트, 데코레이터, 퍼사드, 프록시 - 행위 패턴 : 커맨트, 옵저버, 전략, 상태 2. 객체지향 분석 방법론 - Cord-Yourdon : E-R 다이어그램을 사용하여 객체의 행위를 데이터 모델링 하는데 초점 3. 소프트웨어 시스템 분석 - 플랫폼 기능 분석 - 플랫폼 성능 특성 분석 - 운영체제 분석 - 네트워크 분석 - DBMS 분석 4. UML - 클래스 다이어그램 : 시스템을 구성하는 클래스들 사이의 관계를 표시 - 액티비티 다이어그램 : 시스템 내부에 존재하는 여러 행위와 분기 및 조건을 표시 ..

    [TIL] 22.04.17

    공부한 것 정처기 22년 1회차 알게된 것 [1과목] 소프트웨어 설계 1. 소프트웨어 설계 방법 - 상향식 설계 방법 : 바텀업, 작은 문제를 해결하여 큰 문제로 통합, 객체 지향 프로그래밍 (Java) - 하향식 설계 방법 : 탑다운, 큰 문제를 작은 문제로 분해, 절차 중심 프로그래밍 (C) 2. 데이터 흐름도 - 프로세스 : 원 - 데이터 흐름 : 화살표 - 데이터 저장 : 평행선 - 종료 : 사각형 3. UI 설계 도구 - 와이어 프레임 : 페이지에 대한 대략적인 레이아웃 및 UI 요소 설계 - 목업 : 와이어 프레임에서 디자인, 사용 방법 설명, 평가를 위해 실제 화면과 유사하도록 UI를 변경 (정적) - 스토리보드 : 와이어 프레임에서 콘텐츠 설명, 흐름도 추가 - 프로토타입 : 와이어 프레임..

    [Android] MVVM 패턴 적용기 - 1

    GitHub - k906506/MVVM: 🔨 MVVM이 뭐에요? 🔨 MVVM이 뭐에요? Contribute to k906506/MVVM development by creating an account on GitHub. github.com 요즘 MVVM 에 대해서 공부하고 있다. 지금까지 앱 구현할 때 그냥 액티비티에 다 때려박았었는데 모델이랑 뷰가 너무 강하게 결합되어 있는 느낌이 강했다. 또한 대부분의 로직을 뷰(액티비티)에서 처리하고 하고 있었고 재사용성이 매우 떨어졌었다. 실제로 겨울방학에 진행했던 글로벌인재트랙 때 어플 을 하나 만들었고 나름 분리한다고 분리했는데 진짜 재사용성이 0 이었다. MVC 가 구현하기는 정말 편했지만 이 기회에 패턴 공부도 할겸 MVVM 을 접하게 되었다. 물론 MVC ..

    [백트래킹 / Kotlin] BOJ 14889 - 스타트와 링크

    문제 풀이 언어 Kotlin 코드 import java.lang.Integer.min import java.util.* import kotlin.math.abs import kotlin.system.exitProcess lateinit var board: Array lateinit var visited: Array var min_value = Int.MAX_VALUE var n = 0 fun main() = with(Scanner(System.`in`)) { n = nextInt() board = Array(n) { Array(n) { nextInt() } } visited = Array(n) { 0 } search(0, 0) println(min_value) } fun search(index: Int,..