* 객체 지향의 정의와 특징 *
객체 지향 프로그래밍 - OOP
객체 지향 프로그래밍 (Object-Oriented Programming)
프로그램을 어떻게 설계해야하는 지에 대한 방법론 중 하나(패러다임)
About ‘객체’
객체 = '대상을 나타내는 단어'
각 객체와 그 객체들간의 관계를 설계하는 것
여러 객체들의 모임
각 객체는 메시지를 주고 받을 수 있으며,
데이터를 처리할 수 있습니다.
OOP - 특징
추상화, 캡슐화, 상속, 다형성이라는 4가지의 개념이 존재
추상화 (Abstraction)
추상화는 객체 지향 프로그래밍의 핵심 개념 중 하나,
복잡한 시스템을 단순화, 중요한 부분을 강조
불필요한 부분을 숨기는 것을 의미
클래스나 프로토콜을 통해 데이터와 동작을 추상화,
필요한 정보만을 노출시키는 것을 포함
캡슐화 (Encapsulation)
캡슐화는 객체의 상태(데이터)와 행동(메서드)를 하나로 묶고,
외부에서의 접근을 제한하여 객체 내부의 세부 구현을 숨기는 것을 의미
(객체 간의 의존성을 줄이고 코드를 보호하며 유지보수성을 높임)
상속 (Inheritance)
상속은 기존 클래스에서 정의된 속성과 메서드를 다른 클래스에서 재사용하는 것
부모 클래스(상위 클래스, 슈퍼 클래스)의 특성을
자식 클래스(하위 클래스, 서브 클래스)가 물려받아 사용가능
다형성 (Polymorphism)
다형성은 객체 지향 프로그래밍의 특징 중 하나로,
동일한 인터페이스를 가진 다른 클래스들이 각각의 방식으로 동작할 수 있는 능력을 말함.
다형성은 오버라이딩과 연관되어 있으며, 서로 다른 클래스들이 동일한 메서드를 호출할 때
각 클래스의 오버라이딩된 메서드가 실행
오버라이딩 (Overriding)
오버라이딩은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것
자식 클래스에서 부모 클래스의 동일한 메서드 이름을 사용하여
내용을 변경하거나 확장 가능
오버로딩 (Overloading)
오버로딩은 동일한 함수나 메서드 이름을 가지지만
매개변수의 타입, 개수, 순서 등이 다른 여러 버전의 함수를 정의하는 것
(동일한 이름의 다양한 버전의 함수를 사용가능)
* 추상화 *
// 추상화 - 이렇게 타입을 정의해 줄 수 있는것
class Account {}
struct Account {}
protocol Account {}
* 캡술화 *
// 캡슐화
/*
전체를 감싸고 있는 중괄호가 캡슐이라고 보면 되며 내부에 들어있는 프로퍼티와 함수(메서드)들은
접근 제한자로 외부에서 이용이 가능할지 불가능할지 정해지게 되는것
private이 붙은 함수 혹은 프로퍼티들은 외부에서 사용이 불가능합니다.
반드시 내부적으로만 사용이 가능한 것을 이야기합니다.
*/
class Person {
private var location = "서울"
private func rightNow1() {
print("잠시 휴게소에 들려서 딴짓")
}
private func rightNow2() {
print("한숨 자다 가기")
}
// gogo, Busan은 접근 제한자가 작성되어 있지 않기 때문에 디폴트로 이터널이 들어가 있는 상태입니다.
// 그렇기 때문에 아래 두개의 함수는 외부에서 사용이 가능한 것입니다.
func gogo() {
print("====")
print("현재 위치 :", location)
print("====")
}
func Busan() {
print("서울을 출발합니다.")
rightNow1()
rightNow2()
print("부산에 도착했습니다.")
location = "부산"
}
}
* 상속 *
// 상속 - 부모와 자식의 관계
class Animal {
var species = "동물"
}
class Dog: Animal {
var name = "레오"
}
/*
Animal 이라는 클래스가 있으며 Dog라는 클래스가 있는데
Dog는 Animal을 상속 받습니다.
부모는 포함 관계가 정해져 있습니다.
Animal 부모가 조금 더 큰 범주이며, Dog는 거기에 들어가는 부분 집합이라고 볼 수 있습니다.
Animal은 species(종)의 동물이라는 값을 가지고 있으며
Dog에는 name(이름)으로 '레오'가 들어 있습니다.
*/
let dog = Dog() // Dog라는 상수를 만들고
dog.species // Dog의 species를 접근한다면 동물이 출력됩니다.
dog.name // Dog의 name에 접근한다면 레오가 출력됩니다.
/*
dog라는 상수에는 정의가 안되어있지만 상속을 하는 순간 부모에 있는 프로퍼티들을 사용할 수 있게 됩니다.
이는 자동으로 받아오게 되는 것 입니다. 그래서 '동물'이 프린트가 되는것이며 dog에 name은 레오가 되는 것 입니다.
*/
* 다형성 *
// 다형성
1) 오버라이딩 - 상속과 관련이 있음 (부모에 있는 함수를 재 정의)
/*
Dog라는 클래스를 만들어주고 bark라는 메서드를 정의해주고 print '멍멍'을 출력해주는 함수를 정의해줍시다.
Poodle은 Dog를 상속 받는데 Dog가 더 큰 개념입니다.
Poodle에서 bark는 멍멍에서 왈왈로 바꿔주는 개념이 되며 Husky의 경우도 Dog를 상속받아서
왈왈 -> 으르르 마찬가지로 Bulldog도 Dog를 상속 받는데 super.bark()를 하는데 여기서 super는
부모에 인스턴스를 가르킵니다. 때문에 Bulldog이 생성이 되고 super는 부모의 bark가 실행됨을 이야기 합니다.
*/
class Dog {
func bark() { print("멍멍") }
}
class Poodle: Dog {
override func bark() { print("왈왈") }
}
class Husky: Dog {
override func bark() { print("으르르") }
}
class Bulldog: Dog {
override func bark() {
super.bark()
print("bowwow")
}
}
// 출력 예시
var dog: Dog = Dog()
dog.bark() // 멍멍
dog = Poodle()
dog.bark() // 왈왈
dog = Husky()
dog.bark() // 으르르
dog = Bulldog()
dog.bark() // 멍멍, bowwow
2) 오버로딩
// 함수를 식별할 땐 단순히 함수 이름을 보고 하는 게 아니라
// 함수 이름, 파라미터(타입, 갯수, Argument Label), 리턴타입을 모두 종합해서 함수를 식별
// 함수이름은 동일하지만 조금씩 다른것을 확인해볼 수 있습니다.
func printParameter() { // 파라미터와 리턴타입이 없는 버전
print("No param")
}
func printParameter(param: Int) { // param이라는 매개변수에 Int 타입을 지정해 주어졌습니다.
print("Input :", param)
}
func printParameter(_ param: Int) -> Int {
// param이라는 파라미터를 받는데 아규먼트 레이블이 '_' 언더바이기 때문에 호출 하는 쪽에서
// param이라는 키워드를 넣지 않아도 됩니다.
// 얘는 Int를 리턴하기 때문에 print를 해주고 param 그대로 return 해주는 함수입니다.
print("Input :", param)
return param
}
func printParameter(_ param: Int) -> Double {
// 리턴타입이 Double로 변경되어 param을 Double로 묶어서 리턴을 하는 것을 알 수 있습니다.
print("Input :", param)
return Double(param)
}
// 이렇게 4가지 함수를 실행을해도 에러가 나지 않습니다. (이유 : 서로 다른 함수라고 이해하는 것 입니다.)
printParameter() // 단순히 괄호를 열고 닫아서 함수를 실행
printParameter(param: 1) // param에 1을 넣어준 형태
let int: Int = printParameter(2) // '_'언더바로 인해 param를 넣어주지 않고 바로 값을 대입
let double: Double = printParameter(2) // printParameter(2) 이 함수가 실행된 값이 Double로 들어갑니다.
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] 기초 문법종합반 1주차 4일차 정리 - 상속 (0) | 2024.03.12 |
---|---|
[Swift-Study] 기초 문법종합반 1주차 3일차 정리 - 클래스, 구조체, 열거형 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 2일차 정리 - 배열, 세트, 딕셔너리 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 2일차 정리 - 스택, 큐 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 2일차 정리 - 옵셔널 (0) | 2024.03.12 |