www.notion.so/feat-1acb0630394a426cbcf1d68b2c6a9204
티스토리에 노션을 깔끔하게 가져오는 방법을 아직 찾지 못하여,,,
미루고 미루던,,,, 링크로 대체한다....
빠른 시일 내에 티스토리에도 깔끔하게 써보자 🔥
노션에서 티스토리로 옮겨주는 프로그램을 만드신 분이 있다,,, 잘쓰겠습니다
토글 버튼 눌러서 내용 확인해주세요!
📙출처 : KOTLIN ACTION
1회차(1주)
1장 코틀린이란?
1.1 코틀린의 소개
KOTLIN
코틀린은 JAVA 플랫폼에서 돌아가는 새로운 프로그래밍 언어
Feat. 코틀린의 철학
실용성
코틀린은 실제 문제를 해결하기 위해 만들어진 실용적인 언어.
⇒ 연구를 위한 언어가 아닌, 이미 성공적으로 검증된 해법과 기능에 의존
⇒ 특정 프로그래밍 스타일을 강제로 요구하지 않음
⇒ 도구를 강조 & 편리한 개발 환경
⇒ IDE의 코틀린 언어 지원 : 더 간결한 코드로 도구가 자동으로 감지해서 수정하라고 제안.
간결성
- getter, setter, 생성자 파라미터를 필드에 대입하는 로직을 코틀린은 묵시적으로 제공. 프로그램 구조를 만족 시기키위한 의미없는 코드 줄일수 있다.
- 람다 식 지원으로 작은 코드 블록을 라이브러리 함수에 쉽게 전달가능.따라서 일반적인 기능을 라이브러리 안에 캡슐화하고 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.
안정성
- JVM에서 실행 메모리 안정성을 보장, 버퍼 오버플로우를 방지, 동적으로 할당한 메모리를 잘 못 사용함으로 인해 발생할 수 있는 다양한 문제를 예방할 수 있음.
- 컴파일 시점 검사를 통해 오류를 더 많이 방지 ⇒ NullPointException 없애기 위한 노력. ( ? 한글자 추가하면 되서 생산성도ㄱㅊ)
- ClassCastException 방지 어떤 객체를 다른 타입으로 캐스트cast하기 전에 타입을 미리 검사하지 않으면 ClassCastException리 발생할 수 있다. JAVA 타입검사와 그 후 이뤄지는 타입 캐스트에서 같은 타입 이름을 반복 사용하는 것이 찮아서 타입 검사를 생략하는 개발자가 많다. KOTLIN 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다 ⇒ 어떤 객테의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드 드으이 멤버를 별도의 캐스트 없이 사용할 수 있다. ⇒ 타입 검사를 생략할 이유가 없고, 검사를 생략하지 않으면 검사를 생략해서 생기는 오류가 발생할 일도 없다.
if(value is String) //type 검사 println(value.toUpperCase()) //해당 타입의 메소드를 사용한다
상호운용성 feat.JAVA
JAVA code와의 상호운용성 interoperability
JAVA에서도 코틀린 코드 호출, 코틀린 클래스 메소드 사용 가능.
⇒ 유연성 최고별도의 자체 컬렉션 라이브러리를 제공하지 않는다. 자바 표준 라이브러리에 쉽게 활용할 수 잇는 몇가지 기능만을 더할 뿐이다. ⇒ 코틀린에서 자바 API호출시 나 자바에서 코틀린 API 호출시에 객체를 감싸거나 변환할 필요가 없고 아무런 부가 비용을 야기하지 않는다.
코틀린과 자바 소스 파일이 임의로 섞여 있어도 의존관계에 상관없이 제대로 컴파일 할 수 있다. IDE 기능도 언어와 관계없이 작동한다.
- 자바와 코틀린 소스 파일을 자유롭게 내비게이션 할 수 있다.
- 여러 언어로 이뤄진 프로젝트를 디버깅하고 서로 다른 언어로 작성된 코드를 언어와 관계없이 한 단계씩 실행할 수 있다.
- 자바 메소드를 리팩토링해도 그 메소드와 관련 있는 코틀린 코드까지 제대로 변경된다. 역으로 코틀린 메소드를 리팩토링해도 자바 코드까지 모두 자동으로 변경된다.
활용분야
서버 개발 안드로이드 앱 개발 등
자바가 실행되는 모든 곳+) IOS
인텔의 멀티OS 엔진 intel Multi-OS Engine를 사용하면 코틀린을 IOS에서도 실행가능!
+) Desktop
토네이도FX , 자바FX를 통해 데스크탑 어플리케이션을 작성가능하다.
+) 브라우저& 웹
코틀린이 정한 목표
코틀린 예제 사이트
http://try.kotl.in1.2 코틀린의 특징
정적 타입 지정 언어
정적 타입 Statically typed 지정 언어란?
정적 타입 지정 언어의 장점
- 성능
실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠름.
- 신뢰성
컴파일러가 프로그램의 정확성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를 사용한다.
- 일급 시민인 first-class 함수
함수형 프로그래밍의 장점 - feat.lambda 불변데이터
- 간결성
명령형 코드(↔함수형)에 비해 더 간결하며 우아하다. pure function
(순수)함수를 값처럼 활용할 수 있으면 더 강력한 추상화abstraction를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있다.
람다식Lambda expression이라 불리는
무명 함수Anonymous function를 사용하면 간결하게 표현가능
- 다중 스레드의 안정성safe multithreading 불변데이터
다중 스레드 프로그램에서는 적절한
동기화없이 같은 데이터를 여러 스레드가 변경하는 경우 가장 많은 문제가 생긴다. KOTLIN은
불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경 불가능
⇒ 복잡한 동기화를 적용하지 않아도 됨.
- 테스트의 용이성
부수효과가 있는 함수는 그 함수를 실행할 댸 필요한 전체 환경을 구성하는 준비 코드setup code가 따로 필요하지만, 순수 함수는 준비없이 독립적으로 테스트할 수 있음.
- 간결성
KOTLIN의 함수형 프로그래밍 지원요소 간결한 문법 불변데이터
- 함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다. 간결한 문법
- 람다 식을 지원함에 따라 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다. 간결한 문법
- 데이터 클래스는 불변적인 값 객체value object를 간편하게 만들 수 있는 구문을 제공한다. 불변데이터
- 코틀린 표준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다. //stream API
널 안정성 - 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 // 함수 본문 }
문statement && 식expression
식이 본문인 함수
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참조
자바의 일반 변수KOTLIN 기본적으로 모든 변수를 val 키워드를 사용해 불변 변수로 선언하고, 나중에 꼭 필요한 경우만 var로 변경하라.
⇒ 변경 불가능한 참조와 변경 불가능한 객체를 부수 효과가 없는 함수와 조합해 사용하면 코드가
함수형 코드에 가까워짐
👻Quiz 2 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 +"!") //자바의 문자열 접합 연산
자바의 문자열 접합 연산과 동일한 기능을 하고 효율적이며, 좀 더 간결하다.
${ 변수 } 중괄호로 변수명을 감싸는 습관을 들이자!!
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}"}") //중괄호로 둘러싼 식 안에서 문자열 템플릿을 사용해도 된다! } }
'Kotlin' 카테고리의 다른 글
🦝람다 ver2- 컬렉션 함수형 API (0) | 2020.09.09 |
---|---|
🦝람다 ver1- 람다식, 람다 문법, 멤버 참조 (0) | 2020.09.09 |
📎 코틀린 애노테이션 (0) | 2020.09.09 |
❓널 안정성,데이터 클래스,한정 클래스 +컬렉션 개념 (0) | 2020.09.09 |
🚥코틀린의 흐름제어&예외처리 (0) | 2020.09.09 |
Uploaded by Notion2Tistory v1.0.0