객체지향프로그래밍과 절차지향프로그래밍의 차이를 알고 그 특징에 대해 이해할수있다.
Java 언어는 완벽한 객체지향 언어라고 할 수 있습니다. 흔히 이야기하는 객체지향 프로그래밍의 주요 특징인 추상화, 상속, 다형성, 캡슐화를 완벽하게 지원하기 때문입니다. 객체지향 프로그래밍의 개념과 특징에 대해 조금 더 자세하게 알아보겠습니다.
흔히 객체지향 프로그래밍의 개념을 설명할 때 절차지향 프로그래밍과 비교하여 설명을 합니다. 하지만 따지고 보면 객체지향 프로그래밍과 절차지향 프로그래밍은 프로그래밍 패러다임의 일부일 뿐 서로 대척점에 놓여있는 개념은 아닙니다.
절차지향 프로그래밍은 작성된 코드를 순차적으로 처리하며 프로그램을 실행합니다. 때문에 서로 다른 프로시저간 강한 결합 관계를 보여줍니다. 특정 부분을 수정하기 위해서는 수정 부분 전후로 실행되는 프로시저의 영향도 파악이 중요하기 때문에 유지보수에서는 유리하다고 볼 수 없습니다.
하지만 프로시저간 긴밀한 상호 작용이 필요한 상황이나 성능이 중요한 경우 절차지향 프로그래밍 방식이 적합한 경우도 있습니다.
객체지향 프로그래밍은 서로 다른 객체간 상호 작용을 통해 프로그램을 실행합니다. 하나의 객체는 필요한 역할만을 수행하기 때문에 서로 다른 객체간의 결합도를 낮출 수 있고 필요한 기능을 하나의 객체에 모아 응집도를 높일 수 있습니다. 또한 수정이 필요한 경우 해당 객체만 수정을 하면 되기 때문에 유지보수에 있어 이점이 있습니다.
이러한 특성들로 규모가 크거나 다수의 개발자가 투입되는 프로젝트의 경우 객체지향 프로그래밍 방식이 적합하다 할 수 있습니다.
객체지향 프로그래밍에 대해 조금 더 자세하게 알아보도록 하겠습니다.
'객체(Object)'란 실세계에 존재하거나 생각할 수 있는 사물 혹은 개념과 같은 것들을 말합니다. 모든 행동들은 이 '객체'간 상호 작용으로 표현될 수 있어야합니다. 예를 들어 의자, 책상과 같은 사물들과 패러다임, 민주주의와 같은 개념 또한 객체라고 말할 수 있겠습니다.
객체는 프로그램에서 사용 될 수 있도록 추상화하여 Class형태로 구현됩니다.
실세계의 사물인 의자를 추상화하여 Chair.class를 작성해봅시다.
//실세계의 사물 '의자'를 추상화한 Chair.class
public class Chair entend Furniture{
//Constructor
public Chair(){}
...
//Field
private int lag;
...
//Method
public void sit(){
...
}
}
Class는 생성자(Constructor), 필드(Field), 메소드(Method)로 이루어져있습니다.
생성자(Constructor)란 정의된 Class를 인스턴스화 하기 위해 호출되는 메소드입니다. 인스턴스는 다음 단락에서 알아보도록 하겠습니다.
필드(Field)란 실세계의 데이터 영역입니다. 의자 클래스를 정의 할 때 의자의 성분, 다리의 수, 가격, 형태 등이 필드 영역에 속하는 항목들입니다.
메소드(Method)는 클래스를 사용하여 실행할 수 있는 행위들입니다. 의자 클래스의 경우 '앉다.', '분해하다.' 와 같은 메소드들이 존재할 수 있겠습니다.
객체지향 프로그래밍의 핵심은 이러한 Class를 정의하고, 인스턴스를 생성하여 이들의 상호 작용을 통해 프로그램을 실행한다는 것입니다.
객체지향 프로그래밍은 여러 객체간의 상호작용을 통하여 하나의 소프트웨어의 동작 원리를 구성합니다. 객체가 프로그램 설계의 중심이 되기 때문에 이와 관련된 특징과 설계 원칙을 알아볼 필요가 있습니다.
객체지향 프로그래밍의 특징은 추상화, 상속, 다형성, 캡슐화가 있습니다.
public class Chair entend Furniture
을 살펴보면 Furniture
를 확장(extend) 하는 것을 알 수 있습니다. 여기서 Furniture는 가구를 추상화하여 정의한 abstract class입니다. Chair는 이 추상 객체를 기반으로 구현된 class라고 할 수 있습니다.//Furniture abstract class
abstract class Furniture {
//실세계의 대상인 '가구'를 추상화한 추상 객체
Furniture () {};
Furniture (String material) {this.material = material}
String material;
...
}
//Chair class
class Chair extends Furniture {
//Furniture 추상 객체를 구체화한 Chair.class
public Chair(){
super();
}
public Chair(String material){
super(material);
}
//추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
public String getMaterial(){
return this.material;
}
...
}
이와 같이 하위(자식) 클래스에서 상위(부모) 클래스의 특징을 물려받는 것을 상속이라고 합니다.
//Furniture abstract class
abstract class Furniture {
//실세계의 대상인 '가구'를 추상화한 추상 객체
Furniture () {};
Furniture (String material) {this.material = material}
String material;
...
}
//Chair class
class Chair extends Furniture {
//Furniture 추상 객체를 구체화한 Chair.class
public Chair(){
super();
}
public Chair(String material){
super(material);
}
//추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
public String getMaterial(){
return this.material;
}
...
}
//Desk class
class Desk extends Furniture {
//Furniture 추상 객체를 구체화한 Desk.class
public Desk(){
super();
}
public Desk(String material){
super(material);
}
//추상 클래스를 구현한 클래스는 부모 클래스에 정의된 필드와 메소드를 사용할 수 있습니다.
public String getMaterial(){
return this.material;
}
}
위와 같이 추상 객체인 Furniture.class를 확장한 Chair와 Desk class 모두 상위 객체의 맴버 속성인 material을 사용할 수 있습니다.
또한 상위 객체에 정의된 속성을 하위 객체가 상속받아 사용할 때에 본인의 쓰임에 맞게 재정의 하여 사용할 수 있는 특성을 다형성이라고합니다.
//목수 인터페이스를 상속받은 chair와 desk 클래스의 특정 기능 override 예시
// 참조 예시
//접근 제한자 종류와 접근 허용범위
// getter / setter 가 적용된 객체 내부 모습과 사용 예시
이상 객체지향 프로그래밍의 특징에 대한 첫번째 포스트를 마칩니다.
이후 두번째 포스트에서는 객체지향 프로그래밍의 설계 원칙인 SOLID 원칙에 대해 알아보도록 하겠습니다.