-
객체지향 프로그래밍(OOP)란 무엇인가
- 오퍼레이션(operation)으로 정의할 수 있음 (객체의 기능)
- 식별 이름
- 파라미터 및 파라미터 타입
- 리턴 값 및 리턴 타입
- 인터페이스
- 모든 오퍼레이션 집합
- 객체를 사용하기 위한 명세를 의미
- 메시지
- 오퍼레이션의 실행을 요청하는 것을 메시지를 보낸다고 표현
- 메소드 호출 ~> 메시지를 보내는 과정
- 객체들이 메시지를 통해서 통신 ~> 원하는 결과를 얻는다 (객체 간 메시지를 주고받음)
- 4가지 특징
- 추상화
- 객체의 공통 프로퍼티(요소)와 메소드를 뽑아내는 작업
- 코드를 어떻게 짜야할지 미리 추상적으로 설계하는 작업
- 캡슐화
- 객체 수행 목적에 따라서 데이터 구조 및 메소드를 결합해서 묶는 것.
- 외부에서 무분별한 객체의 변경을 막기 위해, 구현 내용을 감추고 이용 방법만 제시
- 클래스 내의 멤버변수를 외부로부터 숨기는 것을 포함(은닉화)
- javascript 에서는 현재 class 내부에 변수 앞에 #을 붙여, private하게 이용하고 있음 (메소드는 불가)
- 자바에서는 접근 제한자를 사용(private, public, protected, default)
- public
- protected
- 같은 패키지에 있는 객체와 상속관계의 객체만 허용
- default
- private
- 상속
- 상위 개념의 특징을 하위 개념이 물려받아서 사용
- 부모 클래스의 코드를 상속 ~> 코드 반복을 줄여줌
- 유지보수에 좋음
- 객체의 다형성을 구현하기 수월함
- 단점
- 상위 클래스 변경이 어려움(상위 클래스에 의존성이 높음)
- 클래스의 불필요한 증가
- 상속의 오용
- ~> 객체 조립으로 해결, 재사용의 관점이 아니라 기능 확장의 관점에서 상속
- 다형성
- 하나의 메소드나 클래스가 다양한 방법으로 동작, 코드의 재사용 목적
- Overriding
- 자식클래스에서 부모클래스의 메소드의 내부 로직 재작성
- Overloading
- 하나의 클래스에서 같은 이름을 가진 오퍼레이션을 여러개 정의
- 매개변수가 달라야함(반환타입은 달라도 되지만, 매개변수가 같으면 성립 X)
- 객체 지향적 설계 원칙( == SOLID 원칙)
- 단일 책임 원칙
- 모든 클래스는 하나의 책임만 가져야하고, 이 책임을 완전히 캡슐화 해야함
- 클래스를 변경하는 이유는 단 하나의 이유여야함
- 개방-폐쇄 원칙
- 확장은 열려있고 수정은 닫혀있는 것.
- 기존의 코드 변경 X(closed), 기능은 추가 가능(Open) 설계 원칙
- 리스코프 치환 원칙
- 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙
- 자식 클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고, 확장만 수행
- 인터페이스 분리 원칙
- 사용하지 않는 인터페이스는 구현 X
- 하나의 일반적인 인터페이스 < 여러 개의 구체적인 인터페이스
- 의존 역전 원칙
- 의존 관계를 맺을 때는 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺을 것 (변화가 없는 것에 의존)