객체지향 프로그래밍(OOP)의 4가지 특징

Kim Dong Kyun·2022년 11월 20일
1

Weekly I Learned

목록 보기
3/8

왜 객체지향인가?

소프트웨어 가치 = 변화

  • 낮은 비용으로 변화 가능해야함.
    • 비용 → 분석, 수정, 테스트, 기능 추가에 대한 시간
  • 소프트웨어가 변화하지 않는다면, 망한 소프트웨어
  • 기능을 수정하는데, 비용이 계속 증가하면, 해당 소프트웨어는 뒤쳐지고 결국 망한다.
  • 앞으로의 변화에 대응할 수 있는가가 중요

객체 지향 프로그래밍은 변화에 대한 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를 수행할 수 있다.

위와같이 할 수 있다.

  • 장점

    • 즉, 같은 속성을 공유하는 것들을 중복되게 관리/수정 할 필요 없이, Class의 상속을 통해서 관리할 수 있다. 따라서 비용이 절감 가능하다.
  • 더불어, 인터페이스와 추상 클래스(매서드)등을 활용하는 부분 알아두자. 현업에서는 거의 대부분 인터페이스를 활용한다고 한다.

즉 '상속'은 분할 및 정복(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단계를 그냥 다 풀까? 너무 쉬워서 패스한 게 많은데...점수에 욕심이 좀 나네 ㅋㅋ

0개의 댓글