참고 및 인용 도서 : Do it! 코틀린 프로그래밍 및 개인적인 견해
코틀린은 함수형 프로그래밍, 객체 지향 프로그래밍을 지원한다. 객체지향 프로그래밍은 순차적으로 수행되는 절차적 프로그래밍과 다르게 복잡한 프로그램을 작성할 수 있다.
05_1 클래스와 객체의 정의
객체 지향 프로그래밍 개념
1. 추상화(Abstraction) : 특정 클래스 만들 시 기본 형식을 규정하는 방법. 목표로 하는 대상에 대해 필요한 만큼 속성과 동작을 정의하는 과정
2. 인스턴스 : 클래스를 만든다고 객체가 메모리에 존재하지 않음. 클래스로부터 생성한 객체를 인스턴스라 하며 인스턴스를 생성해야 프로그램 메모리에 객체가 존재하게 되는 것
3. 상속 : 부모 클래스의 내용을 자식 클래스가 물려받는 것을 말하며 부모 클래스의 속성을 자식 클래스가 사용 가능함
4. 다형성 : 하나의 이름으로 다양한 처리를 제공함.
5. 캡슐화 : 내용을 숨기고 필요한 부분만 사용하는 것
6. 메시지 전송 : 객체 간에 주고받는 메시지(인스턴스가 함수 호출해서 인자 전달하는 거 말하는 걸까?)
7. 연관 : 클래스 간의 관계
코틀린에서 사용하는 용어 정리
프로퍼티 : 다른 언어에서 변수 혹은 필드, 속성을 코틀린에서는 프로퍼티라 칭함. 자바에서는 '필드'라는 이름을 사용
(프로퍼티라 하는 이유 : 변수 또는 필드에 내부적으로 접근하는 접근 메서드가 포함되어 있기 때문)
메서드 : 함수는 메서드라고 부름
객체 : 인스턴스를 말함
클래스 멤버
- 생성자, 초기화 블록 : 객체 생성시 자동 실행되는 메서드 혹은 코드 블록
- 프로퍼티 : 변수 이름, 변수의 접근 함수 포함된 형태
- 메서드 : 함수 형태
- 중첩 클래스와 이너 클래스 : 클래스 내부에 구성되는 클래스
- 객체 선언 : 클래스 없이 접근 가능한 객체
UML
Unified Modeling Language
- Class Diagram : 클래스 정의와 관계를 나타냄
- Sequence Diagram : 시간의 개념을 통해 클래스에서 생성된 객체의 '실행 흐름'을 나타냄. 객체간의 실행 순서 보기에 적합
- Use Case Diagram : 사용자 관점
- State-Machine Diagram : 시스템 관점에서 상태의 변화를 나타냄. 상태 머신 다이어그램
클래스 선언하기
class 클래스이름 {}
중괄호 생략 가능, 프로퍼티와 메서드를 특별히 정의하지 않고 비어 있는 클래스 선언 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package `20200802`
class Rectangle { // 클래스 정의
// 프로퍼티
var width: Double = 0.0
var height: Double = 0.0
// 메서드
fun drawRectangle(width: Double, height: Double) {
this.width = width
this.height = height
print("this rectangle : width = $width and height = $height")
}
}
fun main() {
val myRec = Rectangle() // 클래스의 생성자를 통해 객체가 생성됨
myRec.drawRectangle(30.0, 20.0) // 객체의 멤버 메서드 사용
}
|
- 프로퍼티 초기화 해주어야 함
- 점 표기법(.)으로 객체의 멤버 메서드에 접근 가능
객체와 인스턴스
- 구체화 또는 인스턴스화 : 클래스로부터 객체를 생성해야 클래스의 객체가 물리적인 메모리 영역에서 실행 가능
- 인스턴스 : 메모리에 올라간 객체. 특정 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 함.(구체화 하는 것)
- 객체 : 특정 클래스가 아닌 모든 실체화된 것을 가리킴
05_2 생성자
클래스 이름 뒤에 소괄호를 사용하여 객체를 생성하게 되는데 이때 소괄호는 클래스로부터 객체를 생성하는 특별한 함수. 외부 인자를 받아 초기화 할 수 있는 constructor() 정의.
class 클래스명 constructor(필요한 매개 변수) // 주 생성자
constructor(필요한 매개 변수) { // 부 생성자
// 프로퍼티 초기화
}
[constructor(필요한 매개 변수) {...}] // 추가 부 생성자
}
부생성자
- 클래스 본문에 선언
- 생성자 사용시 프로퍼티 선언에서 초기값을 지정할 필요 없음
class Rectangle() {
var width: Double
var height: Double
constructor(width: Double, height: Double) {
this.width = width
this.height = height
}
}
fun main(){
var rec = Rectangle(width = 0.0, height = 0.0)
}
- 생성자 매개변수가 프로퍼티 초기화
- this 키워드 : 객체 자신에 대한 참조. this 키워드를 생성자 안에서 사용하지 않으려면 생성자의 매개 변수 명에 언더 스코어를 사용하면 됨 ex ) _width: Double
- 생성자 매개 변수를 다르게 정의해서 부 생성자를 여러개 포함한 클래스를 생성할 수 있음
- 객체 생성시 인자의 개수에 따라 생성자를 다르게 호출할 수 있음
주 생성자
- 클래스 이름과 블록 시작 부분 사이에 선언
class Rectangle constructor(_name: String, _num: Int){
var name: String = _name
var num: Int = _num
fun printRectangle() = print("name is $name, and num is $num")
}
fun main(){
var newRec = Rectangle("gildong", 2)
newRec.printRectangle()
}
- constructor 키워드 생략 가능
- 클래스 선언 부분에 가시성 지시자나 애노테이션 표기가 있으면 constructor 키워드 생략 불가
- 주 생성자 작성 후 같은 수의 매개변수를 가지는 부 생성자 생성시 오류 발생
- 다른 수의 매개변수를 가지는 부 생성자는 생성 가능
class Rectangle constructor(_name: String, _num: Int){
var name: String = _name
var num: Int = _num
constructor(name: String) {
this.name = name
}
fun printRectangle() = print("name is $name, and num is $num")
}
fun main(){
var newRec = Rectangle("gildong", 2)
newRec.printRectangle()
}
프로퍼티를 포함한 주 생성자
- 생성자 매개변수에 프로퍼티 표현(val or var)으로 내부 프로퍼티 생략 가능
ㄴ 생성자 매개변수에서 프로퍼티로 선언되어 본문에서 생략되야 함
class Rectangle constructor(var name: String, var num: Int){
fun printRectangle() = print("name is $name, and num is $num")
}
- 기본값 지정 가능
- 주 생성자에서 기본값을 명시한 경우 객체 생성시 초기값을 전달하지 않아도 되지만 초기값 전달할 때 매개변수 이름과 함께 전달해야 함
class Rectangle constructor(var name: String = "defaultName", var num: Int){
fun printRectangle() = print("name is $name, and num is $num")
}
fun main(){
var newRec = Rectangle(num = 2)
newRec.printRectangle()
}
초기화 블록을 가진 주 생성자
- 객체 생성과 함께 같이 실행되는 코드. 객체 생성 시점에서 수행할 문장을 작성
- 클래스 내부에 init {} 작성. 블록 내부에 실행 원하는 코드를 작성
'NSLog(@"%@", dailyLog)' 카테고리의 다른 글
[Kotlin 20200804] 객체 지향 프로그래밍 - 인터페이스 (0) | 2020.08.04 |
---|---|
[Kotlin 20200803] 객체 지향 프로그래밍 (0) | 2020.08.03 |
[Kotlin 20200730] 프로그램 흐름 제어 (0) | 2020.07.30 |
[Kotlin 20200729] 함수형 프로그래밍 공부 (0) | 2020.07.29 |
자원 고갈 공격 SYN 플러딩 (SYN Flooding) (0) | 2020.07.27 |
댓글