코틀린(Kotlin)/TIL

[코틀린(Kotlin)] 디버깅(Debugging)

초보왕보초 2024. 2. 1. 20:44
728x90

1. 디버깅이란?

  • 디버깅은 모든 소프트웨어에서 소스 코드의 오류 또는 버그를 찾아서 수정하는 과정이다
  • 소프트웨어가 예상대로 작동하지 않으면 프로그래머는 오류가 일어나는 원인을 알아내기 위해 코드를 분석한다
  • 디버깅 도구를 사용해 소프트웨어를 제어된 환경에서 실행하고 코드를 단계별로 확인하여 문제를 분석하고 수정한다

 

 

2. 디버깅의 중요성

  • 앱 개발 시간 단축
    - 초기 단계의 에러 발견으로 이후 시간 절약
    - 코드 흐름과 동작 방식 파악으로 유사 오류 빠르게 대응
    - 복잡한 문제를 단계별로 분해하여 효과적 관리
  • 품질 향상 및 사용자 경험 개선
    - 앱 안정성 증대로 사용자 신뢰 향상
    - 오류 감소로 사용자 경험 개선
    - 문제 원인 미리 파악으로 유지보수 용이성 향상
  • 개발자의 성장
    - 다양한 문제 대처 능력 향상
    - 프로젝트 흐름과 구조 파악으로 관리 능력 증진

 

 

3. 에러의 종류와 대응 방법

  • Syntax Error (구문 에러)
    - 코드의 문법적 오류 
    - 코드 문법 확인 및 편집기의 오류 표시 참조

- 자주 발생하는 StntaxError(구문 에러) 예시

더보기
1. 변수 타입 선언
: Kotlin은 변수의 타입을 자동으로 추론하지만, 자료형을 잘못 지정하거나
  필요한 경우에 지정하지 않으면 에러가 발생한다.
    // ex) Int 값을 String으로 선언
    val age: String = 25
    
    
2. Null Safety
: Kotlin은 null 안정성을 중요시한다. 따라서 null 값을 허용하지 않는 변수에
  null을 할당하려고 한다면 에러가 발생한다.  
    // ex) null 값을 허용하지 않는 String 변수에 null 할당
    var name: String = null
    해결 -> var name: String? = null
  
  
3. 함수 선언
: Java와 다르게 Kotlin에서 함수를 선언할 때는 fun 키워드를 사용한다.
    // ex) 'fun' 키워드 누락
    void display() {
        println("fun 키워드 누락")
    }
    
    
4. 클래스 상속
: Kotlin에서 클래스는 기본적으로 final이다. 따라서 클래스를 상속하려면 
  open 키워드를 추가해야 한다  
    // ex) Parent 클래스가 open으로 표시되지 않았기 때문에 에러 발생
    class Parent{}
    class Child : Parent()
    
    
5. 프로퍼티 초기화
: Kotlin에서는 프로퍼티(변수)를 선언할 때 초기값을 제공하거나, 나중에 초기화하겠다는 것을
  명시적으로 표시해야 한다
    // ex) 초기값이 없거나 lateinit 키워드 누락
    class User {
        var name: String
    }
    해결1. -> 초기값 제공 var name: String = "초기값 생성"
    해결2. -> lateinit var name : String
  • Logical Error (논리 에러)
    - 코드는 실행되지만 원하는 결과를 얻지 못할 때 발생
    - 로직 검토, 테스트 케이스 사용하여 오류 시나리오를 확인한다

- 자주 발생하는 LogicalError(논리 에러) 예시

더보기
1. 잘못된 범위 사용
: until과 ..의 차이를 헷갈려 잘못 사용하면 범위가 의도치 않게 설정될 수 있다
    for(i in 0 until 5) {
        println(i)
    }
    // 0, 1, 2, 3, 4 출력
    
    for(i in 0 .. 5) {
        println(i)
    }
    // 0, 1, 2, 3, 4, 5 출력
  • Runtime Error (런타임 에러)
    - 프로그램 실행 중에 발생하는 오류
    - Logcat을 통한 오류 메시지 분석 및 해당 코드 섹션 검토를 해준다

- 자주 발생하는 RuntimeError(런타임 에러) 예시

더보기
1. NullPointerException
: Null 참조를 사용하려고 할 때 발생한다
    // ex) !! 연산자 사용으로 강제 참조시도 시 NullPointerException 발생
    var name: String? = null
    println(name!!.length)
    
    
2. IndexOutOfBoundsException
: 잘못된 인덱스로 리스트나 배열에 접근하려고 할 때 발생한다
    // ex) 인덱스 범위 초과
    val numbers = listOf(1, 2, 3)
    println(numbers[5])
    
    
3. ClassCastException
: 잘못된 타입으로 객체를 변환하려고 할 때 발생한다
    // ex) Int 객체를 String으로 캐스팅하려고 시도
    val obj: Any = 12345
    val str: String = obj as String
    

4. ArithmeticException
: 수학적 계산 중에 예외 상황이 발생할 때
    // ex) 0으로 나눔
    val result = 5/0
    
    
5. NoSuchElementException
: 예상한 요소가 컬렉션에 없을 때 발생한다
    // ex) 5보다 큰 첫 번째 요소가 없음
    val numbers = listOf(1, 2, 3)
    println(numbers.first {it > 5} )
    
  
6. IllegalStateException
: 객체의 현재 상태가 작업을 수행하기에 적합하지 않을 때 발생한다
    // ex) 비어 있는 builder에서 인덱스 2의 문자를 가져오려고 함
    val builder = StringBuilder()
    val result = builder[2]
    
    
7. Resources.NotFoundException
: 안드로이드에서 특정 리소스(ID, 이미지 등)를 찾을 수 없을 때 발생한다
    // ex) 존재하지 않는 리소스 ID를 사용
    val color = resources.getColor(R.color.존재하지않는color)
728x90