[TIL] #3 Kotlin OOP

Yeon·2023년 7월 19일
0
post-thumbnail

💡 OOP

  • Object Oriented Programming (객체지향 프로그래밍)
  • 여러 개의 독립된 단위(객체)들이 메시지를 주고 받고 데이터를 처리하는 것
  • 프로그램에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만듦
  • 객체들 간의 적절한 결합을 통해 유지보수가 쉬움
  • Keyword
    • Class (클래스)
    • Encapsulation (캡슐화) 관련 속성에 관해 작업을 실행하는 메서드를 클래스에 래핑함
    • Abstraction (추상화) 캡슐화의 확장으로 내부 구현 로직을 최대한 숨긴다는 개념
    • Inheritance (상속) 상위-하위 관계를 설정하여 다른 클래스의 특성과 동작을 토대로 클래스를 빌드할 수 있음
    • Polymorphism (다형성): 여러 객체를 한 가지 공통 방식으로 사용하는 능력

cf. Programming Paradigm




💡 Method

fun 메소드이름(변수명:자료형, 변수명:자료형 ....) : 반환자료형 {
		소스코드 로직
}
  • 행위
  • 특정한 로직을 가지는 소스코드에 붙이는 이름
  • 로직을 추상화해놓고 상황에 맞게 실행할 수 있음
  • 코드의 재사용성을 높일 수 있음



💡 Class

class structure

  • 프로그램의 각 요소별 설계도
  • class 키워드를 활용
  • 클래스에는 정보property와 행위method를 작성
  • 보통 하나의 파일은 한 개의 클래스를 의미하지만, 하나의 파일 안에 여러 개의 클래스가 존재할 수도 있음

1. data class

data class Name {
    property1
    property2
}
  • property만 가지고 있는 클래스
  • 기본 생성자에 1개 이상의 매개변수var/val가 존재해야 함
  • method 자동 생성
    • hashCode() 객체를 구분하기 위한 고유값 리턴
    • equals() 동일한 객체인지 비교해서 true 또는 false 리턴
    • copy() 현재 객체의 모든 정보를 복사해서 새로운 객체 리턴
    • toString() 현재 객체의 모든 property 예쁘게 출력
    • getXXX()/setXXX(매개변수) 변수의 값을 리턴하거나 설정

2. sealed class

sealed class 부모클래스 {
	class 자식클래스1 : 부모클래스생성자
	class 자식클래스2 : 부모클래스생성자
}
  • inheritance와 관련된 개념
    • SuperClass 부모클래스
    • SubClass 자식클래스
  • 상속받을 수 있는 자식클래스들을 미리 정의할 수 있음
  • 무분별한 상속을 방지
  • 컴파일 시점에 생성할 수 있는 자식을 알 수 있음 → 효율적으로 다형성(polymorphism) 구현
  • sealed 클래스의 서브클래스 각각에 대해 여러 개의 인스턴스 생성 가능
    • 상태값을 유동적으로 변경할 수 있음
  • sealed 클래스의 계층을 생성할 수 있음

3. object class

  • Java의 static 대신 사용하는 키워드
  • 프로그램을 실행하는 동시에 인스턴스화



💡 Init & Constructor

1. 생성자

  • 인스턴스의 속성을 초기화
  • 인스턴스 생성시 구문을 수행
  • 기본 생성자: 이전까지 클래스를 만들던 행위와 차이가 없음
  • 명시적 생성자
    • 주 생성자
    • 보조생성자

2. Init

  • 주 생성자
  • 매개변수가 없고 반환되는 값이 없는 특별한 함수
  • 생성자를 통해 인스턴스가 만들어질 때 호출되는 함수
fun main() {

}

// 클래스 선언부에 생성자를 명시함
class Character(_name: String, _hairColor: String, _height: Double) {
    var name: String = ""
    var hairColor: String = ""
    var height: Double = 0.0
    
    // 매개변수를 직접 넘기지 않음
    init {
        println("매개변수 없는 생성자 실행 완료!")
    }
    
    fun fireBall() {
        println("파이어볼!")
    }
    fun compositing(device1: String, device2: String) {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다.")
        return device3
    }
}

3. Constructor

  • 보조 생성자
  • 인스턴스 생성시 편의를 제공하거나 추가적인 구문을 실행할 수 있게 해줌
  • constructor 함수를 만들 경우 반드시 init 함수를 호출하여 초기화 해주어야 함
  • 매개변수를 가지므로 사용될 매개변수를 지정해주어야 함
fun main() {

}

class Character {
    var name: String = ""
    var hairColor: String = ""
    var height: Double = 0.0
    
    // 명시적 생성자 (Constructor)
    // _name, _hairColor, _height와 같이 생성자에 변수를 넘기는 경우에 사용함
    constructor(_name: String, _hairColor: String, _height: Double) {
        println("${_name}을 생성자로 넘겼어요.")
        println("${_hairColor}을 생성자로 넘겼어요.")
        println("${_height}를 생성자로 넘겼어요.")
    }
    
    fun fireBall() {
        println("파이어볼!")
    }
    fun compositing(device1: String, device2: String): String {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다.")
        return device3
    }
}



💡 Object & Instance

1. Object

  • 모든 인스턴스를 포함하는 개념
  • 클래스 타이으로 선언된 것들을 객체Object라고 함

2. Instance

  • 클래스 형태로 설계된 객체를 실체화하면 생김
  • 인스턴스는 메모리 공간을 차지함



💡 Inheritance

  • 공통적인 요소들이 있다면 부모/자식 클래스를 구분해서 상속관계를 만들 수 있음
  • 다른 언어들과 달리 생략된 final 키워드로 기본적으로 상속을 막아둠
    • 무분별한 상속으로 예상치 못한 흐름을 방지
  • open 키워드를 활용해서 상속관계를 만들 수 있음
  • 다형성polymorphism을 구현할 수 있음
  • 클래스의 내용을 변경해야 하는 경우 부모 클래스만 변경하면 됨



💡 Overriding

  • 부모 클래스의 정보property나 행위method를 재설계할 수 있음
  • 주로 부모 클래스의 행위method를 재설계함

    📌 어차피 재설계하면서 상속이나 오버라이딩을 하는 이유?

    • OOP관점에서는 클래스들 간의 관계를 만들고, 일관성을 유지하는 목표를 가짐
    • 만약 필요한 기능이 있을 때마다 별도의 이름으로 만들게 된다면 일관성을 해침
    • 프로그램에 문제가 생기지는 않지만 재사용성이 떨어져 유지보수가 어려움



💡 Overloarding

  • 동일한 이름의 메소드를 여러 형태로 만들 수 있음
  • 반환자료형(반환형)은 오버로딩에 영향을 주지 않음



💡 Interface

  • 공통적으로 필요한 기능을 외부에서 추가해줄 수 있음
interface 인터페이스이름 {
    fun 메소드이름()
}
  • 위 예시처럼 메소드의 로직이 존재하지 않고 이름만 존재할 때 추상 메소드라고 함
  • 원래는 추상메소드만 허용하지만 최근에는 아니여도 괜찮음



➕ Term

KolitnOther Language
Class (클래스)분류, 범주
Property (프로퍼티)속성(Attribute), 변수(Variable), 필드(Field), 데이터(Data)
Method (메서드)함수(Function), 동작(Operation), 행동(Behavior)
Object (객체)인스턴스(Instance)



[참고사이트]
'Kotlin 코틀린의 클래스와 객체', 글 쓰는 개발자
'Use classes and objects in Kotlin', Android Studio
'Vocabulary for Android Basics in Kotlin', Android Developers

0개의 댓글