코딩을 배우고 , 여러가지 지식을 배우면서 엄청 많이 들어본 단어 OOP (객체지향) 분명 객체지향을 공부했지만 남들에게 객체지향을 설명해봐!라고 하면 원활한 설명을 하지 못하는 게 내 현실이기에 이번 기회에 다시 한번 정리하는 시간을 가지려고 한다.
객체지향에 대해 복습을 하겠다고 마음을 먹고 여러 자료들을 찾아보니 머리가 띵한느낌 분명 과거에 공부했을 때도 열심히 OOP에 대해
공부했다고 생각을 했는데 시간이지나 다시 복습 겸 공부를 하니 그때 이해한 것들이 쉬운 내용이 아님에도 불구하고 음 그런 느낌이군 하고 넘겼던 부분들도 발견하게 되고 더 많은 강의들을 보다 보니 잘 못 공부했던 부분들이 보이게 되어 상당히 의미 있는 공부가 되었다.
학창시절 객체지향 프로그래밍에 대해 수업을 하면 단 한 시간이면 수업이 끝나고 그 수업을 들은 학생들은 객체지향 프로그래밍?
class만 잘쓰면되는거네 쉽네 라는 생각을 가진 학생들이 많았을 것 같고 나 역시 학부생 때는 그런 생각으로 객체지향을 생각했던 것 같다.
개발자가 되고 계속 공부를 하면서 객체지향이 절대 쉽지않은 내용이라는 걸 이해하고 1시간 만에 끝낸다 라는 마인드 자체가 불가능할 정도로 방대한 양이라는 걸 깨닫게 되었다. 그렇게 객체지향을 공부하다 보니 하루라는 시간을 훌쩍 넘기게 되고 그마저도 시간이 부족하여 화요일 공부를 시작했는데 공부한 것을 정리하고 복습하고 정리하려면 최소 금요일은 돼야 할 것 같다. (그래서 글이 나눠질 것 같다.)
객체지향을 이야기하기전 갠트백이 말한 프로그래밍의 가치 프로그래밍이 추구하는것을 먼저 정리한 후 OOP에 대해 작성하려고 한다.
프로그래밍에서 중요한 가치
- 커뮤니케이션
- 프로그래밍에 있어 가장 중요한 가치는 커뮤니케이션
- 개발자는 코드로 커뮤니케이션을함 , 의사소통의 도구임
- 코드는 거짓말 하지 않는다.
- 읽고 이해할 수 없는 코드는 가치가 낮다 읽어도 대화가 되지 않는다
- 단순성
- 코드는 단순해야 한다
- 복잡한 문제도 점점 단순화시키다 보면 단순한 문제의 조합일 뿐
- 커뮤니케이션에 도움이 된다.
- 읽기 쉽기에 서로 커뮤니케이션에 좋음
- 버그가 없어짐.
- 간단할수록 버그가 생길 확률이 낮아짐
- 복잡한 문제를 단순한 레벨로 낮추기.
- 단순함은 개발자의 수준에 따라 다르다 (ex 주니어 개발자 , 시니어 개발자 )
- 미래의 확장을 위해 불필요하게 복잡하게 만들 필요는 없다
- 짧다 = 단순함은 다르다
- 코드는 단순해야 한다
- 지역적 변화
- 코드를 수정할 때 함께 수정되어야 하는 부분을 최소화 / 지역화
- 코드의 관리 비용을 낮춤
- 여러 패턴이 추구하는 방향
- 기능 하나를 변경하는기위해 한 곳만 변경을 선호
- 특정 기능을 변경하기 위해 프로젝트 내의 모든 함수를 수정하는 일은 좋지 않음
- 최소 중복
- 코드의 중복을 최소화
- 중복된 코드는 한 군데 수정이 필요하면 다른 곳도 변경시켜야 함
- 로직과 데이터의 결합
- 로직은 데이터를 기본으로 동작
- 데이터가 수정되면 로직이 수정될 확률이 높음
- 대칭성
- 코드는 대칭성을 가지면 좋다
- ex Add / Remove는 한 곳에
- 코드를 이해하기 편해짐
- 중복 코드를 줄이기 쉬움
- 코드는 대칭성을 가지면 좋다
- 선언 전표현
- 어떻게 하느냐 보다 무엇을 하느냐를 기술한다.
- ex 변수를 더해서 뭘 하고 뭘 하는 거보다 변수를 계산한다
- 어떻게 하느냐 보다 무엇을 하느냐를 기술한다.
- 변화율
- 변화율이 다른 내용 분리하고 같은 내용은 묶어서 표현
- 같은 타이밍 , 비슷한 타이밍에 사용하는 로직들은 묶어서 표현
- 변화율이 다른 내용 분리하고 같은 내용은 묶어서 표현
여기에 나와있는 가치는 회사의 프로젝트를 리팩터링 할 때 가장 많이 상기하면서
리팩터링을 작업을 했고 애매 하다 싶으면 다시 공부 , 고민시간 , 설계구조 다시 만들기 등을 통해 리팩토링을 했었다.
객체 지향을 단순하게 이야기하면
OOP는 객체를 기준으로 코드를 나누어 구현한다. 자바의 경우 그 구성 부분 단위가 클래스이다. 자세히 말하자면 클래스는 설계 도고 직접 일을 하는 구현체는 인스턴스다.
OOP를 이야기하면 SOLID가 다들 가장 먼저 나오는데 그전에 앞서 OOP에서 중요한 가치들을 몇 가지 공부하고 SOLID에 대해 정리하려고 한다.
OOP는 단순히 클래스를 만들어 사용하면 OOP냐?
아니다 절대 대학생 시절의 내가 가지고 있던 생각이었고 OOP를 생각했을 때 이보다 훨씬 더 복잡한 가치들이 정말 많다.
OOP를 이야기하게 되면 가장 많이 나오는 이야기가 Inheritance (상속) / Composition (결합)
Inheritance (상속)
휴학생 시절 본격적으로 개발을 공부하기 시작하면서 OOP에 대해 공부를 했을 때 OOP에서 추구하는 가장 중요한 가치는 상속이다.
라고 공부를 했었다. 예제들을 보면 상속을 가장 중요한 가치로 떠올리게 할 만한 예제들이 나오는데 과연
상속을 이용하여 코드를 재활용하게 되고 필요한 기능들을 사용하게 되는데 이게 가장 중요한 가치인가?
상속을 슈퍼클래스의 기능을 확장하기 위해 사용한다면 이게 좋은 걸까?
결국 상속이 꼬리를 물게 되면 재활용을 가장한 복잡한 코드가 되지 않는 걸까?
ex 생명체 -> 심장을 가진 생명체 -> 심장을 가지고 뇌가 있는 생명체 -> 심장을 가지고 뇌가 있고 두발로 걷는 생명체 -> 심장을 가지고 뇌가있고 두발로 걷고 말을 하는 생명체 -> 심장을 가지고 뇌가있고 두발로 걷고 한국말을 하는 생명체 -> 나
만약 이렇다면 생명체가 변하면 하위의 클래스들이 모두 변하게 되고 심장을 가지고 뇌가 있고 두발로 걷는 생명체가 변하게 된다면 그 하위의 자식들이 모두 변하게 된다. 이게 과연 좋은 것일까? 이렇게 많은 상속의 단계를 지나고 나면 분명 내가 컨트롤할 수 없는 수준의 상속이 생기게 되고 그 코드를 변경하기 위해 또 개발자의 노력이 들어가게 된다.
그렇다고 절대 상속이 나쁜 건 아니라고 생각한다.
코드의 정답은 없기에 적재적소의 상황에서 잘 사용하는 것이 핵심이고 적재적소의 상황에 사용하기 위해서는 꾸준한 공부가 필요하다
나 같은 경우 나 같은 경우 MVVM를 리팩터링 하는 과정에서
ViewController에서 기본적으로 가지는 몇 가지 필수 요소들 ex Disposebag , viewModel , viewDidLoad 에 실행되야하는 함수들 등 몇가지 ViewController라면 다 가지고 있는 기본적인 개념들을 슈퍼클래스로 만들어서 사용하고 있다.
Composition (결합)
Composition 은 여러 객체를 합하여 다른 하나로 만드는 것을 말한다. 어떤 객체가 다른 객체의 일부분인 경우다. 자동차가 엔진, 트랜스미션, 헤드라이트 등으로 구성되는 것 같은 경우이다.
나 같은 경우 현재 진행 중인 프로젝트에서 SuperClass를 상속받은 ViewController에
추상화시킨 protocol을 합성하는 형태로 ViewController을 사용한다라고 생각하는데
예시
extension ViewController : AnyProtocol {
}
이게 정답인지는 모르겠지만 현재 나는 이렇게 사용하고 있다.
그리고 이제 요즘 각광받는 특히 Swift에서는 중요한 Abstraction(추상화) 개념을 공부하려고 한다.
Abstraction(추상화)
ex protocol , typlieas , associatedtype 등 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
이름 자체가 추상화라고 적혀있든 이걸 글로 설명하기에 몹시 조금 애매하다 이 부분을 좀 더 공부하다 보면 POP 관련 개념도 나오게 되는데 이 부분을 POP에서 좀 더 자세히 적어야 하는 것인지가 애매하다. 하지만 추상화와 POP는 밀접한 관계임은 틀림이 없다.
내가 생각했을 때 지금 추상화의 핵심은 상속을 통해 이뤄졌던 것 , 특성을 뽑아 추상화시켜 각각의 클래스에서 재정의 하는 방식으로 이뤄지는 것이 요즘 트렌드에 맞는 코딩 방식?이라고 많이들 이야기한다. 쉽게 안다라고 이해할 수 없는 개념이기에 꾸준한 공부와 기본적인 개념에 대해 더 공부가 필요하다
위의 3가지 개념들은 한 가지의 주제로 하루 종일 공부하고 글을 작성한다고 해도 시간이 엄청 모자란 내용이다.
프로그래밍에 있어 공부해야 할 개념들은 공부를 하면 할수록 좀 더 복잡해지고 심오해지는 세계지만 간단하게 생각하면 한 줄 읽고 끝 이 되는 공부이기도 하다
하지만 내가 위의 개념들을 공부하고 정리한 후 누군가 나에게 추상화가 무엇인가요라고 질문한다면 쉽게 대답하지 못할 것 같다. 그만큼 복잡한 개념들이 얽혀있고 함부로 답변이 쉬운 질문이 아닐 것 같다. 사전적인 의미로써의 답변이 아닌 프로그래머로써의 답변을 아직 내기에는 부족한 부분이 많은 것 같다.
아직 캡슐화와 , SOLID에 대한 이야기는 시작도 못했다.
그럼에도 위의 내용들을 공부하고 영상들을 찾아보면서 정리하는데 상당히 많은 시간을 소요하였다.
그런 관계로 SOLID에 대한 내용은 내일마저 공부하고 정리하여 글을 작성할 예정이다.
https://coding-rengar.tistory.com/28
'CS공부' 카테고리의 다른 글
Restful API 에서 Rest는 뭐의 줄임말일까? (0) | 2022.04.22 |
---|---|
프레임워크와 라이브러리 차이점 (0) | 2022.04.17 |
객체지향 프로그래밍 OOP (3) (0) | 2022.03.28 |
객체지향 프로그래밍 OOP (2) (0) | 2022.03.17 |
절차적 프로그래밍 PP (0) | 2022.03.15 |