객체는 중괄호 {}를 이용해 만들 수 있습니다. 중괄호 안에는 키(key) : 값(value) 쌍으로 구성된 프로퍼티를 여러개 넣을 수 있는데, 키엔 문자형, 값엔 모든 자료형이 허용됩니다. 중괄호 {}를 이용해 객체를 선언하는 것을 객체 리터럴이라고 부릅니다.
객체는 실생활에서 우리가 인식할 수 있는 사물이고, 그 안에는 속성과 메소드가 존재합니다.
프로그램 구현에 있어서 필요한 객체를 파악하고, 각 객체들의 역할들이 무엇인지 정의하고 각 객체들간에 상호작용하도록 프로그래밍하는 것을 의미합니다.
객체의 공통적인 속성과 기능을 추출하여 정의하는것.
세부적인 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것!
ex) 이동수단 (바퀴가 있다는 공통점) / 자동차(바퀴4개), 오토바이(바퀴2개)
여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정 (일반화라고도 함)
클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 합니다.
상속을 활용하면 상위 클래스의 구현을 활용함으로써, 코드 재사용이 용이해집니다.
그러나, 상속을 통한 재사용을 할 때 나타나는 단점이 명백하기에 객체지향 프로그래밍에서 '코드 재사용'을 목적으로 하는 상속 행위는 엄격히 금합니다.
이유1. 부모 클래스의 변경이 불편해짐
→ 부모 클래스에 의존하는 자식 클래스가 많을 때 부모 클래스의 변경이 필요하다면, 이를 의존하는 자식 클래스들이 영향을 받게 됨
이유2. 불필요한 클래스의 증가
→ 유사 기능 확장시, 필요 이상의 불필요한 클래스를 만들어야할 수 있다.
이유3. 잘못된 상속 사용
→ 같은 종류가 아닌 클래스의 구현을 재사용하기 위해 상속을 받게 되면, 문제가 발생할 수 있음. 상속받는 클래스가 부모 클래스와 IS-A 관계가 아닐 때 발생
그렇다면 이러한 문제는 어떻게 해결할까?
→ 구성 (Composition) 을 통해 해결
객체 구성은 객체 내부 필드에서 다른 객체를 참조하는 방식으로 구현합니다.
상속에 비해 런타임 구조가 복잡하고 구현이 어렵지만, 변경시 유연함을 확보할 수 있다는 장점이 큽니다.
→ 같은 종류가 아닌 클래스를 상속하고 싶을 땐, 객체 컴포지션을 먼저 적용해볼 것
정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것.
서로 간에 의존성을 낮추어야 요구사항 변경에 대처하는 좋은 설계가 됩니다.
높은 응집도와 낮은 결합도는, '은닉화'를 통해 이루어낼 수 있습니다. 외부에서 접근할 필요 없는 것들은 접근 지정자를 private 으로 두어 접근에 제한을 두는 것이다.
객체지향 패러다임의 핵심으로 상속과의 시너지가 엄청납니다. 다형성 구현을 통해 코드를 간결하게 해주고, 유연함을 갖추게 해줍니다.