ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • abstract vs open, 예외 처리
    Android 2024. 3. 11. 23:50

     

    문자에도 크기가 있다. 문자의 크기는 A < B < C < ... < a < b < ... < z 이다. 소문자가 대문자보다 더 크다.

    val str1 = "nqweASD"
    
    val str2 = str1.toCharArray() // ['n','q','w','e','A','S','D']
    
    str2 = str2.sortedArrayDescending() // ['w','q','n','e','S','D','A']
    // str1.sorted().reversed() 와 동일하다.
    
    String(str2) // "wqneSDA"
    // str.joinToString("") 와 동일하다.
    // print(str2.toString()) -> 원하는 문자열 결과값이 나오지 않는다

     

    중간 설명회를 들으면서 기억이 남은 점

    - 혼자 고민하는 시간도 중요하되, 일정 시간으로 두고, 그 시간이 지나면 튜터, 같은 팀원 등 외부에 도움 요청하기

    - 공식 문서를 참고해보는 연습하기

    - 인공지능 플랫폼 쓰지 말기

    - 개념이 당장 이해되지 않더라도 넘어가는 유연성 기르기

     

    첫번째 과제를 제출하면서 받은 피드백

    - readLine() 처럼 사용자로부터 입력값을 받아오는 명령어는 자식 클래스, 부모 클래스 등에서 구현하는 것이 아니라 main() 함수에서 구현하는 것이 좋다 → main() 함수 외의 메소드에서도 사용할 수 있다(단, 같은 코틀린 파일 내)

     

    Abstract, Open 의 차이점

    abstract 와 open 은 모두 상속과 관련된 개념이다. 부모 클래스의 선언부나 부모 클래스의 메소드에 붙여준다. 두 개념의 차이는 다음과 같다.

    • abstract : 추상 클래스는 객체(인스턴스)를 직접 생성할 수 없다. 추상 메소드는 구현없이 선언만 되어 있다. → 다형성 구현에 유용하다. 
    • open : 일반적 클래스에 속하므로, 단독으로 객체가 되어 사용가능하다. 객체없이도 클래스.메소드 형식으로 접근 가능하다.

    예외 처리

    예외 처리는 예외가 발생할 부분을 에러가 나지 않게 처리해주는 것을 의미한다.  try-catch-finally 문과 throw 문 외에도 require 이라는게 있다. 형태와 예시는 다음과 같다.

    1. try - catch - finally

    finally 문은 예외 발생 여부와 관계없이 항상 실행되며, 꼭 쓰지 않아도 된다.

    fun main() {
    	try {
        // 예외가 발생할 가능성이 있는 부분
        } catch(예외종류) { // 예외가 발생했을때 처리하는 부분
        } finally { // 예외 발생과 관계없이 항상 실행하는 코드
        }
    }

    2. throw 문

    fun main() {
    	if(num>10) {
        	throw 예외종류
        }
    }

    3. require 문

    require(만족시키길 바라는 부분) { 만족시키지 않았을 때 예외 발생}
    
    require(!value.isNullOrEmpty()) { "입력값은 공백이 될 수 없습니다!" } // 예시 1
    
    require(num2!=0) { ArithmeticException("0 으로 나눌 수 없습니다!") } // 예시 2
    •  

    위의 내용을 종합해서 실전 예외 처리 예시 코드를 살펴보자. 해당 코드는 try-catch 문을 통해서 문법적인 오류(null 값, 문자를 받아오는 경우) 를 예외 처리하였고, 문법적인 오류가 있지 않더라도 사용자가 원하는 지정 범위를 만족시키지 않으면 예외를 처리하도록 require 문을 설정하였다. 이때, require 문의 중괄호 내용을 콘솔에 출력하려면 print 함수를 써야한다. 그리고, 해당 require 문의 조건을 만족하지 않았을 경우 catch 문으로 넘어가 catch 문 내 문장도 같이 출력된다.

    print("지금 가지고 있는 돈을 입력하세요 : ")
    try {
        myMoney = readLine()?.toInt() ?: -1 
        require(myMoney>0) {"0보다 큰 값을 입력해주세요!"} // 0보다 작은 값을 받아오는 경우 catch 문으로 넘어감
       // require(myMoney>0) 만 써도 된다.
        break
    } catch (e: Exception) {
        println("잘못 입력했습니다!") // null 값을 받아오는 경우, 문자를 받아오는 경우 실행
    }

     

    require 문은 독립적으로 존재할때, 실행시 오류만 내고 끝낸다(빨간줄) 하지만 try catch 문 안쪽에 존재할 경우, catch 문으로 넘어가서 오류 메세지가 떠도 아예 종료되진 않는다. 이때, require 문 중괄호에 println 함수를 쓰지 않으면 해당 문구는 출력되지 않는다. 하지만, require 문에 조건이 안맞으면 catch 문으로 바로 넘어가 catch문의 문구가 출력된다.

    try {
            require(number.size in 3..13 && number.all { it in -1000..1000 }) { "조건이 충족되지 않았습니다!" }
            ... // 조건에 부합할 경우 실행할 코드
        } catch (e: Exception) {
            println("조건이 충족되지 않습니다!!!")
        }
    }

     

     

    require 문 대신 throw 예외 처리한 경우도 위와 같이 동작한다.

    try {
          if(number.size !in 3..13 || number.any { it !in -1000..1000 }) throw IllegalArgumentException("조건이 충족되지 않습니다!")
            ... // 조건에 부합할 경우 실행할 코드
        } catch (e: Exception) {
            println("조건이 충족되지 않습니다!!!")
        }
    }

     

     

    try-catch 문은 문법적인 오류가 아니더라도 사용자가 require, throw 문으로 직접 제한 사항을 설정하면, 그 제한사항을 지키지 않았을 경우에도 catch문으로 넘어가는 것 같다! (앱을 멈추지 않으면서!)

Designed by Tistory.