Kotlin Day02 회고
Kotlin Day02 회고

Kotlin Day02 회고

1️⃣ 오늘의 Keyword

  1. 선언문, 실행문
  1. 강형언어, 약형언어
  1. 식별자 (변수명, 함수명, 클래스명 등)
  1. val, var
  1. 기초 (primitive)타입, 객체(reference) 타입
  1. const
  1. Any
  1. Unit
  1. as
  1. to - toType
  1. is
  1. Single expression function

2️⃣ 학습 내용 및 예시

  • 선언문
    • 변수
      - Top Level
      - 멤버 변수 : 클래스 내에 선언된 변수
      - 지역 변수 : 함수 내에 선언된 변수
    • 함수
    • 클래스
  • 실행문
    값 대입, 참조, 변경
    함수 호출
    조건, 반복, 객체 생성
  • 강형 언어 : 변수의 타입이 강하게 명시하는 언어
    약형 언어 : (!강형 언어)
  • Kotlin ⇒ val num : type ⇒ 예약어 식별자 : 타입
    • val : value : 초기값 대입 후, 값 변경 불가 (Assign-once)
    • var : variable : (===)가능 (Mutable)
  • 코틀린의 권장 사항에서는 기본적으로 모든 변수를 val 로 먼저 지정하고
    변경이 필요한 경우 var 로 작성하라고 함
    • 함수형 프로그래밍의 패러다임에 대해 추가 공부 (변수없이??) **
  • type 선행과 후행
    • 선행
    • 후행 - 가독성, 타입 유추 기법 지원
  • java는 default 초기화를 지원
    • int i = 0; , boolean b = false, String s = null
  • Kotilin은 default을 지원하지 않는다
    • 함수 내 지역변수에서만 initialized (초기화) 되지 않아도 됨, 하지만 변수 사용전에는 초기화 필수
  • 코틀린에서 상수변수 선언
    • 코틀린에서 변수는 property 이다.
    • val로 선언한 변수의 초기값을 변경할 수는 없지만, 일반적인 상수 변수와는 차이가 있다.
      ⇒ 자바와 다르게 property 여서, 값 변경 불가하지만 ‘참조’시 다른 값이 나올 수 있다**
      ⇒ field + getter, setter 함수를 내장한 함수
    • val valData: Int get() { return Random.nextInt(0, 100) } fun main() { println(valData) println(valData) }
    • 상수: const ⇒ 따로 있음
    • 컴파일 타임에 초기화됨
    • 기본 타입과 String만 가능
    • 최상위 레벨, object 선언 내부에서만 사용 가능
      • object 클래스: 익명 클래스 선언 기법, 객체가 단일 객체로 생성이 된다.
        객체가 하나만 생성되는 기법.
    • 리터럴(Literal) 값만 할당 가능 (식별자 할당 불가)
 
  • 기초 데이터 타입
    • 코틀린에서 모든 것이 객체 : 기초 타입은 없다.
    • Int, Double 등은 클래스이며 이 클래스로 타입을 명시하여 선언한 변수는 그 자체로 객체
  • 숫자타입
    • Double, Float, Long, Int, Short, Byte
    • 1_000_000 : Underscore 추가할 수 있다. (가독성)
  • 문자타입
    • Char 타입의 데이터는 작은따옴표로 표현 (’ ‘)
    • String 문자열은 큰따옴표(” “), 큰따옴표 세개(”””)로 묶어서 표현
    • 문자열 템플릿 (string template) 개념으로 문자열 내에 $변수명, ${표현식} 포함할 수 있다.
  • 특수타입
    • Any 타입 - 코틀린의 최상위 클래스
    • Unit 타입
      • 흔히 함수의 반환 구문이 없다는 것을 표현하기 위해 사용
      • 자바의 void에 해당한다 ( 정확히는 차이가 있음)
    • Nothing 타입
      • 의미 있는 데이터가 없다는 것을 명시적으로 선언하기 위해 사용
  • 타입 확인과 캐스팅
    • 타입 체크를 위해 is 연산자 사용
    • is 로 체크결과가 true로 나오면 스마트 캐스팅
    • java의 경우
      • 자바는 기본 타입과 참조 타입을 구분하는 언어
      • 하위 타입이 상위 타입으로 변형될 때 묵시적 형변환
      • 반대일 경우 명시적 형변환 (단, 하위 타입이 상위타입으로 변형 되었다가 되돌아갈 때만 가능)
    • Kotlin의 경우
      • 묵시적 형변환 자체를 허용하지 않음
      • 모든 타입을 객체로 보기 때문.
      • as 타입 캐스팅 (참조타입)
      • to 함수를 이용해 값을 변환한다
 
  • 함수
    • 의미 단위로 로직을 함수로 선언하여 사용
    • 함수 선언
      • fun 함수명(매개변수명: 타입): 리턴타입{ }
      • 매개변수에는 val, var 선언할 수 없다. 매개변수는 모두 val 이다.
      • 의미있는 반환값이 없을 때는 Unit 명시 (생략가능)
      • 함수 안에 또 다른 함수 선언 가능
      • Single expression function 에서는 리턴 타입 생략 가능
        • fun some(a: Int, b: Int) = a + b
      • 함수 오버로딩 - 한 클래스 내에 동일한 이름의 함수를 여러개 선언 - 사용자편의를 위해.

