언어/Kotlin 29

Kotlin : nullable 타입 안전하게 참조하기 (ft.Safe Call)

아래 예시 코드를 보자. 물론 nullable 타입인 Movie? 타입의 bestMovie 가 아무 제한 없이 Movie 클래스의 속성에 참조할 수 있다면 위험하다. 아무것도 아닌 객체의 속성 참조는 NullPointerException을 일으킬 수 있기 때문에 (이를 코틀린에서는 런타임 전에 컴파일러를 통해 알려주긴 하다만). 그러면 참조하기 전에 그 객체가 정말 존재하는 객체인지 확인 후, 참조하면 되는 거 아닐까? 1. null 확인하기 bestMovie 가 실제 객체를 참조하는게 확실한 경우, 즉 Movie 타입을 참조하고 있다면 그 타입 속성에 참조하는게 가능하다. => 아래처럼 if 절을 이용해서 확인하면 된다. var bestMovie : Movie? = null if(bestMovie !=..

언어/Kotlin 2022.11.09

Kotlin : null 이란?

지금까지 각 변수에는 항상 어떠한 값이 제공되있어야 했다. 즉, 각 변수는 항상 특정한 개체를 참조하는데, 참조변수가 개체를 참조해서는 안되는 경우도 존재한다. 예를 들어 지금까지 만들어진 영화들 중 최고의 영화를 변수에 저장하고 싶다고가정해보자. val bestMovie = TODO() 하지만 아직 제작된 영화가 없다면 과연 이 변수는 어떤 영화 개체를 참조해야 할까? 물론 아무 의미가 없는 Movie 개체를 따로 만들어 둘 수 있지만 우아(?)하지는 않은 방법이다. 어찌됐든 게임(영화만들기 게임)이 막 시작했을 때, 아직 최고의 영화로 지정된 영화는 존재할 수 없는 거니까... 1. Nullable Types 코틀린에서 참조변수가 아무것도 참조하지 않도록 하는 방법이 있다. null 키워드를 이용하면..

언어/Kotlin 2022.11.09

Kotlin : 인터페이스 (Interface)

0.5 인터페이스란 인터페이스는 데이터 구조의 구현을 지정하지 않고 작업을 지정한다. 추상 메서드나 추상 속성(즉, Backing filed가 없음) 등이 인터페이스에 정의된다. 어떠한 특정 작업 세트를 제공하는 데이터 유형을 정의한다고 생각하면 된다. [기능이 구현되는 방식을 결정할 필요가 없는 기능 집합] 1. 인터페이스의 필요성 ( https://bruders.tistory.com/44 ) 에서 사용했던 클래스 계층 구조이다. 이 때 만들어진 영화는 비평가로부터 평가되어야 한다고 가정해보자. 이를 위해 비평 (Rating) 과 비평가 (Reviewer)에 대한 클래스를 추가로 만든다면 클래스 계층 구조는 어떻게 생겨야 할까? 왼쪽과 같은 구조를 생각했다고 가정해보자. 그러면 Reviewer 클래스는..

언어/Kotlin 2022.11.07

Kotlin : 추상클래스 (Abstract class)

1. 추상클래스의 필요성 클래스를 정의할 필요가 없는 고유한 개체 (object 키워드) 가 있듯, 객체가 없는 클래스가 존재한다. 그런 클래스가 과연 유용할까? 클래스는 ( https://bruders.tistory.com/21 ) 에서 얘기했듯 동일한 유형의 객체에 대한 일반적인 구조를 정의한다. 위 코드는 지난번에 코틀린 상속관련 예시로 작성한 코드다. Actor 클래스는 Actor 객체의 구조를, Director 클래스는 Director 클래스만의 구조를 정의했었는데, 두 사이 공통분모가 존재해 이를 따로 빼둘 둘의 상위 클래스인 Person 클래스를 만들었던 것이다. 사실 Actor 클래스와 Director 클래스의 객체만이 필요했을 뿐, Person 클래스의 객체는 따로 필요하지가 않은 상태라..

언어/Kotlin 2022.11.05

Kotlin : Object Composition & Aggregation 이란

1. Aggregation 위와 같이 코드를 작성했다고 생각해보자. 각 변수들이 어떤 객체들이 참조하고 있는지 그림으로 그려보았는데, 보면 참조변수 steven이 참조하는 Director 객체를 두개의 서로 다른 객체로부터 참조되고 있는게 보인다. (Director 객체인 steven이 단 하나의 영화에만 속해있는 게 아니라 여러 영화에 속해 있는 상태) 이렇게 여러개의 객체가 하나의 같은 객체를 참조하고 있는 걸 Aggregation 이라 부른다. 자 그럼 이제, secondMovie 객체를 삭제했다고 가정해보자. secondMovie 객체가 없어지면 당연히 그 객체가 다른 객체를 참조하고 있던 그 관계? 또한 사라진다. 하지만 위 그림을 보면 알 수 있듯, secondMovie 가 삭제되었지만 그 객..

언어/Kotlin 2022.11.03

Kotlin : Type-compatibility (ft. Upcast, Downcast)

1. Type-compatibility, 타입 호환성 일반적으로 더 일반적인 타입의 변수에 더 구체적인(더 전문화된) 타입의 개체를 할당하는 것은 항상 가능하다. 더 일반적인 유형은 더 적은 수의 가능한 작업을 정의하고 하위 타입이 상위 타입의 모든 작업을 허용한다는 것이 보장되어 있기 때문이다. 밑에 예를 보자. a와 p는 당연히 문제될 게 전혀 없다. 반면에 좀 살펴봐야 할 부분은 p2와 a2 다. p2는 Actor 타입이 상위 타입인 Person 타입의 모든 작업들이 허용 가능하니 문제되지 않는다 [모든 영화배우는 사람이다]. a2는 Person 타입이 하위타입(더 전문화된)인 Actor의 모든 작업들이 실행 가능하지 않으므로 프로그래밍 실행 전 이미 컴파일러 에러가 뜬다 [모든 사람은 영화배우가 ..

언어/Kotlin 2022.10.31

Kotlin : Supertypes and Subtypes

1.타입과 클래스 속성의 상속은 코드중복을 피할 수 있는, 합리적인 방법일 뿐만이 아니라 객체들 사이간에 타입관계들을 결정짓는다. 한 객체의 Type은 그 객체에서 수행할 수 있는 모든 작업들을 결정짓는다. 숫자 자료형들이 특정 연산만 가능한 것처럼, 객체의 유형에 따라 특정 작업만이 가능하다. 예를 들어 객체 내에 정의된 메서드들. 작업에는 보여지는 속성의 읽기와 쓰기도 포함된다. 1.5 Supertypes and Subtypes, 상위타입과 하위타입 Director 클래스는 Person 클래스에서 파생되었고 확장되었다. '확장'이란 속성과 메서드들이 추가돠는 동시에 Person 클래스가 가지고 있던 기존 속성 및 메서드가 모두 상속되는 것을 의미한다. 이는 하위 클래스의 객체들이 상위 클래스의 객체들..

언어/Kotlin 2022.10.30

Kotlin : Polymorphie (ft.오버라이딩)

1. Polymorphie 란? 다형성(Polymorphie)은 공통 인터페이스를 통해 다양한 클래스의 구현에 액세스 할 수 있게 해준다. Polymorphie는 그리스어에서 유래했으며 대략, "다양한 형태"를 의미하며 객체 지향 프로그레밍의 중심 개념 중 하나이다. 이는 우리가 같은 방식으로 매우 다르게 설계된 객체를 사용할 수 있게 해준다. 저번의 클래스 계층 구조의 예시로 들었던 것이다. 탈것 클래스 내에 ' 출발하다()' 라는 메서드가 있다고 가정해보자. 그러면 자전거 클래스와 차 클래스의 출발하다()라는 메서드의 구조는 서로 당연히 다를 것이다. (출발하다() 메서드의 어떤 구현이 선택되는지에 대한 결정은 런타임에서 발생한다고 한다.) 2. Overriding 오버라이딩 Super Class의 ..

언어/Kotlin 2022.10.30

Kotlin : 상속 (inheritance) 적용해보기

https://bruders.tistory.com/41 에서 썼던 코드에 상속을 적용해보자. [코드] import kotlin.random.Random import kotlin.math.round class Actor(val firstName: String, val lastName: String, val genre: List){ var salary = round(Random.nextDouble(100000.0, 2000000.0)) val skill : Skill = Skill() fun movieSuccessfullyProduced(){ skill.currentSkill += skill.learningSpeed } } class Director(val firstName: String, val lastN..

언어/Kotlin 2022.10.28