왜 객체지향인가?
소프트웨어 가치 = 변화
- 낮은 비용으로 변화 가능해야함.
- 비용 → 분석, 수정, 테스트, 기능 추가에 대한 시간
- 소프트웨어가 변화하지 않는다면, 망한 소프트웨어
- 기능을 수정하는데, 비용이 계속 증가하면, 해당 소프트웨어는 뒤쳐지고 결국 망한다.
- 앞으로의 변화에 대응할 수 있는가가 중요
객체 지향 프로그래밍은 변화에 대한 cost가 적다. 대부분의 비용은 "시간"이다.
1. Encapsulation
데이터, 그 데이터를 활용하는 함수를 캡슐,컨테이너(class) 안에 두는 것. 즉, 실제 구현 부분을 외부와 차단하는 것.
- 정보를 은닉하는 것.
- private / final 등의 키워드를 통해 메인 클래스의 정보는 은닉하고, 이슈가 있을 때에 메인 클래스 외적인 부분에서 수정한다.
- 정보 제어자가 주로 사용된다(public, protected, private 등)
- 장점
- 코드가 좀 더 구조화된다.(Organized)
- 함수나 메써드가 인수(Argument)를 취할 필요가 없다(elon.name = 0 과같이 할 필요가 없다). (this 키워드를 통해 데이터에 직접 접근이 가능하기 때문)
- 표시할 속성과 숨길 속성을 나눌 수 있다. 위 사진에 보이는 필드는 모두 private 처리되어 있기 때문에 외부 접근이 불가하다. 따라서 elon.shares = 0; 과 같은 코드는 할당, 작동이 불가능하다.
- 기업가의 이름을 공개하고자 하는 경우 이를 위한 위와같은 매소드를 만들 수 있다.
즉, 데이터 그리고 class 안에 있는 해당 데이터를 이용하는 함수를 잘 정리하는 방법론.
2. Inheritance
상속을 통해서 코드를 더 작은 단위로, class로 쪼개고 더 작은 단위로 나누고, 재사용 할 수 있다.
위와같이 Actor와 Entrepreneur가 공유하는 firstName, lastName등의 속성을 'Person'이라는 다른 클래스로 이동시킬 수 있다.
- 확장(extends) 을 통해 '자식' 클래스는 '부모' 클래스의 모든 속성과 메소드를 '상속(Inherit)'혹은 수신하게 된다.
- 따라서 부모 클래스에서 정의한 Method를 자식 클래스에 해당하는 Entropreneur , Actor 클래스에 속하는 새로운 객체(Object)들이 같은 Method를 수행할 수 있다.
위와같이 할 수 있다.
즉 '상속'은 분할 및 정복(Devide and conquer)를 가능하게 한다. 클래스들을 일단 작게 쪼개고, 분할한 뒤에 클래스를 다시 구성할 수 있다. 마치 레고처럼.
3. Abstraction
'구현 세부 정보를 숨기는 일반 인터페이스를 지정하는 행위' -
'act of specifying a general interface hiding implementation details'
- 실제로 프로그램을 사용하는 사용자에게서 개체의 작동 원리를 숨기는 것.
- 예를 들어, 자동차를 운전하는 사람은 그에게 주어진 기능들( 핸들, 기어, 브레이크 등등....)외에 나머지 부분은 굳이 노출하지 않는 것.
- 그 대신 더 편하게 조종할 수 있는 노출된 기능들을 만든다. 아래처럼.
- array를 직접 노출하기보단 Get add remove modify 등의 기능을 제공하여 array에 대한 직접적인 modify가 아닌 제공된 인터페이스로 위 기능들을 수행한다.
위처럼 betterArray의 일반 인터페이스를 정의 가능하다. 세부 실현 디테일은 모두 숨긴 채.
- 장점
- 이 기능을 제공받는 사람들은 Class BetterArray에 대한 직접적인 이해를 할 필요가 없다.(공부할 필요가 없다.)
- 세부 실현 디테일을 숨길 수 있다.
- 내부 수정이 필요할 때에, Class안 method를 사용하는 그 누구도 뭔가를 바꿀 필요가 없다.(구현 세부 내용이 바뀌어도 인터페이스는 그대로 유지되기 때문이다)
- 더불어 특강에서 배운 내용과 같이, 만약 SMS 전송만 구현되어 있는 프로그램에 카카오톡 전송 기능을 추가한다면? 이메일도 전송한다면?...추상화는 위와 같은 상황에서도 매우 유용하게 사용된다.
4. Polymorphism
-
'다형성' . poly(다양한) morphism(형태).
-
폴리몰피즘을 이해하려면 부모 클래스의 속성이 자식 클래스에 상속되는 걸 기억해야 한다.
-
예를 들어, 두 개의 class A, B가 같은 부모 class를 상속 받는다면, 이 A, B 클래스는 부모클래스의 Method 또한 적용 받는다.
-
그러나 A와 B의 method 구현 방식을 다르게 하기 원한다면...?
- 이를 위해 method overriding(오버라이딩) 한 모습.
- 같은 method를 쓰지만, 다른 구현 방식이다.
- ovveriding 은 같은 타입을 리턴해야 한다. 즉 method sayHi()가 String(문자열) 이었으므로, 한국인 class의 sayHi()도 "안녕!"과 같은 문자열을 리턴해야 한다. 이 말인 즉슨
- 클래스의 핵심은 그대로 있고, 구현방식의 모양과 모습은 달라지게 된다.
참고한 부분
- 노마드코더 객체지향 강의(링크)
- 스파르타 코딩 컴퍼니 객체지향 강의
마지막으로 한 주의 정리와 자체평가.
-
본격적으로 Java를 배우고, 객체지향을 이해하기 시작했다.
-
한 주간 Python으로 알고리즘을 열심히 풀면서, 1단계를 정복해나가고 드디어 프로그래머스 1100점을 달성했지만...ㅋㅋㅋ 자바로 다시 돌아올줄이야. 몇 주 전 배웠던 자바를 다 까먹은 듯 하다. ( 파이썬을 활용한 알고리즘에 너무 심취했었나?)
-
근데 그럴 만 하다. 40개가 넘는 문제를 푸는 동안 다른 사람의 풀이도 일일이 봐가면서 왜 이렇게 쓸 수 있었는지, '파이썬'스러운 문법은 무엇일지...짧은 코드가 정말 좋은 코드일까? 재귀 함수를 사용하는 게 과연 좋은것일까? 와 같은 고민들을 해가면서 하나하나씩 풀다보니 자연스럽게 파이썬에 너무 적응 해 버렸다.
-
오늘 객체 지향에 대한 개념을 다시 한 번 잡아두고 다음주에 임하면 더 도움이 될 것이라고 믿는다. 프로젝트 또한 아주 예쁘게, 객체지향적으로 수행해 봐야지. 설레면서도 두렵다.
-
두려우면서도 설레는 걸 보니 한 주를 나쁘지 않게 잘 지냈나보다. 프로그래머스 점수를 올리며 마친다.
- 추신. 0단계를 그냥 다 풀까? 너무 쉬워서 패스한 게 많은데...점수에 욕심이 좀 나네 ㅋㅋ