오늘은 객체 지향 프로그래밍의 여러가지 개념 , 특징을 차례대로 학습해보자.
객체 지향이란?
프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체 로 만들고,
객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
구성 요소
1) 클래스
객체(object)를 생성하기 위한 설계도이다.
어떤 동작이 있는지, 어떤 변수를 갖고 있는 지 미리 명시해두는 역할을 한다.
2) 인스턴스
클래스는 집에 필요한 공통적인 내용들이 들어있는 집의 설계도 (공통분모) ,인스턴스는
설계도 의 실질적인 값을 갖고 있다. 인스턴스는 힙 영역에 할당된다.
3) 객체
객체란 인스턴스 + class를 포함하고 있는 개념으로 객체 지향 프로그래밍에서 의미있는 작은 단위를 담당한다.
마치 큰 집을 지을 때 필요한 블럭 같은 역할을 한다.
class Pen {
var color: Color
init(color: Color) {
self.color = color
}
}
var myPen = Pen(color: .red)
var yourPen = Pen(color: .orange)
위 코드를 보면 오른쪽 같은 구조가 그려진다.
myPen 변수와 yourPen 변수는 스택에 저장되고 인스턴스를 가르키는 포인터 역할을 한다.
myPen 인스턴스와 yourPen 인스턴스는 Heap영역에 저장되어 각 포인터에게 가르킴을 당한다.
Pen 클래스도 역시 Heap에 저장되어 myPen과 yourPen에게 설계도를 제공한다.
특징
객체 지향 프로그래밍은 크게 추상화, 캡슐화, 상속, 다형성 이 4가지 특징을 갖는다.
각각의 개념과 역할을 알아보자
1) 추상화
정의
추상화는 객체에 공통된 속성과 행위를 추출하는 과정이다.
특징
1) 불필요한 정보는 숨기고 밖으로 필요한 정보만 표한하여 프로그램을 간단히 만듬
실질적인 예를 들어보자
현대와 같은 다른 자동차 브랜드가 추가될 수도 있다.
이때 추상화로 '자동차'를 구현 해놓으면 다른 자동차 브랜드 코드를 수정할 필요 없이
추가로 만들 부분만 새로 생성해주면 된다.
2) 캡슐화
정의
캡슐화는 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 과정이다.
특징
1) 낮은 결합도를 유지할 수 있다. (재활용이 원할함)
2) 정보 은닉이 가능하다.
3) 상속
정의
클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의
속성과 행위를 물려받는 것을 말한다.
특징
1) 재사용으로 인한 코드가 줄어든다.
2) 범용적인 사용이 가능하다.
3) 상위클래스의 변경이 어려워진다.
3) 다형성
정의
다형성(polymorphism)이란 하나의 객체 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질이다.
우리는 다양한 방법으로 다형성을 경험할 수 있다.
오늘은 대표적으로 2가지 방식만 알아보자
첫번 째는 오버라이딩이다.
오버라이딩이란 상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의하는 것을 말한다.
class Animal {
func eat() { print("동물") }
}
class Cat : Animal {
override func eat() {
print("고양이")
}
}
var cat: Animal = Cat()
cat.eat() // 고양이
두번 째는 오버로딩이다.
오버로딩은 같은 이름의 메서드가 인자의 개수, 타입 또는 메서드 리턴타입을 다르게 하는 것을 말한다.
여기서 중요한 것은 메서드 이름은 같고 나머지 중 하나라도 다르면 오버로딩이라는 것이다.
class SomeClass {
func someFunction() { print("A") }
func someFunction(a: Int) { print("A\(a)") } // 매개변수가 다름
func someFunction() -> Int { return 5} // 리턴 타입이 다름
}
출처
'CS > 객체지향' 카테고리의 다른 글
객체 지향 프로그래밍 (2) [ S.O.L.I.D ] (6) | 2024.08.28 |
---|