본문 바로가기
TIL, WIL(일기)

230810 4탄.객체지향프로그램(OOP)

by 도슬 2023. 8. 12.

▶앞에서 함께 공부한내용은 제외합니다.◀

6. 캡슐화 : 정보 은닉,  메소드를 통해 외부에서의 접근

interface SuperCar{}
class WideBus(licencePlate: String,private var routeNumber: String, departure: String, arrive: String) :
    Bus(licencePlate, departure, arrive),SuperCar {
    override fun departure() {
        super.departure()
    }
    fun information(){
        println("바뀐 노선번호는 $routeNumber 입니다.")
    }
}

fun main() {
    val seoulToBusanBus = ExpressBus("21가 3683", "서울", "부산")
    val seoulToChunanBus = WideBus("35가 3683","M6000", "서울","천안")
    seoulToChunanBus.routeNumber = "M9000"
}

1) 정보 은닉(캡슐화 되었다.)

간단하게 변수 앞에 private를 붙여주면 해당 클래스 외부에서 private이 붙은 변수로 접근이 불가능하다.

ㄱ. 위 코드에서 WideBus의 변수중 var routeNumber 변수에 private를 붙여줬다.

ㄴ. 그로 인해 main함수에서 seoulToChunanBus의 routeNumber변수를 불러올 수가 없다.

ㄷ. 그 결과 routeNumber의 값을 M9000으로 초기화 시킬 수 없다.

ㄹ. 왜냐하면 private으로 인해 정보가 은닉 되었기 떄문이다.

 

2) 메소드를 통해 외부에서의 접근(캡슐에서 은닉된정보를 빼오는 방법)

:위 에서 private로 인해 정보가 은닉되었기 때문에  WideBus클래스 외부에서 private var routeNumber변수를 불러올 수 없다.

interface SuperCar{}
class WideBus(licencePlate: String,private var routeNumber: String, departure: String, arrive: String) :
    Bus(licencePlate, departure, arrive),SuperCar {
    override fun departure() {
        super.departure()
    }
    fun getrouteNumber():String{
        return routeNumber
    }
    fun setRouteNumber(newRouteNumber: String) {
        routeNumber = newRouteNumber
    }
    fun information(){
        println("바뀐 노선번호는 $routeNumber 입니다.")
    }
}

fun main() {
    val seoulToBusanBus = ExpressBus("21가 3683", "서울", "부산")
    val seoulToChunanBus = WideBus("35가 3683","M6000", "서울","천안")    
    println("노선번호는 $seoulToChunanBus.getrouteNumber()")
    seoulToChunanBus.setRouteNumber("M9000")
    seoulToChunanBus.information()
    val cityBus = CityBus("35가 2306", "999", "강남", "논현")
    val terminal = arrayListOf<Bus>(seoulToBusanBus,seoulToChunanBus,cityBus)
    terminal.forEach{it ->
        it.engineStarart()
        it.departure()
    }
}

ㄱ. 메소드를 통하여 외부에서 은닉된 클래스에 접근이 가능하다.

ㄴ. WideBus클래스 내부에 선언된 getrouteNumber 함수는 단순히 클래스 외부에서 데이터를 읽기만 가능하다. 위 코드에서 보면 처음에 main함수에서 routNumber 값을 M6000으로 초기화 시켜주는데, 그 값을 변경할 수 없다는 말이다.

ㄷ. 도대채 이게 무슨말이냐면 main함수에서 println("노선번호는 $seoulToChunanBus.getrouteNumber()")  이 부분이 일기만 가능하다는 뜻인데, 즉 print만 가능하단소리다.

ㄹ. Wide클래스의 private var routNumber변수를 수정까지 하기위해서는 다른 함수를 이용해야하는데, 난 setRouteNumber라고 이름 지어줬다. 

ㅁ. 그리고 main함수에서 보다시피 seoulToChunanBus.setRouteNumber("M9000") 이런식으로 setRouteNumber() 함수를 이용해서 은닉된 private var  routeNumber값을 수정해 줄 수 있었다.

 

★이상 4탄으로 객체지향프로그램(OOP)공부를 마치도록 하겠습니다.★