[코틀린] 기초

Fortice·2022년 6월 28일
0

Kotlin

목록 보기
1/1

0) 개요

0-1) 다룰 내용

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

0-2) 목표

  1. 코틀린의 여러 제어 구조를 배운다.
  2. 코틀린 개념을 활용해 코드를 작성할 수 있는 상태가 된다.

1) 기본 요소

1-1) 함수와 변수

1-1-1) Hello, World로 살펴보기

fun main(args: Array<String>) {
    println("Hello World!")
}
  • fun
    • 함수 선언 키워드
    • 함수가 타입을 가짐
  • args: Array<String>
    • 변수명: 파라미터 타입 형식
    • 변수 선언 방식과 같음
  • 함수를 최상위 수준에 정의 가능
    • Java는 클래스 안에서 가능
  • Array<>
    • 배열 처리가 문법이 따로 없음 []
  • println()
    • 표준 자바 라이브러리 함수를 간결하게 사용 가능
      • Wrapper 제공

1-1-2) 함수

fun 함수명(파라미터명: 파라미터타입, ...) : 함수리턴타입 {
    함수 본문
}

# 2
fun statement(name: String, age: Int):String {
    return if (age >= 30) "old" else "cute"
}

# 3
fun expression(name: String, age: Int) = if (age >= 30) "old" else "cute"

식 vs 문
하나의 값이 되는 것 vs 값을 반환하지 않는 것

  • 함수 리턴 타입
    • 식이 본문일 경우만 생략 가능 (예시 3번)
      • 타입 추론으로 컴파일러가 타입을 알 수 있어, 안 써줘도 됨
  • 함수 본문
    • 코틀린에서는 if문도 식임
    • 블록이 본문인 함수 (2번 예시)
      • {} : 블록
    • 식이 본문인 함수 (3번 예시)
      • = +

1-1-3) 변수

  • 선언
    • val 변수명: 타입
    • val 변수명 = 초기화 값
      • 초기화 시 타입 추론으로, 타입 생략 가능
    • val 변수명: 타입 = 초기화 값
  • 변수 vs 상수
    • val : Value
      • 참조 변경 불가능
      • 자바의 final
    • var : Variable
      • 참조 변경 가능
      • 타입은 고정
    • 참조 변경의 의미
      • 변수가 객체를 가리키는 것을 변경하는 것
      • 객체 자체의 내용은 변경 가능함
  • 문자열 템플릿
    • 변수를 문자열 안에서 사용 가능
    • 문자열에 $변수명 삽입
      • 변수명에 해당하는 변수가 없으면 안 됨
      • 문자열을 붙여쓰고 싶으면 {} 이용
      • 복잡한 식의 경우 {} 이용
fun main(args: Array<String>) {
   val array = arrayOf("1번", 2)
   val doubls = 3.42e4
   val ints = 30
   val name = "fortice"
   println("${name}test $ints $doubls ${array[0]}")
}

1-2) 클래스와 프로퍼티

1-2-1) 클래스

# 자바
public class Person {
    private String name;
    private String nickname;
    private Boolean isPerson;

    Person(String name, String nickname, Boolean isPerson) {
        this.name = name;
        this.nickname = nickname;
        this.isPerson = isPerson;
    }
    public String getName() {
        return this.name;
    }

    public String getNickname() {
        return this.nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Boolean isPerson() {
        return this.isPerson;
    }

    public void setPerson(Boolean isPerson) {
        this.isPerson = isPerson;
    }
}

# 코틀린
class Person(val name: String, var nickname: String, var isPerson: Boolean)
  • 값 객체
    • 코드가 없이 데이터만 저장하는 클래스
  • 가시성 변경자 (public)
    • 기본이 public이어서 필요 없음

1-2-2) 프로퍼티

  • 프로퍼티
    • 필드 + 접근자(메소드)
  • Getter/Setter
    • val : Getter 자동 생성
    • var : Getter/Setter 자동 생성
    • isXXX 의 경우 (is로 시작)
      • Setter : setXXX()
      • Getter : isXXX()
  • 필드에 직접 접근해도, 자동으로 Getter/Setter 호출해줌
    • name = person.name == name = person.getName()
    • person.name = "name" == person.setName("name")

1-2-3) 커스텀 접근자

# 블록 구문
class Person(var name: String) {
    var name: String
        get() {
            return null ? "널" : "이름이"
        }
}

# 식 구분
class Person(var name: String) {
    var name: String
        get() = null ? "널" : "이름이"
}

1-2-4) 소스코드 구조 : 디렉토리와 패키지

  • 선언 대상
    • 클래스, 함수, 프로퍼티 등
    • 메소드만 불러올 수 있음
  • 하나의 파일에 여러 클래스를 넣을 수 있음
    • 파일 이름도 마음대로

1-3) 선택 표현과 처리 : enum, when

1-3-1) enum

enum class RightNose {
  JH, DR, WJ, TH, JH, GH, YJ, BC
}
  • enum class 사용
    • enum : 소프트 키워드 - 다른 곳 앞에 사용 가능
    • class : 키워드
  • 일반 클래스와 같이 프로퍼티 선언 가능
    • ; 필수
enum class RightNose(val age: Int) {
  JH(1), DR(1), WJ(1), TH(1), JH(1), GH(1), YJ(1), BC(1);
}

1-3-2) when

  • Java의 Switch
fun student(age: Int) =
    when (age) {
        8 -> "초등학생"
        14,15,16 -> "중학생"
        17,18,19 -> "고등학생"
        20 -> "대학생"
        else -> throw Exception("NOT STUDENT")
    }
fun caseSet(seed1: Seed, seed2: Seed) =
    when (setOf(seed1, seed2)) {
        setOf(TH,JH) -> "Webooster"
        setOf(JH,YJ) -> "Gamewood"
        else -> throw Exception("NOT TEAM")
    }
fun caseNoParam(emp: Emp) = 
    when {
        emp=="주임" -> "막내"
        emp=="대리" -> "사수"
        else -> throw Exception("선배님")
    }
  • 여러 값 지정 가능
  • break 필요 없음
  • Boolean 식으로 if문처럼 사용 가능

1-3-3) 스마트 캐스트

  • 타입을 is로 검사하고 나면, 해당 타입인 것처럼 사용 가능
    • is : 자바의 instanceof
  • if(s is Seed) s.programing()
  • 타입 검사 후 항상 같은 값이라고 보장되어야 함
    • val 이어야 함

1-4) 이터레이션 : while, for 루프

1-4-1) while

별다르게 추가한 기능이 없음.
그대로 사용

  1. while
  2. do-while

1-4-2) 수의 범위, 수열

  • .. 연산자 사용
    • val oneToTen = 1..10
  • downTo 1
    • 1씩 감소하고 싶을 경우
  • step 2
    • 변화량 절댓값 2로 설정
  • 0 until n
    • 0 ~ n-1 까지 범위

1-4-3) 문자 범위, 맵

  • 문자도 가능하다
    • 'A'..'F'
  • Map의 경우
    • map: TreeMap<Char, String>
    • (key, value) in map

1-4-4) in으로 범위 검사

  • c in 'a'..'z' == 'a' <= c && c <= 'z'

1-5) 예외 처리

1-5-1) throw

  • new로 인스턴스를 새로 생성할 필요 없음
  • throw는 식

1-5-2) try,catch,finally

  • 던질 예외를 메소드에 명시할 필요 없음
  • catch
    • catch (e: Exception) {}
  • try를 식으로 사용 가능
profile
서버 공부합니다.

0개의 댓글