❓ 이해 안 된 부분 / 도움 요청

  • val 은 java에서 fianl 변수와 같다고 보면 되는 것 인가?
    • 강의 뒤에서 의문 해결됨
  • 어제 다른 패키지에 있는 클래스를 import 할때에 as로 불러오는 것에 대한 궁금증
    • 자기 자신인 클래스를 스스로 형변환하는거라고 보면 되는 것인지?
  • 어떤 강사들은 그냥 코틀린에서는 형변환을 toDouble 의 형식으로 한다라고만 가르칠 수도 있다고 생각하는데, 그것은 틀렸다고 보면 되는 것인지
  • 아래처럼 클래스를 함수를 이용해 형변환했을 때 결과는 java의 캐스팅 결과랑 모두 같은가?
//소수점 데이터가 삭제됨 val a4 = 1.13 val a5: Int = a4.toInt() //이렇게 했을 때 소수점은 탈락하고 1이 프린트 되는 것을 확인했다
  • 상하위 관계가 있는 클래스의 경우
    • 아래와 같이 to 로 형변환 할 수 없다는 것을 확인했는데
    • 그렇다면 왜 상하위 관계에서 형변환과 상하위 관계가 아닌 관계에서 형변환의 함수를
      as 와 to 로 구분하는가
val data4: Object = Object() val data5: Any = data4 val data6: Object = data5.toAny()
  • 코틀린에서 변수는 추론되는데, 함수의 리턴 값도 추론이 가능한 경우가 있을텐데 항상 리턴 값의 타입도 작성해줘야하는 것인가? (안된다면 런타임 에러 방지 때문?)
    ⇒ Single expression function 에서만 타입 추론이 가능하기 때문에 생략 가능. (확인필요)**

    ‼️오늘 느낀 점

    • 코틀린의 문법은 이렇다. 라고 그냥 외우듯이 강의가 진행되지 않아서 너무 좋다.
      • 특히나 각 언어의 철학을 시작으로 개념의 차이를 설명해주시는 부분이 취업을 목적으로 하는 수강생들에게 매우 큰 도움이 될 것 같다.
      • 문법을 그냥 외우는 것이 아니라, 언어의 철학을 통해 개념을 이해하면 레거시 코드를 리팩토링하는데에 탄탄한 기초가 될 것이다.
    • 확실히 문법이 아직 익숙하지 않아서 타이핑 하는데 시간이 오래 걸린다. 뇌가 꼬이는 느낌이다.

    ‼️오늘의 영어

    • variable : variation의 형용사형
    • mutable : mutate 의 형용사형
    • initialized : initial의 과거명사형 = 최초의 ‘된’ = 초기화된