상속

코틀린

코틀린에서는 open 키워드를 사용해서 상속과 오버라이딩을 관리한다

따라서 클래스를 상속하기 위해선 open을 사용해야하고 override를 하게 하기위해선 open을 적어줘야한다

Override 할때에도 키워드를 적어줘야하고, super을 사용하는 방법 등은 다른 언어들과 유사하다

Interface

인터페이스는 기본적으로 오버라이딩을 전제로 설계되었기 때문에 따로 Open 키워드를 사용하지 않아도 상속 및 오버라이드가 가능하다

인터페이스는 왜쓰는걸까??

  1. 추상화
  2. 멀티 상속
  3. 유연성
  4. 캡슐화
  5. 유지보수 많은 이유들이 있고, 일단 기능별로 상속이 가능해서 사용하는 점이 큰 것같다

MVVM 요약

UI와 비지니스 로직을 엄격하게 분리하기 위해 MVVM 모델을 사용한다고 한다

코루틴

코틀린에서 코루틴 스코프라고 해서 비동기작업을 쉽게 작성할수 있도록 도와주는 경량 스레드와 같은 개념이다 기존의 스레드기반 비동기 처리보다 효율적이고, 비동기 작업도 동기적으로 코드를 작성할 수 있다.

뭐 여튼 하고픈 말은, suspend 함수는 코루틴 스코프에서만 호출해야한다. 하지만 runblocking 이라는 키워드를 사용하면 모든 비동기작업을 동기적으로 바꿔서 suspend함수를 테스트하거나 특정함수에서 사용할수 있게 해준다

그리고 코루틴 스코프 내에서 실행순서는 순차적이고 suspend함수는 끝날때까지 대기한다고 한다

// Main 함수에서 코루틴을 사용해 API 호출
fun main() = runBlocking {
  try {
    val response = recipeService.getCategories() // API 호출
    // 결과를 콘솔에 출력
    response.categories.forEach { category ->
    println("Category: ${category.strCategory}, Description: ${category.strCategoryDescription}")
    }
  } catch (e: Exception) {
    println("Error fetching categories: ${e.message}")
  }
}

API 요청

// Json 파일을 Retrofit객체로 변환한는 코드( 설정 다하고 마지막에 build ) ... 1
private val retrofit = Retrofit.Builder()
.baseUrl("https://www.themealdb.com/api/json/v1/1/")
.addConverterFactory(GsonConverterFactory.create())
.build()
 
// APiService 인터페이스의 구현체를 만드는 과정   ... 2
val recipeService = retrofit.create(ApiService::class.java)
 
// Api에 대한 프록시 객체가 될 인터페이스  ... 3
interface ApiService {
  @GET("categories.php")
  suspend fun getCategories(): CategoriesResponse
}

1 에서 api요청할 정보를 모두 입력하여 refrofit 객체를 만든다 2 에서 자신이 만든 인터페이스로 retrofit객체를 변환하는데 이것이 프록시 객체이다 프록시 객체는 그 안에 url 및 정보들이 미리 저장되어있고 메소드를 호출한는 것만으로 외부와 통신할수 있게한다 3 에서 categories.php 로 GET요청을 보내서 정보를 받아서 바로 Categories Response로 변환하는 과정이다

휴대폰 내에서 권한

안드로이드 스튜디오에서 휴대폰의 특정 기능을 사용하고 싶을 떄, Manifest에서 설정을 건드려줘야한다. 인터넷, 카메라 등등..

<!-- 가상 휴대폰에 권한을 줄때 여기 Manifest에서 권한을 부여해야 한다-->
<uses-permission android:name="android.permission.INTERNET" />