※ 우리 부부가 열심히 일하고 야근해서 받은 머니로 구입한 후기입니다

 

붱이 Story

 

안드로이드 다시 시작한지 2년차...

약 7~8년전 깔짝 배운걸로만 하려니

발전이 없어 신문물을 공부하기로 하고 

Kotlin을 공부 하였다.


우선 가장 추천이 많은 

Kotlin in Action을 샀다...


커니의 코틀린은 빌렸는데 이 두책이 가장 볼만한듯 하다



책에서 소개하는 아래 링크를 가보자


http://try.kotl.in


아래와 같이 빠르게 웹에서 테스트가 가능하다.

처음 문법익히고 요것저것 간단히 테스트해볼때 유용할듯하다.



기초적인 문법들은 블로깅 된게 많으니 Pass


내 기준 오! 이거 좋네?

이런게 되?

신기하다~

이건 알아두면 나중에 쓰겠지?


하는 항목을 나열해보았다.


Smart Cast

Null safety call “?.”

 Elvis operator “?:”

let operator

Triple quote “”” 

Default arguments and named arguments

Extension functions | infix

Singleton “object”

Local functions

“apply”

“with”

“run”


Smart Cast


위 링크에 Examples 중에 책의 예제코드들이 있는곳으로 가서

코드를 돌려보자


"is"

 java에서 instanceof와 같다.

해당 오브젝트의 타입을 확인할때 쓰곤했었다.

뭐 여기는 문법의 차이라고 보면되지만

그다음이 중요하다 

as를 통해 Num Class를 casting을 명시적으로 해주었지만

아래 message창을 보면 warning이 뜬것을 볼수있다

"No cast needed"


kotlin에서는 is로 이미 체크하고 다음 블록에선

따로 casting 없이 바로 쓰면된다.

 Num으로 캐스팅이 된 상태라고 보면된다.

(사실 컴파일타임에 알아서 캐스팅해준거다)


두번째 Sum 체크에서 보듯이 블록안에서는 casting 없이 사용한 것을 볼수있다.


요 기능이 "Smart Cast"라고 부른다




Null Safety Call "?."

Null Safety call "?."

아래 자바 스타일 함수에서 보듯이

자주 쓰는 null 체크가 


위에 ?. 하나로 간결하게 줄어든것을 볼수있다.

아주 심플하다. 

말그대로 ?. 왼쪽이 null이 아니면 오른쪽을 수행하고 아니면 null을 돌려준다.

아주 코드가 심플하다



아래는 chain으로 사용하는것을 보여준다.




Elvis Operator "?:"


아래 코드보면 이해가리라 생각이 든다.

null일경우 기본 값을 지정해주는 용도?



기본값이 아닌 원하는 Exception을 발생시킬수도있다.

아래 코드를 보고 이해하자~




"let" operator

let은 "?."와 같이 자주 쓰인다.

객체가 null이 아니라면 뭔가 수행한다로 보면 된다

아래코드보면 이해가 쉬울것이다~

앞서 두개의 sendEmailTo만 수행되고

마지막은 email이 null이여서 수행이 안된것을 확인할수 있다.




