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 |