Kotlin Study_1

김민진·2022년 3월 6일
0

kotlin

목록 보기
3/5

Kotlin In Action 의 스터디를 참여한 공부 기록을 작성하도록 한다.

Kotlin은 정적 타입 지정 언어이다.

코틀린은 자바와 마찬가지로 정적타입(Statically typed) 지정 언어 라고 한다.

자바가 무슨 타입인지는 몰랐으나 자바도 정적타입 이란다..

여기서 정적타입이란..
앞의 변수명을 작성해주는게 정적타입 이다.

ex) int num = 10;
String data = "Hello World";

동적 타입은

num = 10;
data = "Hello World";

처럼 타입을 컴파일 하면서 찾아가는 것 이다.

Kotlin은 함수형 프로그래밍 이다.

함수형의 대표적인 특징으로는

  1. 일급 시민 함수
    함수를 일반 값처럼 다룰 수 있다.
    함수를 변수에 저장할 수 있고 함수를 인자로 다른 함수에 전달할 수 있다.

요즘 사용하는 Dart도 함수형이므로 이 부분에 대해서는 이해가 확 와닿았다.

내가 이해한 일급 시민일란..

int num = add(10,2);
int num = add(add(5,3),2);
와 같은 의미를 지닌것으로 이해하였다.

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

  2. 부수 효과 없음 (side effect)
    함수형 프로그래밍은 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며
    함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

솔직히 2번과 3번은 100% 이해하지 못했다.
내부 상태가 절대로 바뀌지 않는 불변 객체라면.. 함수 내부의 지역변수를 사용하라는건가?? 싶기도 하고

부수 효과 없음은.. 아직 이해하기 힘들 수 있지 뭐!

코틀린의 기초

  1. 함수 변수 클래스 enum 프로퍼티 선언 방법
  2. 제어 구조
  3. 스마트 캐스트
  4. 예외 던지기와 예외 잡기

코틀린에서는 함수 하나로 프로그램을 만들 수 있단다.

ex)

fun main(args:Array<String>) {
	println("Hello,World!")
}

근대 다 main으로 실행하지 않나..?

fun 키워드는 함수를 만들 때 사용하는 것 이란다
args 파라미터 이름 뒤에 그 파라미터 의 타입을 쓴다. Array<> 아니 왜 대괄호 안에 타입지정이 안되는거지??

함수를 최상위 수준에 정의할 수 있다.
이건 dart도 마찬가지여서 이해하기 쉬울 것 같다.

코틀린에서는 배열 처리를 위한 문법이 따로 없다..

println 은 dart에서는 print를 써서 사용했으므로 이해하기 쉬었고
java와 달리 System.out.println 혹은 c# 처럼 Console.writeLine 등으로 사용하지 않아서 좋다.

이게 가능한 이유는 표준 자바 라이브러리 함수를 간결하게 사용할 수 있도록 wrapper를 제공해준다고 한다.

다른 언어와 다르게 println("Hello,World!") 끝 부분에 세미콜론이 없다.

  • 그치만...나는 세미콜론이 있는게 좋은걸 -

함수가 값을 반환하는 타입으로 만드려면 아래와 같이 타입을 지정해줄 수 있다

fun max(a:Int,b:Int) : Int {
	return if(a>b) a else b;
    }

fun max (a:Int,b:Int) : Int <---- 이 부분이 반환하는 타입을 정하는 곳이다.

보통의 함수들은
public void
public int
public String 등으로 작성하는것에 반해
코틀린 이라는 녀석은 뒤쪽에 반환타입이 적혀있다.

-스위프트로 그런거 같았는데..?-

문 과 식 구분

statement , expression
코틀린에서는 if 는 식이지 문이 아니다.
식은 값을 만들어 내며 다른 식의 하위 요소로 계산에 참여할 수 있는 반면 문은 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로 존재하며 .....

라고 책에 작성되어져 있는데 처음에는 뭔소린가 싶었다.

1+1= 2 처럼 식으로 되어져 있는것은 expression

fun max(a:Int,b:Int) : Int {
	return if(a>b) a else b;
    }

처럼 한블록 한 줄 로 이뤄진 코드는 statement 란다.

statement 속에는 expression이 있는것이다.

위의 식은

fun max(a:Int,b:Int) : Int = if (a>b) a else b

처럼도 쓸 수 있다.

하지만 위의 함수는 return이 없다..??