Triple Quote """


3중 따옴표 안에 글씨를 쓰면 개행까지도 표현가능하다

개행뿐만 아니라 back slash를 써서 특수 문자를 표시하던것들을

없이 바로 출력해준다.

booungEx 문장을 보면 이해가 갈 듯


trimMargin()으로 |(파이프) 까지는 잘라준다.(default)

17번 18번 line 수행결과는 같다



Default arguments and named arguments


C++에선 있지만...Java에 없어서 살짝 불편했었던 Default argument


Kotlin에선 좀더 진화된 Default arguments와

named arguments를 제공함으로써

Java에서 수많은 overloading이 필요했던것을 대폭 간소화 시켜준다.

아래 .. 내가 예제로 짠거지만 요걸 찬찬히보면

java때와 비교해서 볼수있을것이다.


Kotlin에서의 Default arg, Named arg는 다 이해했다고 봐도 될듯하다.(붱피셜)


main에서의 음영부분이 Named arg를 사용한것이다.

결과는 위아래 동일하지만 코드는 엄청 심플해진것을 알 수 있다.



Extension functions | infix


확장함수 요것도 물건이다..


예전 Java에서는 상속을통해 함수를 추가하곤했다


코틀린은 상속없이 마치 원래 멤버함수인것처럼 함수를 확장할수 있다.


String에 lastChar라는 함수를 확장했고

Int에 max 함수를 확장한 코드이다.


추가적으로 fun 앞에 중위함수표시인 infix를 적어넣으면

13 14 line 형태로 코드를 작성할수도 있다.

infix는 굳이 꼭 이래써야하나 싶긴하다...

그래도 신박한 기능이라 생각해서 언급해보았다.



Singleton "object"


Kotlin에서 싱글톤.... 너무 심플하다 그냥 class대신 object로 쓰면된다.





Local function

로컬함수가 된다... 우선 알고만 있으라는 뜻으로 언급해봤다

함수 안에 중복되는 코드가 있을경우...


아래와 같이 함수 안에 또 다른 함수로 중복 코드를 줄일수 있다.

모르면 있는지도 모르지만

알고나 있으면 ... 써먹을때가 올지도...





여기서 부터는 커니의 안드로이드를 참고하였음

자세한건 링크서 확인하고

https://www.androidhuman.com/lecture/kotlin/2016/07/06/kotlin_let_apply_run_with/



저는 이해한바만 ...


apply operator

apply는 어떠한 객체를 생성할때 property에 원하는값을 넣어서 생성할때...

아래 코드를 보면 위아 래 같은 코드이다.


사실 장점은? 모르겟지만 코드가 분산되지 않는다는거??

모르겠다 사실 뭐가 장점인지...





with operator

apply()와 유사하지만 내가 이해한건...

이미 생성된것에 대한 property를 변경시?

아래코드 처럼 이미 다른데서 생성된 messageView를

this로 접근하여 property값을 바꿀때 쓴다?

this생략도 가능


장점 이것도 잘모르겠다 


우선 존재를 알고 어느정도 알아야.. 

코드 해석을 할테니




run operator

run()은 두가지 형태가 있다.


먼저 객체없는 run()은 아래 코드와 같이

어떤 계산이라던지 작업을 한 결과를 리턴한다.

아래에서 블록의 마지막줄의 결과가 리턴이된다.



객체를 통한 run()은 생성된 객체의 연속된 동작이 필요할때

사용되는데 with()와 비슷하다


다른게 있다면 non-null상태여야한다.

 let과 with로 표현이 가능하다.

아래 코드를 보자~




더 재미난 기능들이 있지만

첫 코틀린은 여기까지...



제가 잘못 이해하고 있거나

잘못 기술 한점은 댓글로 알려주시면 감사하겠습니다.

단 !

비아냥은 노노



※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.






※ 우리 부부가 열심히 일하고 야근해서 받은 머니로 구입한 후기입니

 

붱이 Story

나는 data.go.kr에서 제공하고있는

미세먼지 정보 Open API를 사용해서

Home Assistance에서 사용하고 있었다.


SmartApp으로 만들어서 서버없이 해야지 생각만하다가


SmartHome 카페 slasher님이 위에 환경 공단 API를 가지고


DTH를 만들어주셨다. 너무 감사합니다^^


http://cafe.naver.com/stsmarthome/2536



미세먼지뿐만 아니라 Weather정보도 같이 표시되는

dth하나가 있으면 좋겠다 생각이 들어서


토요일 아침부터 작업을 시작하였다.


slasher님꺼에서


SmartThings에서 자체적으로 제공해주는 weather함수를 이용해서


통합하는게 목표



결과를 먼저 보여드리면




대기 오염 부분은 환경공단에서 제공하는 API를 사용해서 출력하였고 (Slasher님의 dth 기반)


아래 날씨 정보 부분은 smartThings weather함수를 이용하여서 출력하였다.


두개의 특징을 소개하면


"환경공단 정보"

 gps정보가 아닌 측정소의 기준으로 정보를 준다

그래서 Configuration에서 API키 뿐만 아니라 측정소 정보도 알려주어야한다.



"SmartThings Weather"

날씨 Open API인 https://www.wunderground.com 를 기반으로

API Key가 별도 없이(SmartThings내부에 내제됨) dth에서 사용가능하다.


Home Location의 GPS값을 통해 정보를 가지고 온다.


attribute값들은 https://www.wunderground.com/weather/api/ 


참조해서 어떤것이든 가져다 쓸수있다.



두가지 정보를 하나로 합치고 Weather Station을 꾸며보았다.


카페에서 ShinJjang님과 Onaldo님이 Tile 재배치와 색상변경 및 테스트 마루타가 되어주셨다 ㅎ

다시 한번 감사드립니다.



사용법



1. https://data.go.kr 에 가서 회원 가입

2. "대기오염정보 조회 서비스" Open API 활용 신청


여기서 상세 기능 보이는거 다신청하자

여담으로 측정소 조회를 하려면 "측정소정보 조회 서비스" 요것도 신청 같이하자~



3. API Key 받기



4. Graph IDE가서 git hub repository 입력

https://graph.api.smartthings.com/이동

본인 Location 선택 

주소 타입이 자기맞는 서버로 이동확인 아래처럼~

https://graph-na04-useast2.api.smartthings.com

"My Device Handlers" 이동

"Settings" 클릭

아래처럼 입력


"Save"


5. DTH Self Publish

"Update from Repo" 에서

"BooungThings(master)" 선택

New (only in GitHub) 에서 deviceType선택

맨아래 Publish 선택후

"Execute Update" 클릭


6. Weather Station Device 만들기

"My Devices" 이동

"+New Device" 선택

아래 처럼 Type에 방금 추가한 "SmartWeather Station For Korea"

Device network Id는 기존 device들과 겹치지 않게만 아무값

7. Configuration

그리고 바로 컴터로 하는김에

설정값까지 컴터로

위에 만든 Device로 이동

 중간에 Preferences가 보일것이다


edit 클릭

아래 빈곳에 위에 얻은 API키 입력

그리고 측정소 입력 측정소 뭘입력해야하는지는 아래 다시 설명

Tile에서 보여질 이름은 

측정소 이름대신에 보여질 이름 입력 안쓰면 측정소 이름으로 출력

Interval은 사실 정보제공해주는 측정이 정각에만 측정을 한다.

하루 500회 콜만 가능하니 알아서 판단~



8. 측정소 조회


측정소 이름이 뭐가있을까 갑자기 짜증이난다


환경공단가서 측정소가 뭐가있나 봐야한다


Kotlin과 web도 공부할겸


짱나서 만들었다




사용 방법은 간단

http://weekendproject.net:8081/api/airstation/{검색어}


아래는 "중구"로 검색한 예이다

http://weekendproject.net:8081/api/airstation/중구




결과가 없는경우는

여튼 검색해서 측정소 이름 부분의 것을 입력하면된다.


컴터로 안하고 폰으로 바로하려면


Weather Station Device선택하고 

오른쪽위 톱니바퀴 아이콘 Configuration 해서

아래 항목에서 입력



참고로 측정소 조회는 내 key로만들어서 하루 500회 호출만 되니


악의적으로 너무 많이 조회하지마세요 ㅠㅠ


측정소 조회 서비스도 신청하신분은 아래 query로 직접 조회하세요

http://openapi.airkorea.or.kr/openapi/services/rest/MsrstnInfoInqireSvc/getMsrstnList?addr=${SearchWord}&ServiceKey=${본인APIKey}


끝~~~ 

WebCore에서 자동화는 알아서 입맛에 맞게~




※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.



  1. Favicon of https://onaldo.tistory.com BlogIcon 오날두 2018.03.29 23:33 신고

    이거 링크복사 어떻게해요? 안되는데용

  2. 쿠쿠리 2018.08.15 23:40

    음 뭔가 꼬인거 같습니다.
    api 둘다 받아다 설정했는데 대기질 정보가 안넘어 와서 (날씨는 들어오고)

    카페가서 slasher 님 dth로 설정해 보니 그건 잘 넘어오네요..(작동 안해서 살펴보다 리플 중 팁에 따라 Service 대문자 s로 수정후에 작동)
    홈킷도 공기질 플러그인 같은 api로 잘 작동 하구요.

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2018.08.15 23:46 신고

      쿠쿠리님 안녕하세요
      service의 s요?? 조금만 더 자세히 말씀해주세요 수정해야할 부분있으면 수정하겠습니다

  3. 쿠쿠리 2018.08.16 21:01

    https://cafe.naver.com/stsmarthome/2536
    최근 리플에 언급이 있습니다.
    혹 같은 구문이 있을까 싶어서 dth 스크립트 뒤져봤는데 없더라구요.
    저만 안되는 거라면 뭔가 잘못한거겠죠 ㅠ
    측정소는 그냥 위치로 찾은 “금천구”와 api 두개 다 시험해 봤습니다. (Slasher님 dth에서는 두개 다 작동 하고 있습니다.)

  4. 서뎅 2019.01.10 19:22

    안녕하세요!
    붱이님 자료 보면서 차근차근 하나씩 배워 나가고 있습니다.
    문의 드릴께 있는데요

    4번항목
    Graph IDE가서 git hub repository 입력
    https://graph.api.smartthings.com/이동
    본인 Location 선택
    주소 타입이 자기맞는 서버로 이동확인 아래처럼~
    https://graph-na04-useast2.api.smartthings.com
    "My Device Handlers" 이동
    "Settings" 클릭
    아래처럼 입력

    여기서 왜 전 settings icon이 없을까요?

    제가 뭘 잘못한건지.....

  5. 돌멩이 2019.01.10 19:42

    올려주신 것 보고 잘 따라했습니다.
    좋은 글 감사합니다.

  6. 서뎅 2019.01.10 23:22

    네 setting 버튼이 전 없네요
    경로가 잘못된건지 ...
    ㅜㅜ

+ Recent posts