본문 바로가기

Kotlin

🦕코틀린의 소개 feat.코틀린 철학

www.notion.so/feat-1acb0630394a426cbcf1d68b2c6a9204

 

코틀린의 소개 feat.코틀린 철학

📙출처 : KOTLIN ACTION

www.notion.so

티스토리에 노션을 깔끔하게 가져오는 방법을 아직 찾지 못하여,,,

미루고 미루던,,,, 링크로 대체한다....

빠른 시일 내에 티스토리에도 깔끔하게 써보자 🔥

노션에서 티스토리로 옮겨주는 프로그램을 만드신 분이 있다,,, 잘쓰겠습니다

Notion2Tistory

 

 

토글 버튼 눌러서 내용 확인해주세요!

📙출처 : KOTLIN ACTION

💡
과연 다 할 수 있을것인가!!

1회차(1주)

  • 1장 코틀린이란?

    1.1 코틀린의 소개


    KOTLIN

    코틀린은 JAVA 플랫폼에서 돌아가는 새로운 프로그래밍 언어

    Feat. 코틀린의 철학

    • 실용성

      코틀린은 실제 문제를 해결하기 위해 만들어진 실용적인 언어.

      ⇒ 연구를 위한 언어가 아닌, 이미 성공적으로 검증된 해법과 기능에 의존

      ⇒ 특정 프로그래밍 스타일을 강제로 요구하지 않음

      ⇒ 도구를 강조 & 편리한 개발 환경

      ⇒ IDE의 코틀린 언어 지원 : 더 간결한 코드로 도구가 자동으로 감지해서 수정하라고 제안.

       

    • 간결성
      💡
      간결하다? 그 언어로 작성된 코드를 읽을 때 의도를 쉽게 파악할 수 있는 구문 구조를 제공하고, 그 의도를 달성하는 방법을 이해할 떄 방해가 될 수 있는 부가적인 준비 코드가 적다라는 뜻.
      • getter, setter, 생성자 파라미터를 필드에 대입하는 로직을 코틀린은 묵시적으로 제공. 프로그램 구조를 만족 시기키위한 의미없는 코드 줄일수 있다.
      • 람다 식 지원으로 작은 코드 블록을 라이브러리 함수에 쉽게 전달가능.따라서 일반적인 기능을 라이브러리 안에 캡슐화하고 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.
      간결성은 생산성을 향상시키고 개발을 더 빠르게 진행할 수 있게 해준다.

       

    • 안정성
      💡
      안전하다? 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다라는 뜻. TMI. 안정성과 생산성의 관계 더 큰 안정성을 얻기 위해서는 프로그램에 프로그램의 작동 의도에 대한 더 많은 정보를 덧붙여야 하므로 생산성이 하락하는 것을 감수해야한다. 생산성과 트에리드오프trade off관계
      • JVM에서 실행 메모리 안정성을 보장, 버퍼 오버플로우를 방지, 동적으로 할당한 메모리를 잘 못 사용함으로 인해 발생할 수 있는 다양한 문제를 예방할 수 있음.
      • 컴파일 시점 검사를 통해 오류를 더 많이 방지 ⇒ NullPointException 없애기 위한 노력. ( ? 한글자 추가하면 되서 생산성도ㄱㅊ)
      • ClassCastException 방지 어떤 객체를 다른 타입으로 캐스트cast하기 전에 타입을 미리 검사하지 않으면 ClassCastException리 발생할 수 있다. JAVA 타입검사와 그 후 이뤄지는 타입 캐스트에서 같은 타입 이름을 반복 사용하는 것이 찮아서 타입 검사를 생략하는 개발자가 많다. KOTLIN 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다 ⇒ 어떤 객테의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드 드으이 멤버를 별도의 캐스트 없이 사용할 수 있다. ⇒ 타입 검사를 생략할 이유가 없고, 검사를 생략하지 않으면 검사를 생략해서 생기는 오류가 발생할 일도 없다.
        	if(value is String) //type 검사
        		println(value.toUpperCase()) //해당 타입의 메소드를 사용한다

       

    • 상호운용성 feat.JAVA

      JAVA code와의 상호운용성 interoperability

      💡
      👩‍💻: 기존 라이브러리를 그대로 사용할 수 있느냐? 👻: 당연! - API 활용 가능 - 자바 메소드 호출 가능 - 자바 클래스 상속inherit&확장extend 가능 - 자바 애노테이션annotation을 코틀린 코드에 적용 가능

      JAVA에서도 코틀린 코드 호출, 코틀린 클래스 메소드 사용 가능.

      ⇒ 유연성 최고

       

      코틀린은 자바 표준 라이브러리 클래스에 의존한다.

      별도의 자체 컬렉션 라이브러리를 제공하지 않는다. 자바 표준 라이브러리에 쉽게 활용할 수 잇는 몇가지 기능만을 더할 뿐이다. ⇒ 코틀린에서 자바 API호출시 나 자바에서 코틀린 API 호출시에 객체를 감싸거나 변환할 필요가 없고 아무런 부가 비용을 야기하지 않는다.

       

      다중 언어 프로젝트를 완전히 지원한다.

      코틀린과 자바 소스 파일이 임의로 섞여 있어도 의존관계에 상관없이 제대로 컴파일 할 수 있다. IDE 기능도 언어와 관계없이 작동한다.

      • 자바와 코틀린 소스 파일을 자유롭게 내비게이션 할 수 있다.
      • 여러 언어로 이뤄진 프로젝트를 디버깅하고 서로 다른 언어로 작성된 코드를 언어와 관계없이 한 단계씩 실행할 수 있다.
      • 자바 메소드를 리팩토링해도 그 메소드와 관련 있는 코틀린 코드까지 제대로 변경된다. 역으로 코틀린 메소드를 리팩토링해도 자바 코드까지 모두 자동으로 변경된다.

       

       

     

    • 활용분야

      서버 개발 안드로이드 앱 개발 등

      자바가 실행되는 모든 곳

       

      +) IOS

      인텔의 멀티OS 엔진 intel Multi-OS Engine를 사용하면 코틀린을 IOS에서도 실행가능!

       

      +) Desktop

      토네이도FX , 자바FX를 통해 데스크탑 어플리케이션을 작성가능하다.

       

      +) 브라우저& 웹

      자바 뿐만 아니라 자바스크립트도 컴파일 가능!!

      2017년 3월 1일 발표된 코틀린 1.1자바스크리븥를 공식적으로 지원.

      젯브레인스는 코틀린 네이티브 백엔드를 개발 중.

       

       

       

    코틀린이 정한 목표

    💡
    코틀린이 정한 목표 영역은 상당히 광범위하다. 소프트웨어 개발이 처한 어려움 중 일부만을 다루기 위한 언어가 아닌 개발 과정에서 수행해야 하는 모든 과업에 있어 폭넓게 생산성을 향상시켜준다. 코틀린은 구체적인 영역의 문제를 해결하거나 특정 프로그래밍 패러다임을 지원하는 여러 라이브러리와 아주 잘 융합된다!!

     

     

    코틀린 예제 사이트

    http://try.kotl.in

    Kotlin Koans

     

     

    1.2 코틀린의 특징


     

    정적 타입 지정 언어


    • 정적 타입 Statically typed 지정 언어란?
      💡
      모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고, 프로그램 안에서 객체의 필드Field나 메소드Method를 사용할 때마다 컴파일러가 타입을 검증해준다! ex) JAVA, KOTLIN VS 동적 타입 지정 언어 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나며, 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있다. => 이름을 잘못 입력하는 실수도 컴파일시 걸러내지 못하고 실행시점에서 오류가 발생 ex)JVM에선 그루비 나 JRuby

       

    • 정적 타입 지정 언어의 장점
      • 성능

        실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠름.

      • 신뢰성

        컴파일러가 프로그램의 정확성correctness를 검증 ⇒ 프로그램 오류 가능성 감소

      • 유지 보수성

        코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 떄도 더 쉽다.

      • 도구 지원

        더 안전하게 리팩토링refactoring 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.

       

    • KOTLIN의 타입 추론 Type Inference Type System간결한 문법 직접 타입을 선언해주어야 하는 정적 타입 지정 언어

      임에도 불구하고 코틀린은

      컴파일러

      가 문맥으로 변수 타입을 유추할 수 있기 때문에 프로그래머

      타입 선언 생략 가능
      var x=1 // x는 코틀린 컴파일러가 문맥으로 INT type 유추
      var string="나는 과연 오늘 공부를 다 할 수 있나!"
      // string 는 코틀린 컴파일러가 문맥으로 INT type 유추

       

     


    • 함수형 프로그래밍 핵심 개념
      • 일급 시민인 first-class 함수

        함수를 일반 값처럼 다룰 수 있다.

        💡
        함수를 변수에 저장 할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있다.
      • 불변성 immutability

        함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.

      • 부수효과 side effect 없음

        입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수함수pure function를 사용한다.

       

    • 함수형 프로그래밍의 장점 - feat.lambda 불변데이터
      • 간결성

        명령형 코드(↔함수형)에 비해 더 간결하며 우아하다. pure function

        (순수)함수를 값처럼 활용

        할 수 있으면 더 강력한 추상화abstraction를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있다.

        람다식Lambda expression

        이라 불리는

        무명 함수Anonymous function

        를 사용하면 간결하게 표현가능

      • 다중 스레드의 안정성safe multithreading 불변데이터

        다중 스레드 프로그램에서는 적절한

        동기화

        없이 같은 데이터를 여러 스레드가 변경하는 경우 가장 많은 문제가 생긴다. KOTLIN은

        불변 데이터 구조

        를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경 불가능

        ⇒ 복잡한 동기화를 적용하지 않아도 됨.

      • 테스트의 용이성

        부수효과가 있는 함수는 그 함수를 실행할 댸 필요한 전체 환경을 구성하는 준비 코드setup code가 따로 필요하지만, 순수 함수는 준비없이 독립적으로 테스트할 수 있음.

      💡
      언어에 관계없이 함수형 스타일을 활용할 수 있다?! 자바도 함수형 프로그래밍이 가능하다. 그리고 함수형 프로그래밍 스타일을 이루는 여러 요소는 좋은 프로그래밍 스타일이며, 장려할 만하다. 다만, 함수형 프로그래밍을 사용하기에 충분한 라이브러리와 문법 지원을 모든 언어가 제공하진 않는다. JAVA8 부터 함수형 프로그래밍을 지원하기 시작했다.
    • KOTLIN의 함수형 프로그래밍 지원요소 간결한 문법 불변데이터
      • 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다. 간결한 문법
      • 람다 식을 지원함에 따라 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다. 간결한 문법
      • 데이터 클래스는 불변적인 값 객체value object를 간편하게 만들 수 있는 구문을 제공한다. 불변데이터
      • 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다. //stream API
      💡
      KOTLIN = 함수형 & 명령형 & 객체 지향의 다양한 조합 함수형 프로그래밍을 강제하지 않는다. 명령형 방식이 더 적합하다면 직접 변경 가능한 데이터와 부수 효과를 활용하는 함수를 사용해도 된다. 인터페이스와 클래스 계층 구조를 바탕으로 하는 프레임워크도 자바를 사용할 때와 마찬가지로 쉽게 쓸 수 있다. cf.함수형↔명령형 / 절차지향 ↔ 객체지향

       

     

    널 안정성 - Type System


    • Nullable type

      NULL이 될 수 있는 타입을 지원함에 따라 컴파일 시점에

      널 포인터 예외 NULL POINTER EXCEPTION가 발생할 수 있는지 검사 ⇒안드로이드 개발에 매우 용이// 코틀린 액선 6장보고 더 추가해야함

       

     

    스트림 API 지원

     

     

    1.3 코틀린의 기초 :: 주요 문법

     

    Hello, World!


    fun main(args: Array<String>){
    	println("Hello, world!")
    }
    • 👻Quiz 1 이렇게 간단한 코드에서 어떠한 코틀린의 문법이나 특성이 있을까?
      • Answer
        • 함수를 선언할 때 fun 키워드를 사용한다.
        • 파라미터 이름 뒤에 그 파라미터 타입을 쓴다.
        • 함수를 최상위 수준에 정의할 수 있다. 꼭 클래스 안에 함수를 넣어야 할 필요가 없다.
        • 배열도 일반적인 클래스와 마찬가지. 코틀린에는 자바와 달리 배열 처리를 위한 문법이 따로 존재하지 않는다.
        • System.out.println 대신에 println이라고 쓴다. 코틀린 표준 라이브러리는 여러가지 표준 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼wrapper를 제공한다.
        • 최신 프로그래밍 언어 경향과 마찬가지로 줄 끝에 세미콜론; 을 붙이지 않아도 좋다.

     

    함수 선언


    fun functionNameIsName(a:Int,b:Int):Int{ //NAME Parameter ReturnType
    		return if(a>b) a else b // 함수 본문
    }
    💡
    여기선 코틀린 if 는 값을 만들어 내지 못하는 문장statement이 아니고 결과를 만드는 식expression이다. 자바 3항 연산자 ( a > b ) ? a : b 식과 비슷하다
    • 문statement && 식expression
      💡
      문statement && 식expression 코틀린에서 if 는 식이다. 문이 아니다. 식expression값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있다. 문statement 자신을 둘러싸고 있는 가장 안쪽 볼록의 최상위 요소로 존재하며 아무런 값을 만들어내지 않는다는 차이가 있다. 자바 모든 제어 구조가 문 대입문은 식 코틀린 모든 제어 구조가 식(루프 제외) 대입문은 문 ⇒ 자바와 달리 대입식과 비교식을 잘못 바꿔 써서 버그가 생기는 경우가 없다.

       

    • 본문인 함수
      fun functionNameIsMax(a:Int,b:Int):Int = if(a>b) a else b 
      fun functionNameIsMax(a:Int,b:Int) = if(a>b) a else b
      //반환타입 생략가능 => 코틀린의 타입추론type inference
      //식이 본문일 때만 생략가능 

      1.{ } 중괄호 제거 2. return 제거 3. 등호를 식 앞에 붙임

       

      💡
      블록이 본문인 함수 && 이 본문인 함수 본문이 중괄호로 둘러싸인 함수를 블록이 본문인 함수 등호와 식으로 이루어진 함수를 식이 본문인 함수

      코틀린에서는 식이 본문인 함수가 자주 쓰임.

      • 단순한 산술식
      • 단순한 호출식
      • if / when / try

     

    변수 선언


    • 변수 선언 VS JAVA
      String name ="은이" // Java는 변수선언할 때 타입이 맨 앞에 온다!
      val name ="은이" //타입 생략 가능
      val name: String="은이"// 타입 명시가능
      val answer:Int//초기화 식을 이용하지 않고 변수를 선언하려면 타입 반드시 명시
      		answer=42 //초기화 식이 없으면 변수에 저장될 값에 대해 아무 정보가 없기
      때문에 컴파일러가 타입을 추론할 수 없다. 반드시 타입을 명시해주어야 한다. 
    • 가변/불변 QUIZ👻

      var (변수를 뜻하는 variable에서 따옴) 변경 가능한

      mutable

      참조

      자바의 일반 변수

       

      val (값을 뜻하는 value에서 따옴) 변경 불가능한immutable 참조를 저장하는 변수 val 로 한번 초기화하고 나면 재대입이 불가능!! 자바로 말하면 final 변수에 해당

       

      KOTLIN 기본적으로 모든 변수를 val 키워드를 사용해 불변 변수로 선언하고, 나중에 꼭 필요한 경우만 var로 변경하라.

      ⇒ 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과가 없는 함수와 조합해 사용하면 코드가

      함수형 코드

      에 가까워짐

       

       

      • 👻Quiz 2 val은 어떻게 여러 값을 가질 수 있을까?
        💡
        val 여러 값으로 초기화?! val 변수는 한번만 초기화가 가능하다. 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val이 여러값으로 초기화 될 수 있다.
        • Answer
          val message:String
          if(CanPerformOperation()){
          		message="Good morning"
          }else{
          		message="Good Night"
          }
      • 👻Quiz 3 val은 불변이다. val이 가리키는 객체 내부는 불변일까?
        • Answer

          val은 불변일지라도 그 참조가 가리키는 val 객체의 내부 값은 변경 될 수 있다.

          val language=arrayListOf("JAVA") //불변 참조를 선언한다.
          language.add("KOTLIN") //참조가 가리키는 객체 내부를 변경한다.

         

      • 👻Quiz 4 var은 변경가능한 변수이다. 아래 이 코드는 올바른 코드인가?
        var answer=42
        answer="이제 좀 졸리네;;"
        • Answer

          올바르지 않은 코드!!

          var 변수의 값을 변경할 수 있지만

          변수의 타입은 고정돼 바뀌지 않는다.
          var answer=42 //컴파일러는 answer의 변수 타입을 INT 로 추론
          answer="이제 좀 졸리네;;" //ERROR:TYPE MISMATCH 컴파일 오류

          어떤 타입의 변수에 다른 타입의 값을 저장하고 싶다면 변환 함수를 써서 값을 변수의 타입으로 변환하거나, 값을 변수에 대입할 수 있는 타입으로 강제 형 변환coerce해야 한다.

          //코틀린 액션 6.2.3절에서 다룬다.

         

       

    • 문자열 템플릿
      fun main(args: Array<String>){
      	val name= if(args.size > 0) args[0] else "Kotlin"
      	println("Hello, $name! ")
      }

      name 이란 변수를 선언. 그 다음 줄 문자열 리터럴 안에서 그 변수를 사용함. $를 변수 앞에 추가하면 여러 스크립트 언어와 비슷하게 문자열안에서 사용 가능.

      System.out.println("Hello,"+ name +"!") //자바의 문자열 접합 연산

      자바의 문자열 접합 연산과 동일한 기능을 하고 효율적이며, 좀 더 간결하다.

      • ${ 변수 } 중괄호로 변수명을 감싸는 습관을 들이자!!
        💡
        한글을 문자열 템플릿에서 사용할 경우 주의할 점 코틀린에서는 자바와 마찬가지로 한글(사실은 한글 뿐 아니라 글자letter로 분류할 있는 유니코드 문자)을 식별자에 사용할 수 있으므로 변수 이름에 한글이 들어갈 수 있다. $로 변수를 지정할 때 변수명 뒤에 바로 만글을 붙여서 사용하면 코틀림 컴파일러는 영문자와 한글을 한꺼번에 인식해서 오류 발생!!
        fun main(args: Array<String>){
        	val name= if(args.size > 0) args[0] else "Kotlin"
        	println("$name님 반가워요!!") // unresolved reference ERROR
        }
        💡
        해결책 ${ 변수 } 중괄호로 변수명을 감싸는 습관을 들이자!!
      • 복잡한 식도 가능
        fun main(args: Array<String>){
        	if(args.size > 0) {
        		println("Hello, ${args[0]}! ") // arg배열의 첫 번째 원소를 넣기 위해 
        	}                               // ${ } 구문을 사용한다.
        }
        fun main(args: Array<String>){
        	if(args.size > 0) {
        		val name = "Kotlin"
        		println("Hello, ${if(args.size>0) args[0] else "someone"}! ") 
        		//중괄호로 둘러싼 식 안에서 큰 따옴표를 사용할 수도 있다.
        		println("${if(args.size>0) "too short" else "normal string ${name}"}")
        		//중괄호로 둘러싼 식 안에서 문자열 템플릿을 사용해도 된다!
        	}                              
        }