그 이유를 보아하니 함수의 경우에는 return 을 해주지 않아도 컴파일러가 식을 분석해서
식의 결과를 함수 반환타입으로 해준다고 한다.
이러한 기능이 타입추론 이라고 한다.

-그치만 기계가 명확하게 읽을 수 있도록 해주어야 되는거겟지??-

변수

변수의 경우 자바와 다르게 코틀린은 타입지정을 생략하는 경우가 흔하다.

val question = "삶, 우주, 그리고 모든 것에 대한 궁극적인 질문"
val answer = 42

혹은 타입을 지정해서

val answer: Int = 42
로 사용할 수도 있다.

부동소수점을 사용한다면 변수 타입은 Double이 된다.

초기화를 하지 않고 변수를 선언하려면 무조건 타입을 정해주어야 한다.
val answer: Int
answer = 42

  • Dart 의 경우에는 초기화시 값을 넣지못하게 넣으려면 ? 키워드를 사용해야 하는데 코틀린은 아직 널 허용이 되나보다-

변경 가능한 변수와 변경 불가능한 변수
변수 선언시 사용하는 키워드는 다음과 같은 2 가지가 있다.
val - 변경 불가능한 참조를 저장하는 변수다 java 의 final 의 역할이다.
var - 변경 가능한 참조다.

val 변수는 블록을 실행할 때 정확히 한 번만 초기화돼야 한다. 하지만 어떤 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 여러 값으로 초기화 할 수 도있다.

ex)

val message: String;
if(canPerformOperation()) {
	message = "Success";
}
else{
	message = "Failed";
}

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

val languages = arrayListOf("Java"); 불변 참조를 선언한다.
languages.add("Kotlin"); 참조가 가리키는 객체 내부를 변경한다.

var의 경우 변수의 값을 변경할 수 있지만 타입은 변경이 불가능하다.

var answer = 42; 
answer = "no answer" 컴파일 오류 발생

문자열 템플릿

fun main(args:Array<String>) {
	 val name = if( args.size>0) args[0] else "Kotlin"
     println("Hello, $name!")

$를 문자열에 넣으려면 '\' 키워드를 사용한다.

${} 로 사용도 가능

  • dart와 동일해서 이해가 쉽다.-

자바와 코틀린의 클래스 선언 차이

자바

public class Person{
	private final String name;
    
    public Person(String name){
    	this.name = name;
        }
	public String getName(){
    	return name;
        }
}

코틀린

class Person(val name: String)

이런 유형의 클래스를 값 객체 라고 부른다.

public 가기성 변경자가 사라졌다. 코틀린의 기본 가시성은 public 이며 이런경우 생략해도 된다.

클래스 안에서 변경 가능한 프로퍼티 선언하기

class Person{
	val name: String,  읽기 전용 프로퍼티로 비공개 필드를 읽는 단순한 getter를 만들어낸다.
    var isMarried: Boolean 쓸수 있는 프로퍼티로 getter,setter를 만들어 낸다.

클래스 사용 방법

java

Person person = new Pserson("Bob",true)
print(person.getName());
print(person.isMarried());

kotlin

val person = Person("Bob",true) new 키워드 없이 생성자를 호출한다.
println(person.name) 프로퍼티 이름을 직접 사용해도 자동으로 getter를 호출해준다.
println(person.isMarried)

커스텀 접근자

class Rectangle(val height: Int, val width:Int){
	val isSquare: Boolean
    get() {
    	return height == width // 프로퍼티 getter 선언
        }
}

-공부를 하다보니.. dart와 매우 유사하다
물론 dart도 함수형 언어이니까... 변수타입 선언 val 등의 몇가지 키워드만 뺴면 기존의 dart 방식을 그대로 사용해도 되겟다. -

when

when (e) {
is Num ->
	e.value
is Sum ->
	eval(e.right) + eval(e.left)
else ->
	throw IllegaiArgumentException("Unknown expression")
    

when은 약간 switch 문 과 비슷하게 사용됨으로 파악된다..

2단락 느낀점

코틀린은.. Dart와 매우 흡사하면서 조금 다른 모습을 보여왔다.

아마 쓰임새는 함수형과 비슷할꺼고 코틀린만의 특색이 더해진 느낌이였다.

앞으로 배우는데 그렇게 어렵지는 않겠다..라고 생각이 된다 ㅎㅎ

Study URL https://github.com/Kotlin-Book-Study/Kotlin-In-Action

profile
dart,c#,java 개발자! 잡다하게 해서 문제될게 없다!

0개의 댓글