반응형

현재 저는 코딩 시 필요한 경우 ChatGPT의 도움을 받고 있습니다. 코드 분석 요청에 대해 다른 AI 서비스들는 어떠한 결과를 보여주는지 비교해보았습니다.

 

이는 단편적인 비교이며, AI 서비스가 계속해서 개선되고 있는 상황이기 때문에 어떤 것이 우위에 있다고 말할 수는 없습니다. 하지만 궁금하기도 하고 이러한 경우에 어느 정도의 결과를 보여주는지 참고하시라고 글을 작성합니다.

 

Bing Copilot, Bard, Notion AI, ChatGPT에 동일한 질문을 해서 결과가 어떻게 나오는지 살펴보았습니다.

 

이전에 포스팅한 메모리 누수 관련 글(아래 참조)에서 각 AI에 테스트 코드의 메모리 누수 검토를 요청했습니다.

2018.09.16 - 메모리 누수(Memory Leak) 이야기 & LeakCanary 를 이용한 메모리 누수 검출

 

1. Bing Copilot

대화 스타일이 균형인 경우 처음에는 메모리 누수가 발생하지 않았다고 하다가 갑자기 뒤에서는 메모리가 해제되지 않는다라고 설명합니다.

메모리 해제하는 코드를 제시해주는 것으로 보아, 메모리 누수에 대해서 인지하고 해결책을 주지만 설명이 매끄럽지는 않습니다.

대화 스타일을 창의적으로 변경하면, 조금 다른 방법으로 답변을 주는데, 이 또한 메모리 누수를 해결하는 방법으로 적절한 답변입니다. 

대화 스타일을 정밀로 선택하면, 코드는 같이 보여주지 않지만, 간결하게 해결방법을 설명해주고 있습니다.

 

"코드를 수정해주세요"라고 된 버튼을 클릭하면, 아래처럼 수정된 코드를 보여줍니다.

2. Bard

제가 테스트한 시점에 Bard가 실험단계라고 알려줍니다. 그래서 그런지 좀 불안하고 갈팡질팡하는 답변을 보여줍니다.

앞서 Bing Copilot에 입력한 것과 동일한 내용을 프롬프트에 입력하니 "As a language model, I'm not able to assist ou with that" 답변을 주어, 마치 코드를 해석하고 분석하는 것을 지원하지 않는 것처럼 답변을 주고 있습니다.

하지만 내용을 달리해서 프롬프트에 이어서 다시 질문을 하니, 아래처럼 자신이 아직 개발 중인 상태라고 답변을 주고, 메모리 누수되는 부분을 찾아서 해결 방법을 제시해줍니다. 

왜 처음에는 제대로 답변을 하지 못했는지에 대해서 물으니 역시 "개발 중이고 학습상태"인데, 이전에 본 코드와 다르기 때문에 분석하지 못했다고 합니다. 음... 솔직하네요 ㅎㅎ

Bard는 향후 어떻게 더 발전할지 모르겠지만, 실험단계인 현시점에서 다른 AI 서비스 대비 여러번 질의해야 답변을 받을 수 있는 경우가 있을 것 같습니다.

 

3. Notion AI

Notion AI로 이렇게 코드를 분석해달라고 해본 적은 없었지만, 프로픔트에 요청한 결과, 잘못된 답변을 줍니다.

아무래도 Notion AI는 글쓰기, 글요약, 글의 내용을 향상하고 꾸미는데 최적화된 것 같다는 생각이 듭니다.

4. ChatGPT

어느 순간부터 코딩시 도움을 받을 때는 ChatGPT만 사용했는데, 결과물을 보니 당분간은 계속 ChatGPT를 사용하는 게 좋을 것 같다는 생각이 듭니다.

 

간결하면서 딱 필요한 설명을 하지만, 정확히 어느 부분을 수정했는지에 대한 커멘트까지 표시를 해줍니다.

앞서 말했듯이, 이는 단편적인 비교이고, 아직 개발중인 AI 서비스가 포함되어 있기에 현 시점에서는 ChatGPT가 우위에 있는 것으로 보이지만, 향후 다른 AI 서비스도 안정화되면 다시 한번 비교해보는 기회를 가져볼 것 입니다.

 

