여전히 두 프로그래밍 언어를 병행해서 공부하다보니, 나도 모르게 헷갈리게 사용하는 경우가 많다. 앞에서 차이점 몇가지를 얘기했었는데, 나머지도 정리해 보려한다.
변수
Kotlin
값 변경이 가능하게 하려면 ‘var’, 값 변경이 불가능하게 하려면 ‘val’로 정의한다. 값이라고 했지만, 사실은 레퍼런스의 의미로 객체의 경우 다른 객체를 지정하도록 변경하지 못한다.
val unmutableVar = 20
var mutableVar: Int = 10
Python
동적타입 언어답게 아무런 키워드 없이 그냥 사용 가능하다.
varable = 10
함수
Kotlin
‘fun’ 키워드를 사용하고 바디블럭은 중괄호'{}’로 묶어준다.
fun myFun(arg1: Int){
// ...
}
Python
‘def’ 키워드를 사용. 콜론’:’으로 바디 블럭을 구분해주고, 들여쓰기(indent)로 바디를 표시해준다.
def my_func(arg1):
arg1 += 1
# indent의 끝이 바디의 끝
# ...
논리연산자
Kotlin
여타 정적타입 언어와 동일하게 ‘&&, ||’ 가 쓰인다.
Python
실제 언어적 표현의 영향인건지, 기호가 아니라 ‘or’, ‘and’가 쓰인다. 이전에 ‘!’도 할당연산자(‘!=’)가 아니면 ‘not’ 이 쓰이는걸 올렸었다.
Boolean
Kotlin
이건 언어마다 제각각이긴한데, kotlin에선 소문자 ‘true’, ‘false’가 쓰인다.
Python
파이썬에선 대문자로 시작하는 ‘True’, ‘False’가 쓰인다.
포맷 문자열(format string)
Kotlin
기존 스크립트 언어의 것들을 적극 차용한 느낌이다. 변수하나만 사용할 땐, ‘$’표시를 쓰고, 표현식(expression)을 쓰고 싶으면 추가로 중괄호(‘{}’)로 묶어준다.
val a = 10
println("a value is $a")
println("if you add 10 to a = ${a + 10}")
Python
python에서 포맷 스트링은 변화를 거듭해왔다. 그중에 kotlin과 가장 유사한 최근 f-string이라고 부르는 것만 살펴본다. f-string은 스트링앞에 문자 ‘f’를 붙인다. 그리고 코틀린과 유사하게 표현식이 중괄호로 묶여 들어간다. ‘$’표시는 사용하지 않는다.
a = 10
print(f"a value is {a}")
print(f"if you add 10 to a = {a + 10}")
따로 항목은 안만들었지만, python에는 println()이 없다.
가변인자(variable number of arguments)
Kotlin
‘vararg’ 키워드를 사용한다.
fun varArgsSample(vararg vargs: Int): Int{
var sum = 0
for(item in vargs){
sum += item
}
return sum
}
println(varArgsSample(1, 2, 3, 4))
Python
Python에선 Arbitrary Argument Lists라고 말한다. 관련해서 잘 정리된 블로그 글 하나를 참고.
보통 *args, **kwargs 라고 쓰는데, args, kwargs라는 이름은 중요한게 아니고 ‘*’을 붙이는게 중요하다. 별 ‘*’ 하나를 붙이면, Kotlin의 vararg와 같은 효과를 내고, ‘**’ 이렇게 두개를 붙이면, keyword arguments 이다. parameter화된 argument들을 받는데, 함수 내부에선 dictionary로 처리되는 가변인자가 된다.
def var_arg_sample(*my_args):
total = 0
for item in my_args:
total += item
return total
print(var_arg_sample(1, 2, 3, 4, 5))
def var_karg_sample(**my_kwargs):
for k, v in my_kwargs.items():
print(f"key = {k}, value = {v}")
var_karg_sample(a = 10, b = 20)
mydict = {"a": 10, "b": 20, "c":30}
var_karg_sample(**mydict)
주의할건, parameter(또는 key)=value 형태로 넘기지 않고 dictionary를 바로 넘길 수 있는데, 넘길 때 ‘**’를 붙여준다. dictionary에 ‘**’를 붙여주면 unpacking 프로세스를 의미하고 파라미터 형태로 분리된다.
비슷하게 ‘*’는 리스트 앞에 붙어서 unpacking 해주게 된다.
# 아래 두 표현은 같다
func(*['one', 'two'])
func ('one', 'two')
# 아래 두 표현도 같다
func(**{'type': 'event'})
func(type='event')
lambda 표현식은 개별글로 올렸고, 클래스와 객체지향관련 내용은 내용이 좀 많아서 앞으로 차차 정리해서 올려보려한다.