객체지향의 4대 특성은 클래스를 통해 구현된다. 또는 객체라고 할 수도 있다.
클래스와 객체를 구분하는 간단한 방법은 나이를 물어 보는 것이다.
클래스는 분류에 대한 개념이지 실체가 아니다. 객체는 실체다.
추상 : 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.
추상화 : 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합 하는 것.
객체 : 세상에 존재하는 유일무이한 사물.
클래스 : 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념.
클래스:객체 = 펭귄:뽀로로 = 사람:김연아 = 쥐:미키마우스
새로운 사람이 태어났다. 이름은 홍길동이다. 이걸 객체 지향 언어인 자바로 표현하면
사람 홍길동 = new 사람();
이번엔 줄리엣이 태어났다
사람 줄리엣 = new 사람();
사람이라는 클래스(분류)를 이용해 유일무이하고 새로운 하나의 사람(객체)을 만들어 홍길동(객체 참조 변수)이라는 이름을 지어준 것이다.
클래스를 이용해 객체(object)를 만들었다는 것을 강조할 때는 object라는 표현보다는 클래스의 인스턴스(instance)라는 표현을 쓴다.
객체(object) = 클래스의 인스턴스
사람이라는 클래스를 설계한다고 생각해보면 사람, 즉 객체들을 관찰해서 사람 객체들이 가진 공통된 특성을 찾게 된다.
시력, 몸무게, 혈액형, 키 등 명사로 표현되는 특성을 속성이라고 한다. 속성은 값을 가질 수 있다. 먹다, 자다, 일하다, 운전하다 등 동사로 표현되는 특성을 기능/행위라고 한다. 이러한 기능/행위는 수행 절차 또는 로직이라고 하는 것을 갖게 된다. 기능/행위를 객체 지향에서는 메서드라고 한다.
위 UML 다이어그램 처럼 속성과 기능은 너무 많아서 한번에 나열하기 힘들다. 그리고 한번에 나열할 필요도 없다. 여기서 애플리케이션 경계에 대해 생각해 볼 필요가 있다.
애플리케이션 경계 = 컨텍스트(Context) 라고도 하는데 애플리케이션 경계를 프로그래밍적인 질문으로 바꾼다면 이렇게 바꿀 수 있다. "내가 만들고자 하는 애플리케이션은 어디에서 사용될 것인가?"
사용될 곳이 병원인지 은행인지에 따라서 클래스의 설계, 필요한 속성, 메소드가 달라질 것이다.
여기서 객체지향의 특성인 추상화를 다시 생각해 보면
추상화 : 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합하는 것.
위의 정의를 IT 용어를 이용해 바꿔 보면
추상화 : 구체적인 것을 분해해서 관심 영역(애플리케이션 경계)에 있는 특성만 가지고 재조합하는 것 = 모델링
추상화의 개념을 넓게 본다면 아래 내용도 포함된다.
자바는 객체 지향의 추상화를 클래스를 통해 지원하고 있다.