본문 바로가기

OOP

OOP 정리

OOP (객체지향 프로그램) 

 

1) 정의

- 유지보수가 편할 수 있도록 사물의 상태와 행동을 클래스로 구현

- 추상화, 캡슐화, 다형성, 상속화

 

2) 추상화

- abstract class

- 공통된 상태와 행동들을 정의 + 공통되지 않은 것들을 숨겨서 분리

- 각 객체에 공통된 속성은 표시하고 불필요한 정보는 숨겨서 인터페이스와 정보 분리

 

abstract class Bus() {

    open fun startEngine(){
        println("버스 엔진 시작")
    }

    open fun stopEngine(){
        println("버스 엔진 정지")
    }

    //추상화
    abstract fun drive()

}

class CityBus : com.example.oop.main5.Bus(){

    override fun startEngine() {
        super.startEngine()
        println("시내버스 엔진 추가 점검")
    }

    //추상화
    override fun drive() {
        println("시내를 달립니다.")
    }

}

class RegionalBus : com.example.oop.main5.Bus(){

    override fun startEngine() {
        super.startEngine()
        println("광역버스 엔진 추가 점검")
    }

    override fun drive() {
        println("지역 간을 달립니다.")
    }

}

 

 

3) 캡슐화

- private

- 외부에서 필요한 정보를 보여주고 필요 없는 정보는 접근 막음

- 연관된 목적을 가지는 변수와 함수를 묶어서 외부에서 접근 못하게 막음

abstract class Bus(val licensePlate: String) {

    //캡술화
    private var engineGear:Int = 0

    var departure = "서울"
    var arrive = "부산"

    fun engineStart(){
        engineGear++
        println("부릉부릉")
        println("$licensePlate 차량이 엔진을 켰습니다.")
    }

    open fun departure(){
        println("출발합니다.")
        println("${departure}에서 ${arrive}로 출발합니다.")
    }

}

class CityBus(licensePlate: String, val routeNumber: String) : com.example.oop.main5.Bus(licensePlate),
    ParkingAvailable {
    val stop1 = "신림역"
    val stop2 = "신도림역"
    val stop3 = "홍대입구역"

    override fun departure() {
        super.departure()
        println("이것은 시내버스입니다.")
        println("정차 정류장은 $stop1 - $stop2 - $stop3")
    }

}

fun main(){

    val cityBus = CityBus("가가 1234", "109")
    println(cityBus.engineGear) //사용 불가능

}

 

 

4) 상속화

- 기존 클래스 최대한 재사용

- 상위 클래스의 변수, 메소드 물려받아 사용

abstract class Bus() {

    open fun startEngine(){
        println("버스 엔진 시작")
    }

    open fun stopEngine(){
        println("버스 엔진 정지")
    }

    abstract fun drive()

}

//상속
class CityBus : com.example.oop.main5.Bus(){

    override fun startEngine() {
        super.startEngine()
        println("시내버스 엔진 추가 점검")
    }

    override fun drive() {
        println("시내를 달립니다.")
    }

}

class RegionalBus : com.example.oop.main5.Bus(){

    override fun startEngine() {
        super.startEngine()
        println("광역버스 엔진 추가 점검")
    }

    override fun drive() {
        println("지역 간을 달립니다.")
    }

}

 

 

5) 다형성

- 하나의 클래스가 여러 가지 타입을 가질 수 있음

- 다양한 모양의 형질 가질 수 있음

- 부모 자식 관계에서 상위 클래스가 동일한 메소드로 하위클래스에 대해서 다르게 동작 가능

//위에 적혀진 클래스 이용

fun main(){

    //다형성
    val buses : List<Bus> = listOf(CityBus(), RegionalBus())

    for(bus in buses){
        bus.startEngine()
        bus.drive()
        bus.stopEngine()
        println()
    }

}

// 출력
//버스 엔진 시작
//시내버스 엔진 추가 점검
//시내를 달립니다.
//버스 엔진 정지

//버스 엔진 시작
//광역버스 엔진 추가 점검
//지역 간을 달립니다.
//버스 엔진 정지

 

 

 

'OOP' 카테고리의 다른 글

예외(Exception)  (0) 2023.12.22
디자인 패턴  (0) 2023.08.25
Private  (0) 2023.08.25
업 캐스팅, 다운 캐스팅  (0) 2023.08.11
객체 지향 프로그램 (OOP)  (1) 2023.08.07