본문 바로가기
NSLog(@"%@", dailyLog)

[Kotlin 20200802] 객체 지향 프로그래밍 - 클래스와 객체

by 틴디 2020. 8. 3.
반응형

참고 및 인용 도서 : 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.020.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 {} 작성. 블록 내부에 실행 원하는 코드를 작성

 

 

728x90
반응형

댓글