Powerful Functional and OOP in Kotlin
언제 끝날까 했던 코틀린 기초 강의 글이 끝나네요!! 사실 이걸로 코틀린을 마스터할 수 없지만, 어느 정도 코틀린의 문법에 대해서 배워보았다는 수준은 가능한 것 같습니다. 이번 강의에서는 클래스의 구조화 선언과 에러 핸들링에 대해서 배워볼 예정입니다. 이다음 강의가 끝나면 코틀린을 이용한 애플리케이션 개발 혹은 함수형 언어로서의 코틀린 언어 둘 중 하나를 선택해 강의를 해볼까 생각합니다.. 고민 중😜
class to Struct
코틀린은 현대적 프로그래밍 언어의 장점이나 기능을 많이 포함하고 있습니다. 뭐 예를 들면 오늘 배워볼 클래스의 구조화 개념입니다. 어려운 개념은 아니기 때문에 코드를 보고 슼 넘어가겠지만요, 이해를 돕기 위해 파이썬, C언어 코드를 예로 들어 학습해볼 예정입니다. 굳이 이렇게 많은 언어와 대조를 해가면서 배워볼 필요가 있을까요?라는 생각을 할 수 있지만, 기존에 다른 언어에 대해서 어느 정도 학습하신 분이라면 다른 비슷한 구조의 코드를 보면 감을 잡기 쉽습니다. 그리고 초심자 또한 다른 언어에서의 의미론적으로 비슷한 코드 구현이 어떻게 진행되는지 확인할 수 있으니 이해가 좀 더 쉬워질 수 있는 거죠!!
/* Python */
class Foo:
def __init__(self, foo, bar) -> None:
super().__init__()
self.foo = foo
self.bar = bar
def __call__(self):
return (self.foo, self.bar)
if __name__ == "__main__":
fooMaster = Foo(11, 12)
foo,bar = fooMaster()
print(foo, bar)
한... 싱크로율 80-90% 정도 된다고 해야 할까요? 코틀린의 클래스 구조화와 비슷하게 구현됩니다. 물론 구조론적 관점에서 그렇다는 말입니다. Foo() 클래스를 우리는 호출 객체로 생성해서 11,12 값을 넣어 fooMaster 변수를 생성했습니다. 그리고 foo, bar는 fooMaster가 호출 객체로 동작할 때 클래스 내부의 값을 언패킹 해서 받게 됩니다. 한번 C언어를 볼까요?
/* C Language */
#include <stdio.h>
#include <stdlib.h>
typedef struct Foo{
int var;
char *name;
union Bar{
char *schoolName;
}Bar;
struct Foo *nextStu;
}Foo;
int
main()
{
Foo *foo = malloc(sizeof(Foo));
foo->var = 10;
foo->name = "Gildong";
foo->Bar.schoolName = "korea";
printf("Id : %d\t Name : %s\t SchoolName : %s\n",
foo->var, foo->name, foo->Bar.schoolName);
return 0;
}
C언어에서는 클래스 개념이 없습니다. 하지만 변수들의 구조화를 생성하는 struct가 있기 때문에 위와 같이 변수를 각각의 구조체 내부에 변수에 매핑하는 것이 가능합니다. 하지만 파이썬과 코틀린과의 차이점이라고 한다면, packing, unpacking이라는 개념이 존재하지 않기 때문에 코틀린과 그렇게 비슷하진 않습니다. 하지만 변수들의 구조화라는 측면에서의 의미론적인 관점은 어느 정도 비슷해지게 되는 거죠
/* Kotlin Code */
data class Foo(val foo: String, val bar : Int)
{
var hello:String = foo;
var times:Int = bar;
fun chk(){
while (times != 0)
{
println("${times} -> ${hello}");
times-=1;
}
return
}
}
fun main(args:Array<String>)
{
val fooMaster = Foo("Hello", 5)
val (foo, bar) = fooMaster
println("foo : $foo bar : $bar")
fooMaster.chk()
}
클래스 Foo를 데이터 클래스로 선언하고 두 개의 파라미터를 받습니다. 이후에 main 함수에서 이를 초기화 해준 다음, 두 개의 변수의 값에 언패킹을 통해 값들로 초기화를 진행합니다. 그렇다고 한들, 값이 사라지는 것도 아니며 데이터를 가지는 객체로서 데이터를 대입만 해준 것이죠. 그렇게 됨으로써, 아래의 함수와 출력문이 정상적으로 동작하는 것을 볼 수 있습니다. 이를 Destructuring이라고 하며, java계열의 언어에서 쉽게 볼 수 있는 문법 중 일부입니다!!
Error Handling
아무래도 프로그램에서 예외 처리나 오류 처리는 상당히 중요한 부분입니다. 오류 없는 완벽한 프로그램이요? 글쎄요. 그렇게 완벽한 프로그램이란 예외처리를 완벽하게 한 프로그램입니다. 그러니까 여기저기 누수된 파이프를 물이 다시 새지 않도록 막은 거죠. 그렇다고 그것을 실력이 부족해서라는 말이 절대 아닙니다. 오히려 문제를 정확히 인지하고 있으며 이를 이성적으로 고쳤다는 점이 중요한 거죠. 그러니까 만약에 프로그램을 하나 작성해서 배포를 했는데, 분명 qa에서도 치명적인 문제를 보이지 않았지만 뭔가 터질 수 있는 거죠. 그렇기 때문에 우리가 사용하는 프로그램들은 오류가 하나도 없는 프로그램이 아닌 오류를 잡을 대로 많이 잡은 프로그램의 최종본이라는 겁니다. 그렇기 때문에 오류 처리는 중요한 부분이고요. 코틀린은 자바와 유사한 예외 처리를 보여주는데 try-catch-finally 구문을 활용합니다. 아래 코드를 보고 확인해보도록 하겠습니다!!
fun main()
{
val foo:Int = 20;
val bar:String = "Error";
try{
bar.toInt();
}catch(e:Exception){
e.printStackTrace();
} finally {
println(" Posting is End ")
}
}
당연히 문자로 선언된 변수를 정수형으로 바꾼다라고 하면 오류가 나겠죠. 물론 가능하지만 이 상황에서는 오류가 날 수밖에 없습니다. 그럴 때 catch에서 오류를 캐치합니다. 그리고 오류가 발생한 지점을 출력합니다. 그렇게 한다면 오류가 어디서? 왜? 발생했는지 소상하게 알 수 있겠죠. 그리고 마지막으로 출력문 내용을 출력하고 프로그램 동작을 종료합니다. 오류 처리 문법은 아래와 같습니다!
try{ } catch (e:<One of Exception>) { } finally { }
예외 처리에도 서브 클래스가 매우 많기 때문에 관련 문서를 찾아보고 본인에게 생기는 오류를 캐치할 때 활용하면 훨씬 더 효율적인 코드 작성법을 습관화할 수 있습니다!!
길고 긴 코틀린 강의 글이 끝났습니다. 이후에 코틀린을 이용한 함수형 프로그래밍이나 애플리케이션 개발 둘 중 골라서 포스팅을 하고자 합니다. 간단하게라도 도움이 되신 분이 계시다면 좋겠네요^^😆
글 잘 읽으셨다면 공감 하트 한 번씩 눌러주시면 감사하겠습니다!😄😄😄
댓글로 피드백, 문의, 질문 모두 환영합니다😍😍😍😍😍
감사합니다🥰🥰꾸벅 : )
댓글