읽어주셔서 감사합니다.

반응형

계정입력없이도 깃허브 토큰을 이용해서 로그인이 가능합니다.

먼저 아래 사이트에 접속합니다.

https://github.com/settings/tokens

 

 

GitHub: Where the world builds software

GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

'Generate new token' 버튼을 클릭합니다.

Note에는 간단한 설명을 적어줍니다.
Scopes에서 repo, admin:org, gist를 체크해서 토큰을 발급받습니다. (Generate token 버튼을 클릭)

생성된 토큰을 복사해서 안드로이드 스튜디오 깃허브 로그인창의 Use Token 을 클릭합니다.

아래 Token 입력창에 복사해온 토큰을 넣고, Log in 버튼을 클릭하면 됩니다.

이상 끝.

반응형

Night mode 의 각 모드에 대한 설명과 각 모드가 어떻게 동작하는지 예제를 만들어보았습니다.

 

먼저 Night mode는 아래와 같은 모드를 가지고 있습니다.

모드명 설명 참고
MODE_NIGHT_UNSPECIFIED 야간 모드에 대해 지정되지 않은 모드입니다. 기본 야간 모드를 사용하기 위해 이것은 주로 setLocalNightMode ()와 함께 사용되어 기본 야간 모드를 사용할 수 있도록합니다.

기본 모드와 로컬 야간 모드가 모두 이 값으로 설정된 경우에는MODE_NIGHT_FOLLOW_SYSTEM의 기본값이 적용됩니다.
MODE_NIGHT_FOLLOW_SYSTEM 시스템의 설정에 따라서 동작  
MODE_NIGHT_AUTO_TIME 시간(일출/일몰)에 따른 동작 Deprecated 됨
MODE_NIGHT_NO 동작안하도록 함  
MODE_NIGHT_YES 동작하도록 함  
MODE_NIGHT_AUTO_BATTERY 절전모드시 동작하도록 함  

실제 Night mode 동작 확인을 위해 각 모드별 버튼을 만들어서 버튼을 클릭한 이후 어떻게 동작하는지 확인합니다.

class MainActivity() : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        val modeNightText = mapOf(-100 to "MODE_NIGHT_UNSPECIFIED", -1 to "MODE_NIGHT_FOLLOW_SYSTEM",
                0 to "MODE_NIGHT_AUTO_TIME", 1 to "MODE_NIGHT_NO",
                2 to "MODE_NIGHT_YES", 3 to "MODE_NIGHT_AUTO_BATTERY")

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textModeNight : TextView = findViewById(R.id.tvModeNight)

        findViewById<View>(R.id.btnModeNightFollowSystem).setOnClickListener {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
            textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
        }
        findViewById<View>(R.id.btnModeNightAutoTime).setOnClickListener {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME)
            textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
        }
        findViewById<View>(R.id.btnModeNightNo).setOnClickListener{
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
            textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
        }
        findViewById<View>(R.id.btnModeNightYes).setOnClickListener {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
            textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
        }
        findViewById<View>(R.id.btnModeNightAutoBattery).setOnClickListener {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY)
            textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
        }

        textModeNight.text = modeNightText[AppCompatDelegate.getDefaultNightMode()]
    }
}

 

나이트 모드별 버튼을 가지고 있고, 마지막 버튼 아래에는 현재 동작중인 모드가 무엇인지 테스트 표시됩니다.

 

시간(주/야), 절전여부, 시스템 설정(Night mode 여부)에 따른 동작 결과

주간 / 절전 x / 시스템 설정 (Night mode x)

 

주간 / 절전 x / 시스템 설정 (Night mode o)

 

주간 / 절전 o / 시스템 설정 (Night mode x)  

 

주간 / 절전 o / 시스템 설정 (Night mode o)

 

야간 / 절전 x / 시스템 설정 (Night mode x)

 

야간 / 절전 x / 시스템 설정 (Night mode o)

 

야간 / 절전 o / 시스템 설정 (Night mode x)

 

야간 / 절전 o / 시스템 설정 (Night mode o)

 

 

반응형

안드로이드 레이아웃 XML의 android:visibility 속성은 View를 보이거나 사라지게 하는 역할을 하며 3가지 상태(visible, invisible, gone)가 있습니다.

 

