Kotlin in Action 3장

존스노우·2023년 2월 27일
0

코틀린

목록 보기
3/10
  1. 코틀린 컬렉션 만들기
  • hashSetof() ,arrayListOf(),hashMap()

  • 코틀린은 자신만의 컬렉션 기능을 제공하지않고 자바 컬렉션을 활용해 상호작용이 쉬움.

  • last() , max() 기능으로 좀더 강력한 기능 있음

Default Parameter

(가독성 향상을 위해)

  • 함수를 호출할때 파라미터가 많은 경우 ?
  • 디폴트 파라미터를 설정해줘서 생략가능하게 할 수 있다 미리 값을 셋팅하는것.
  • joinToString(list,",","", "'"') -> joinToString(list, "; ")
  • 또하나 파라미터 지정인자값을 이름으로 정할 수 있다. 이 경우 순서를 무시할 수 있다.
  • 파라미터 지정인자값 음.. 코드의 가독성이 좋아져서 적용해볼만 하지만..?
  • 실무에선 그냥 안쓰는 추세 같다. IDEA도 잘나오고 개인적으론 딱히 ..

최상위 함수와 프로퍼티

  • 여기서는 한 파일에 모아두고 자바에서 static 메서들 모아두는느낌?(함수)

  • 자바에서는 유틸스 클래스안에 수많은 정적메서드를 선언한적이있다.

  • 코틀린에선 ? 최상위함수를 사용

  • 자동으로 컴파일러가 자동으로 클래스만들어서 정적 메서드 만들어 줌

  • 최상위 프로퍼티는 ? public static final -> const

    확장함수

  • 어떤클래스에 함수를 클래스 밖에 선언된 함수 .

  • 수신 객체 타입: 확장할 클래스 / 수신객체 : 해당 클래스의 인스턴스

  • 확장함수를 만들기 위해 확장할 클래스이름+ 만하면됨. (수신객체타입)

  • 확장함수 안에는 클래스내부에 사용할수있는 프로퍼티만 사용가능(프라이빗, 프로텍티드)

  • 캡슐화를 깨지않는다 ? 프라이빗 멤버는 사용 불가능.

  • 문법적편의? 기존에는 자신을 넘겼어야됬는데 안그러고 선언만하면됨!

  • 적어놓고 나중에 좀더 쉽게설명

    사용하는 이유?

  1. 새로운 함수를 기존 클래스 추가

  2. 기존 클래스 내부 멤버 변수에 접근

  3. 객체지향 프로그래밍에서 코드 가독성 증가

    class Person(val name: String, val age: Int)
    
      fun Person.isAdult(): Boolean {
       return age >= 18
      }
  4. 코드 중복 제거.

    이런 예시들이 있다.
    또한 기존 클래스 함수를 건들지 않고 새로운 함수를 정의함으로서. 필요한 기능을 추가가능
    라이브러리 한해서 인가? String 클래스의 예를 많이 드는거 같다.

    수신 객체의 모든 메소드를 호출할 수 있기 때문에,

    "확장함수내부에서는수신객체의모든메소드를호출할 수있다"라고말하면 확장함수내부에서 수신 객체의멤버메소드와 확장함수를모두 호출할수있다는
    뜻이다.
    이부분이 잘 이해가 되지 않았다.

결론은 .
신 객체의 모든 멤버 메소드와 멤버변수를 접근할수 있다 어렵게 생각할게아니라
그냥 String 내부 모든 함수를 사용해 조합해서 확장함수 내부에서 구현할수 있단말
String 객체는 예시다.

임포트와 확장함수!

  • 확장함수를 사용하기 위해선 임포트를 해야된단 말이지 뭐..

확장함수 호출

  • 확장함수는 수신 객체를 첫 번쨰(this) 인자로 받는 정적 메소드
  • 정적 메소드인데. this로 수신객체를 인자로받아서 사용한다는 말인거 같다.

확장함수는 오버라이드가 안됨!

  • 클래스의 일부가 아님! 밖에서 선언 됨!

  • 확장함수는 컴파일(정적)시점에서 변수의 타입!!!! 에 따라 어떤 확장함수가 호출될지 결정됨.

  • "Test".test() 스트링에 관한 확장함수 호출!

  • 책에서 나온 예시가 인상깊다.

    fun View.showofE() =printIn("I'ma view!")
    fun Button. showoff () = printin ("I'm a button!")
    >›> >›> val view: View = Button ()
    >>> view. showoff ()
    I'm a view!
    
    

오버라이드 되지 않는다! 왜? 실제 타입은 Button 이지만 view의 타입은 View이기 때문

  • 추가로 멤버 함수가 확장함수보다 우선순위가 더 높음 !

확장 프로퍼티

  • 기존 클래스에 새로운 프로퍼티를 추가하고자 할때 사용
  • 기존 클래스를 수정하지않고 새로운 프로퍼티를 추가함으로서 코드중복을 막을수 있어 사용할때 좋다.
    val String.reversed: String
       get() = this.reversed()
  • 이해가 안됐었는데. 코드 그대로 해당 함수를 새로운 프로퍼티로 정의하고 Get으로 어떻게 동작할지 정의한다.
  • 어디에 쓰면좋을까.. 음
  • 확장함수랑 역활이 같다 .
  • 차이점은 ? 프로퍼티는 값을 가진변수 확장함수는 호출시 실행.

컬렉션 처리

  • 코틀린의서 last ,max 등 편리한 컬렉션함수의 정체? 확장 함수!
  • fun LIST.last() : T 이런식..

코틀린의 가변인자 함수

  • 코틀린은 vararg 변경자를 이용해 자바에서 ... 대신 여러개의 가변인자를 받음.

  • 이 가변은인자를 배열로 바로넘길수 없어 스프레드 연산자 작업을 해줘야됨

  • 배열 앞에 * 를 붙이자

  • Ex) funlistof<Ty(vararg values:T):Listery{... )

  • val list=listOf("args:",*args)

    중위 호출

  • 코틀린 문자열 다루기

  • 자바 split은 정규식을 사용함,

  • 코틀린은 다른 조합의 파라미터를 받는 split확장함수 제공

  • 코틀린은 위 함수에 전달하는 값의 타입따라 정규식이나 일반 텍스트중 ,

  • 문자열을 분리한느지 쉽게 앎

  • p r i n t i n ( " 12 . 3 4 5- 6 . Am. s p l i t ( " 1 1. 1- ". t o Re g e x ( ) ) ) 4 정규식을 명시적으로 만든다.

  • 간단히 말하면 코틀린은 정규식을 사용하지않고 문자열을 쉽게 파싱함.

    로컬 함수

  • 중복을 피하기위해 메소드 추출 활용

  • 작은 메소드 많음 -> 메소드간 관계파악 어려움 -> 가독성 저하

  • 그래서 로컬 함수!

  • 함수안에 함수를 사용함으로 중복을 줄임

  • 최종적으론 확장함수로 뽑아서..

    스터디 토론 내용

  • 확장함수는 언제 써야 베스트 프렉티스일까?

  • dam코드를 보면 코드가 정말 간결해진다 주로 응답값에서 응답값변환 및 이런 코드에서

  • 좀 더 간결 해짐 .

profile
어제의 나보다 한걸음 더

0개의 댓글