객체 지향 프로그래밍 (Object Oriented Programming)
객체 지향 프로그래밍이 무엇인가요?
컴퓨터 프로그래밍 패러다임 주 하나입니다. 프로그래밍에서 필요한 데이터를 추상화하여 객체를 만들고 객체간 유기적인 상호작용을 통한 로직을 구성하는 프로그래밍 방법론입니다.
주요 키워드
- 클래스, 인스턴스
- 추상화
- 캡슐화
- 상속
- 다형성
장단점
장점
- 코드 재사용성이 높아짐
- 코드가 클래스로 분리되어 있기 때문에 유지보수가 쉬움
- 추상화와 캡슐화를 기반으로 모듈화하여 대형 프로젝트에서 업무 분담이 쉽다.
단점
- 설계에 많은 시간과 노력이 필요하다.
- 처리속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있다.
주요 질문
클래스와 인스턴스의 차이는 무엇인가요?
클래스는 어떤 대상에 대한 특성(attribute)과 행위(behavior)를 변수와 메소드로 변환하여 정의한 것입니다. 인스턴스는 이렇게 정의된 클래스를 기반으로 실제 메모리에 할당된 것입니다.
객체 지향 프로그래밍에서 추상화는 무얼 말하나요?
추상화란 공통적으로 사용될 수 있을 만한 속성이나 기능을 묶어 정의해둔 것을 말합니다. 예를 들어 선생님에는 교장선생님/교감선생님 뿐만아니라, 과학 선생님, 국어 선생님 등 선생님 마다 전공이 다를 수 있습니다. 이를 ‘선생님’으로 추상화하면 다음과 같습니다.
protocol Teacher {
let name: String
let grade: Int
let subject: String
let manageClass: Class?
func teach() {}
func makeTest() {}
}
간략하게 선생님의 이름, 등급(교장/교감/일반 등), 과목, 담당클래스를 정의했습니다. 모든 선생님들은 학생들을 가르치고, 시험을 만들 수 있습니다.
이렇게 되면 과학 선생님이든, 국어 선생님이든 교장선생님이든 프로토콜을 채택한다면 선생님으로 묶을 수 있습니다.
class MathTeacher: Teacher {}
class ScienceTeacher: Teacher {}
그리고 시험기간엔 모든 선생님들이 시험문제를 만들도록 할 수 있겠죠
let mathTeacher = MathTeacher("김수학")
let scienceTeacher = ScienceTeacher("이과s")
let array = [mathTeacher, scienceTeacher]
array.forEach { teacher in
teacher.makeTest()
}
좀 어거지 코드이긴 하지만, 그렇습니다. 하핳
객체 지향에서 캡슐화란 무엇인가요?
캡슐화란 객체가 맡은 역할을 수행하기 위한 목적을 묶는 것을 이야기합니다. 예를 들어 선생님이 이제 시험과, 그에 대한 답안을 가지고 있다고 합시다.
protocol Teacher {
...
var questionSheet: QuestionSheet?
var answerSheet: AnswerSheet?
...
}
만약 시험괴 답안지가 외부에서도 접근이 가능하다면 외부에 유출되거나, 다른 주체에 의해서 이 답안지가 변경될 수도 있겠죠. 이를 막기 위해서 외부에서는 이 questionSheet과 answerSheet에 대해 접근하지 못하도록 막고 필요할 때는 함수를 통해서만 접근케 합니다.
class MathTeacher: Teacher {
...
private var questionSheet: QuestionSheet?
private var answerSheet: AnswerSheet?
...
func makeTest() {
self.questionSheet = QuestionSheet()
self.answerSheet = AnswerSheet()
}
func scoreTest(answerOfStudent target: AnswerSheet) {
var score = 0
for i in 0..< answerSheet.questionCount {
let answer = self.answerSheet.answerOfQuestionNumber(i)
let studentAnswer = target.answerSheet.answerOfQuestionNumber(i)
score += (answer == studentAnswer) ? 1 : 0
}
}
}
시험지와 답안지를 private으로 선언함으로써 외부에서는 이 변수에 접근할 수 없도록 막고, 학생의 답변을 채점할 때는 학생의 답을 받아서 내부적으로 점수를 계산하게 했습니다.
이런 식으로 필요한 변수와 함수들을 한데 묶으면서 동시에 적절한 접근제어자를 통해 데이터를 은닉화할 수 있습니다.
상속이란 무엇입니까?
상속는 부모클래스의 속성과 기능을 그대로 이어받아 사용함을 이야기 합니다. 필요하다면 자식 클래스에서 변수나 함수를 추가할 수 있습니다.
다중상속은 불가능합니다.
다형성이란 무엇인가요?
부모클래스에서 물려받은 속성이나 함수를 자식 클래스에서 필요하다면 override하여 재정의하여 사용하는 것입니다.
overriding, overloading 의 차이
overriding : 상속관계에서 부모에서 정의한 변수나 함수를 재정의하여 사용하는 것. overloading : 동일한 이름을 가진 함수를 매개변수를 달리하여 여러개를 정의하는 기법.