디폴트는 visible이라서 별도로 아래처럼 명시하지 않더라도 View는 보이게 됩니다.

다른 2가지 상태인 invisible과 gone은 View를 사라지게 합니다.

다만 이 둘의 차이는 invisible은 View 공간을 유지하면서 사리지고, gone은 View 공간을 유지하지 않고 사라집니다.

 

이게 무슨 의미가 있겠냐 싶지만 분명히 존재의 의미가 있고 필요하다는 것을 아래 예를 들어보도록 하겠습니다.

 

먼저 간단하게 아래와 같이 이미지 버튼으로 4개와 1개의 텍스트 뷰로 구성된 ConstraintLayout을 만들었습니다.

가운데 3개의 이미지 버튼들은 Spread 스타일의 Chain으로 만들어져 있습니다.

위쪽 이미지 버튼과 아래쪽 텍스트 뷰의 경우 각각 가운데 이미지 버튼들과 가장자리 위치의 중간되는 곳에 위치하고 있습니다.

 

정중앙 버튼의 android:visibility 속성을 invisible과 gone으로 변경해서 테스트해보겠습니다.

관찰 포인트는 가로로 버튼들이 균등하게 위치 여부,

                  상단 이미지 버튼과 하단의 텍스트뷰의 원래 위치 유지 여부 입니다.

 


#테스트 1 (android:visibility="invisible" 로 설정한 경우)

아래 왼쪽 그림에 정중간 버튼이 사라진 것이 확인되고, 오른쪽 그림(Blueprint)에는 정중간 버튼이 공간을 유지하고 있는 것이 확인됩니다. 다른 뷰와의 연결도 문제가 없고, 모든 뷰들의 위치도 동일합니다.

다만, 가운데 이미지 버튼들이 하나 사라졌음에도 나머지 2개의 버튼들이 다시 정렬되어서 균등하게 위치되지 않고 원래 자리를 유지하고 있습니다.

용도: 다른 뷰의 위치와 크기에 영향을 주지 않고 사라지게 할 목적인 경우에 유용


#테스트 2 (android:visibility="gone" 으로 설정한 경우)

마찬가지 중간 버튼이 사라졌지만, 오른쪽 그림(Blueprint)에는 원래 자리를 차지하고 있던 위치에 공간이 제거되었으며 다른 뷰들의 위치가 조금씩 이동된 것이 확인됩니다.

위치가 변경되면 안되는 상단의 이미지 버튼과 하단의 텍스트 뷰까지 조금씩 위치가 바뀌었습니다. (마지막에 추가 설명)

그렇지만, 가운데 이미지 버튼들의 경우 남아있던 나머지 2개가 다시 정렬되면서 균등하게 위차하고 있습니다.

용도: 사라지는 뷰와 연동해서 다른 뷰들의 위치나 크기 조절이 필요한 경우에 유용

상단의 이미지 버튼과 하단의 텍스트 뷰의 경우 위치가 이동이 되었는데 이유는 아래 그림을 참조하시면 됩니다.

정중앙 버튼(id=>imageButtonCenter)의 Bottom과 Parent의 Bottom 간의 중앙에 위치하도록 되어 있는데, 정중앙 버튼이 사라지면서 공간도 제거되고 연결된 것도 우측 이미지 버튼의 가운데를 가르키면서 전체적으로 위쪽으로 조금씩 이동하게 된 것입니다.

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Are you ready?"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/imageButtonCenter" />

 

이제 어떤 경우에 View의 invisible 또는 gone을 사용하는지 이해가 되셨을 것으로 생각됩니다.

이번 글은 여기까지입니다. 읽어주셔서 감사합니다.

반응형

이전 프로젝트를 AndroidX로 변경하고 그에 따른 아티팩트들과 최신 안드로이드 스튜디오에 맞게 Gradle 등 빌드 환경을 조정해주고 빌드한 것 실행해보니 몇가지 런타임 오류가 발생하였습니다.

 

