본문 바로가기

분류 전체보기

(386)
CH4(4.2). 뻔하지 않은 생성자와 프로퍼티를 갖는 클래스 1. 클래스 초기화 class User(val nickname:String) - 다음과 같이 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 주 생성자라고 한다. 주 생성자는 생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는데 쓰인다. - 함수 파라미터와 마찬가지로 생성자 파라미터에도 디폴트 값을 정의할 수 있다. - 클래스에 기반 클래스가 있다면 주 생성자에서 기반 클래스의 생성자를 호출해야 한다. 기반 클래스를 초기화 하려면 기반 클래스 이름 뒤에 괄호를 치고 생성자 인자를 넘긴다. 인자가 없는 기반 클래스를 상속해도 하위 클래스는 반드시 기반 클래스의 생성자를 호출해야 하므로 꼭 빈 괄호가 들어가야 한다. - 인터페이스는 생성자가 없기 때문에, 어떤 클래스가 인터페이..
CH4(4.3~4.4). 데이터 클래스와 클래스 위임, object 키워드 4.3. 1. 모든 클래스가 정의해야 하는 메소드 - 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드 할 수 있다. 하지만 이 경우, hashCode 정의를 빠뜨리면 해당 메소드를 오버라이드한 클래스가 제대로 동작하지 않는 경우가 있다. why? JVM 언어에서는 hashCode가 지켜야 하는 "equals()가 true를 반환하는 두 객체는 반드시 같은 hashCode()를 반환해야 한다" 라는 제약이 있는데, 이를 어기면 제대로 된 결과값을 얻을 수 없다. HashSet을 이용할 경우 이는 먼저 객체의 해시 코드를 비교하고 해시 코드가 같은 경우에만 실제 값을 비교한다. 따라서 원소 객체들이 해시 코드에 대한 규칙을 지키지 않는 경우 HashSet은 ..
[NLP] TextRank 이용해 핵심 키워드 추출하기 1. Summarization: extractive approaches와 abstractive approaches - 문서 집합을 요약하는 분야를 summarization이라 하며 이 분야의 접근법은 문장 생성 방식에 따라 extractive approaches와 abstractive approaches로 나뉜다. extractive approaches는 문서 집합 내에서 이를 대표하는 단어나 문장을 추출하는 것이고, abstractive approaches는 사람이 요약문을 만드는 것처럼, 문서 집합, 내용을 기반으로 요약문을 생성하는 방법이다. - abstractive approaches의 경우 특정 도메인의 문서 집합을 요약하는 모델을 만들기 위해서는 해당 도메인을 요약한 학습 데이터가 반드시 필요..
[Django] 인스타그램 클론 코딩 Serializer 적용 및 API TEST하기 모델 선택 및 데이터 삽입 선택한 모델: Post 모델. (Post 모델과 1:N 관계를 갖는 Comment, Like, File 모델) Serializer Nested Serializer로 post와 post_likes, comments, post_files 관계 표현. Serializer method field로 author(User 모델)의 field인 nickname을 가져와 사용. class PostSerializer(serializers.ModelSerializer): author_name = serializers.SerializerMethodField() likes_count = serializers.SerializerMethodField() comments_count = serializer..
CH4(4.1). 클래스 계층 정의 1. 코틀린 인터페이스 - 코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있다. implements를 쓰는 자바와는 다르게, 클래스 상속과 마찬가지로 콜론(:)을 붙이고 인터페이스 이름을 적는 것으로 구현을 처리한다. 자바와 똑같이 인터페이스는 다중 구현이 가능하고, 클래스는 오직 하나만 확장할 수 있다. - 자바의 @overried 애노테이션과 비슷한 overried 변경자가 있다. 하지만 이는 상위 클래스, 인터페이스에 있는 프로퍼티나 메소드를 오버라이드 할 때 꼭 사용해야 한다. - 인터페이스 메소드도 디폴트 구현을 제공할 수 있다. 이 경우 그냥 메소드 본문을 메소드 시그니쳐 뒤에 추가하면 된다. 만약 한 클래스가 같은 메소드에 대해서 서로 다른 디폴트 구현이 있는..
CH3(3.4~3.6). 함수 정의와 호출(2) 1. 컬렉션 처리 - 가변 인자 함수 정의하기: 코틀린의 가변 길이 인자는 파라미터 앞에 vararg 변경자를 붙이면 된다. fun listOf (vararg values:T): List {...} 또한 코틀린에서는 자바처럼 배열을 그냥 넘기는 것이 아닌, 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야 한다. 이를 스프레드 연산자가 해주는데, 실제로는 전달하려는 배열 앞에 *를 붙이면 된다. - 값의 쌍 다루기: 중위 호출과 구조 분해 선언 val map = mapOf(1 to "one", 2 to "two") - 여기서 to 라는 단어는 코틀린 키워드가 아닌, 중위 호출을 이용해 to 라는 일반 메소드를 호출한 것이다. 1.to("one") // to 메소드를 일반적인 방식으로 호출 ..
CH2(2.4~2.5). Iteration과 예외처리 1. while과 for 루프 - while 루프의 경우 자바와 동일 - for 루프: 코틀린에서는 자바의 for 루프와 대응하는 요소가 없다. 대신 범위를 사용한다. 코틀린의 범위는 양끝을 포함하는 구간이다. - 수에 대한 iteration fun fizzBuzz(i: Int) = when{ i % 15 == 0 -> "Fizzbuzz" i % 3 == 0 -> "Fizz" i % 5 == 0 -> "Buzz" else -> "$i " } >>> for (i in 1..100) { ... print(fizzBuzz(i)) ...} 1 2 Fizz 4 Buzz Fizz 7 8 ... - 증가값을 사용하려면 step을, 끝 값을 포함하지 않으려면 until을 사용한다. downTo를 사용하면 역방향 수열을..
CH3(3.1~3.3). 함수 정의와 호출(1) 3.1 코틀린에서 컬렉션 만들기 - 코틀린은 자신만의 컬렉션 기능을 제공하지 않는다. 자바 컬렉션과 똑같은 클래스를 사용한다.(상호호환성!) 3.2 함수를 호출하기 쉽게 만들기 - 만약 자바 컬렉션이 제공하는 디폴트 출력 형식과 다르게 원소를 출력하고 싶다면 어떻게 해야 할까? joinToString()함수를 구현하여 이 문제를 해결할 수 있다. fun joinToString( collection: Collection, separator: String, prefix: String, postfix: String ): String { val result = StringBuilder(prefix) for((index, element) in collection.withIndex()){ if(index > 0) ..