서로 다른 데이터 타입의 데이터와 메소드를 정의하여 사용자 정의의 타입을 만들 수 있는데, 이것을 '클래스'라고 한다. 즉, 클래스는 사용자 정의의 자료형이다.
캡슐화는 유지보수성 증가(낮은 결합도)를 위해 필드의 직접 접근을 제한하고, public 메소드를 이용하여 간점적으로 접근하여 사용할 수 있도록 클래스를 작성하는 기법이다.
클래스를 작성할 시 특별한 목적이 아닌 이상 캡슐화가 기본적인 원칙으로 사용되고 있다.
필드에 직접 접근 시 발생할 수 있는 문제점
유연성을 확보(여기저기 활용)하기 위해 공통적인 것을 추출하고 공통적이지 않은 것을 제거하는 것을 의미한다.
추상화 과정을 통해 객체(Object)가 도출이 되며, 이러한 객체를 생성하기 위해 클래스를 설계하게 된다.
즉, 추상화는 현실세계의 복잡한 사건을 단순화하여 새로운 객체 지향 세계를 창조해나가는 과정이다.
객체지향에서 중요한 것은 '행위(메소드)'이지만, 데이터를 중심으로 추상화하여 객체 및 클래스를 설계하는 경우도 존재한다. (DTO 같은 클래스)
현실 세계의 모든 사건은 객체와 객체의 상호작용에 의해 일어난다는 세계관을 프로그램을 만들 때 이용하여 새로운 세계를 창조하는 방법론이다.
객체가 서로 상호작용을 하며 사건이 일어난다는 개념은 현실 세계와 닮아있지만, 다른 점은 무생물이나 개념 같은 존재들도 하나의 주체로 보인의 상태를 스스로 제어하고 행동한다는 것이 다른 점이다. (의인화 기법 -> 캡슐화를 의미한다.)
또한, 모든 객체는 너무 많은 수행을 할 수 있는 것이 아닌 '적절한 책임'을 가지고 있어야 한다. 만약 너무 많은 것을 수행해야 하는 책임이 존재한다면 이는 또 다른 객체에게 책임을 나눈다. (단일 책임의 원칙)
단일 책임의 원칙
한 객체가 한 가지 일을 한다는 것이 아니라, 클라이언트를 기준으로 객체 기능의 책임을 나눈다.
객체 지향 프로그램은 어떻게 구현하는가?
1. 객체를 정의하고
2. 각 객체 제공하는 기능들을 구현하고
3. 각 개체가 제공하는 기능들 간의 소통(메세지 전달)을 통하여 객체간의 협력을 구현
객체와 객체는 메세지(메소드 호출)를 통해 서로 상호작용을 한다. 보내는 쪽을 송신자, 받는 쪽을 수신자라고 하며, 수신자는 메세지를 전달 받아 그 메세지에 해당하는 내용을 처리하는 방법을 스스로 결정한다. 스스로 결정한 방식대로 명령어를 순차적으로 기술한 것을 메소드(method)라고 한다.
상호작용에 중요한 것은 메세지를 수신하여 응답하는 상호작용을 설계하는 것을 의미한다.
객체 지향 프로그래밍에서 중요한 것은 이러한 상호작용을 설계하는 것이다. (즉, 필드보다는 메소드를 중점으로 추상황 기법을 적용하여 객체를 설계하는 것이 중요하다.)
인스턴스를 생성할 때 초기 수행할 명령이 있는 경우 미리 작성해두고, 인스턴스를 생성할 때 단 한 번 호출되는 함수이다.
생성자 함수에 매개변수가 없는 생성자를 '기본 생성자(default constructor)'라고 하며, 기본 생성자는 compiler에 의해 자동으로 추가되기 때문에 명시적으로 작성하지 않고도 사용할 수 있다.
동일한 클래스 내에는 동일한 이름의 생성자 혹은 메소드를 작성하지 못한다. 하지만, 매개변수의 타입, 갯수, 순서를 다르게 작성하면 서로 다른 생성자나 메소드로 인식하기 때문에 동일한 이름의 생성자나 메소드를 여러 개 작성할 수 있게 해준다. 이것을 "Overloading" 오버로딩이라고 한다.
public void method(String a) {}
public void method(String a, int a) {}
이런 식으로 여러 개를 작성할 수 있으며, 이것들을 서로 다른 메소드로 인식한다.
클래스에서 쓰이는 변수는 크게 클래스 변수, 인스턴스 변수, 지역 변수이다.
클래스 변수 : static 키워드를 가지고 필드에 선언하는 변수로 메모리의 static 영역을 사용한다. 프로그램 시작 시 생성되어, 프로그램 종료 시 소멸된다.
인스턴스 변수 : static 키워드 없이 클래스의 필드에 선언하는 변수로 메모리의 heap 영역을 사용한다. 인스턴스 생성 시에 생성되었다가, 참조하지 않을 시에 GC(가비지 컬랙터)에 의해 소멸된다.
지역 변수 : 메소드, 생성자, 초기화 블록 내부에 선언하는 변수로 다른 변수들보다 우선권을 가진다. 메소드 호출 시에 생성되었다가 메소드 종료 시 소멸된다.