[오류 #1 ]

 java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/appcompat/R$drawable;

 

먼저 오류 해결하는데 시간이 제일 많이 걸린 androidx/appcompat/R$drawable 클래스를 찾지 못하는 문제는 결론적으로 Realm 쪽 문제였습니다.

AndroidX 적용시 이전 버전의 Realm에서 발생하는 문제

일반적으로 새로운 버전이 나오면 Lint에서 체크해서 하이라이트해서 보여주는데 Realm은 하이라이트가 되어 있지 않아서 이게 문제될 거라고는 생각하지 못했습니다.

 

나중에 문제 재확인차 이전 버전으로 돌리니 그제서야 아래처럼 하이라이트되어서 표시되네요.

build.gradle (project 레벨)에서 realm 플러그인을 7.0.0 버전으로 변경해주면 문제가 해결됩니다.

newer version lint check / realm

[오류 #2]

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.art/javalib/core-oj.jar)

 

이번에는 메서드를 찾지 못해서 발생한 문제였는데, 오류 메시지에 Lambda 가 보이는 걸로 봐서 JAVA 1.8 지원하지 안하서 발생한 것으로 판단이 되었습니다.

이 런타임오류는 아래 compileOPtions를 build.gradle (app 레벨)에 추가해주면 해결됩니다.

주의할 점

오류 수정한 코드에 해당하는 build.gradle 파일에서 Sync now(또는 File-Sync Project with Gradle Files)를 해준 후에 Build-Clean Project 후 빌드하시면 됩니다. (정리하면 Sync - Clean - Build)

 

이상입니다. 도움이 되셨기를...

반응형

제가 사용 중인 괜찮은 툴 소개해드립니다.

 

Codota (코도타)라는 툴인데 설치는 안드로이드 스튜디오의 플러그인(File-Settings-Plugins)에서 Codota를 검색하셔서 설치하면 됩니다.

 

플러그인 설치하는 방법을 모르시면 아래에 링크를 보시면 쉽게 하실 수 있습니다. 정말 간단합니다..

안드로이드 스튜디오에 설치방법

https://www.codota.com/get#android-studio

 

Codota - AI Code Completions for your IDE

Codota understands the world's code and provides you with the right suggestion at the right time

www.codota.com


Codota(코도타)?

Codota는 코딩 보조툴로 아래에 플러그인을 보면 AI Code completions이라고 간단히 기술되어 있습니다.

 

Android studio plugin: Codota

그런데, 코드 완성(Code completions) 기능은 안드로이드 스튜디오에서 자체 내장되어 있으며 메뉴(Code-Completion)에 세부 설정 변경도 가능합니다.

 

그러면, Codota는 안드로이드 스튜디오의 자동 완성 기능과 어떤 차별점을 가지고 있을까요?

AI 기반 (학습에 의한 코드 제시)

개발자가 코드 입력 시머신러닝 기반으로 제안된 Code completion의 작동합니다.

즉, 수백만 개의 소스 코드들에서 학습한 결과를 제시해서 보여줍니다.

 

아래 중에 어떤 것이 코딩하는데 더 도움을 줄까요?

[왼쪽: Codota의 Code completion] - [오른쪽: Android studio의 Code complettion]

Codota의 Code completion이 시각적으로도 그렇고, 통계적으로 정렬해서 이후 사용 가능성이 있는 메서드를 추천해주고 있습니다.

[왼쪽: Codota의 Code completion] - [오른쪽: Android studio의 Code complettion]

 

스니펫 제공

메서드를 사용한 예제(스니펫)가 필요할 경우에는 해당 메서드에 커서를 올려두고 우측 클릭 후 나오는 콘텍스트 메뉴에서 Get relevant examples 또는 단축키로 Ctrl+Shift+O 를 누르면 훌륭한 스니펫이 제공됩니다.

해당 메서드에서 우측 클릭후 나오는 콘텍스트 메뉴

위의 setOnClickListener에 대해서 관련 스니펫을 요청한 경우에 아래의 오른쪽과 같이 제공됩니다. 

우측에 나타나는 해당 메서드의 스니펫들

저의 경우에 Ctrl 키를 두 번 클릭해서 스니펫들을 볼 수 있도록 설정해서 사용하고 있습니다.

(Codota의 설정(Welcome - settings)에 가면 옵션이 존재합니다) 

 

Codota의 대략적인 소개는 여기까지이며 개발하는데 도움이 되길 바랍니다.

 

+ Recent posts