- Program = Data + Functions(procedures)
함수형 프로그래밍은 프로그램을 데이터와 함수(프로시저)의 결합으로 정의한다.
- Function(input, output, side-effect)
함수는 하나 이상의 입력을 받아들이고, 입력에 대한 결과를 반환하며, 외부 상태를 변경하지 않고 동일한 입력에 대해 항상 동일한 결과를 반환한다.
- Program = object which interact with each other
객체지향 프로그래밍은 프로그램에 상호작용 하는 객체들로 정의한다.
- Object(객체) = Data(state) + Functions(behavior)
- Data(State)
객체는 상태를 나타내는 데이터를 포함하는데, 이는 객체의 속성이며, 상태를 결정한다.
- Function(Behavior)
객체는 특정 동작을 정의하는 함수를 포함한다. 이러한 함수는 객체의 행동을 결정하고, 객체 간의 상호작용을 관리한다.
- 각 객체는 각자의 상태(state)를 가진다.
- 각 객체는 각자의 동작(behavior)을 가진다.
- 데이터는 객체 내부에서 캡슐화 된다.
-> 객체는 데이터와 관련된 함수를 하나로 묶어 캡슐화 하는데, 이를 통해 데이터와 함수가 논리적으로 그룹화 되어 외부에서의 접근을 제어할 수 있다.- 함수를 객체의 동작(behavior)을 정의한다.
- State(상태, 객체가 가지고 있는 데이터나 속성)
- attributes(속성, 멤버 변수들)
- ex) center, radius
- Behavior(동작, 객체가 수행할 수 있는 작업이나 행동)
- operations (작업, 멤버 함수들)
- ex) draw(), move(), resize()
- Identity(식별성, 객체를 식별할 수 있는 고유한 특성으로, 각 객체는 자신만의 식별자를 가진다)
- 메모리 주소 혹은 식별자 값으로 식별
- 다수의 객체들이 같은 상태를 가지고 있더라도, 그들은 독립적으로 구분된다.
- ex) 스마트폰1, 스마트폰2는 같지 않음.
서로 다른 객체들은 클래스 내에 분류된다.
객체는 클래스의 인스턴스이다. (클래스는 객체를 생성하기 위한 붕어빵 틀 같은 역할이다.)
클래스가 정의하는 것들
- name(이름)
- 클래스에는 고유한 이름이 있으며, 이를 통해 프로그램에서 클래스를 식별함.
- attrivutes(속성)
- 클래스는 속성을 정의할 수 있으며, 클래스에 속하는 각 객체가 가지는 상태나 데이터를 나타냄.
- operations(작업)
- 클래스는 객체가 수행할 수 있는 작업이나 동작을 정의하며, 이는 클래스의 메서드로 구현됨.
- 캡슐화(정보 은닉)
- 연관된 데이터와 동작들을 하나로 결합하고, 클라이언트 측에게 상세한 데이터와 구현체는 숨기는 것을 의미한다.
- 객체의 캡슐화
- 데이터와 동작의 구현체(Data and implementation of operations)
- 객체는 관련된 데이터와 작업을 하나로 묶어 캡슐화 하는데, 이는 객체가 자신의 데이터를 처리하는 메서드를 포함하여 데이터와 작업을 함께 묶는 것을 의미한다.
- Private한 Data
- 객체는 내부 상태(state)를 외부에서 직접적으로 접근할 수 없게 Private로 설정하는데, 이를 통해 객체는 자신의 데이터에 대한 외부의 접근을 제어하고, 외부에서의 무결성을 유지할 수 있음.
- 유지보수성 향상
- 캡슐화는 코드의 유지보수성을 향상 시킬 수 있는데, 외부에서의 직접적인 접근을 제한함으로써, 객체 내부의 구현 내용이 변경되더라도 외부 인터페이스를 변경할 필요가 없어지며, 이는 코드 변경에 대한 영향을 최소화 하고, 소프트웨어의 유지보수를 용이하게 만든다.
- 객체는 Public한 Interface를 제공함
- 외부 Client의 객체는 외부에서 인터페이스의 속성 혹은 메서드를 메세지를 보냄으로써 사용할 수 있다.
- Message(객체 간의 통신 수단)
- 한 객체는 다른 객체에게 메세지를 보냄으로써 해당 객체의 메서드를 호출하거나 속성에 접근할 수 있음.
- Data(Attribute) 는 외부에서의 무분별한 접근과 상태(state)의 변경을 막기 위해 필요한 상황이 아닌 경우 private로 선언하는 것이 일반적이다.
- Operation(method)를 public으로 두는 것은 유지보수성을 좋게 하기 위함으로, Operation을 가져가서 부가적인 기능을 추가함으로써 또 다른 기능으로 사용 할 수 있기 때문이다.