캡슐화
- 속성과 행위를 외부와 분리, 캡슐처럼 묶어서 분리하는 개념을 캡슐화 (Encapsulation)라고 한다.
- 속성을 변수에, 행위를 메소드에, 캡슐을 클래스에 비유할 수 있다. 이런 구조로 외부 코드가 데이터에 직접 접근하지 못하도록 방어막 역할을 하며 내부 상태는 private로, 외부에는 public 메소드를 노출하여 정보를 은닉(Information Hiding)할 수 있다. 이렇게 되면 느슨한 결합(Loose Coupling)이 가능한데, 예를 들어 내부에서 변수명을 변경하는 등의 변화가 있어도 외부 메소드는 변함이 없기 때문에 의존성이 낮으며 모듈 수정이 비교적 자유롭다. 또한 재사용이 가능하며 테스트도 쉽다.
아래는 Setter/Getter 메소드를 이용한 캡슐화의 예다.
public class Encapsulation {
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
이처럼 name 변수에 직접 접근하지 않고 반드시 setName()메소드로 변경을, getName() 메소드로는 조회를 진행하는 방식이 캡슐화의 대표적인 예라고 할 수 있다. 또한 캡슐화를 구현하기 위해서는 여러 방식으로 접근을 제어할 수 있어야 하는데, 자바는 접근 제어자(Access Modifier)를 제공한다.
추상화
- 복잡한 시스템에서 핵심적인 개념 또는 기능을 간추려내는 것을 추상화(Abstraction)라고한다. 즉 수행하는 방법이 아니라 수행하는 일 자체에 집중해 복잡도를 낮추는 것이다.
- 예를 들어 자동차는 매우 복잡한 기계다. 그러나 운전자는 자동차라는 기계에 대해 자세히 몰라도 운전하는 데 어려움을 느끼지 않는다. 핸들은 방향 전환에 대한 추상화. 엑셀은 가속에 대한 추상화. 브레이크는 감속에 대한 추상화가 정의되어 있기 때문이다. 어떤 종류의 자동차여도 핸들과 엑셀, 브레이크는 모두 동일한 역할이므로 각각의 역할만 이해하면 된다. 내부적으로는 서로 다르게 구현되어 있지만 이 모든 복잡한 부분을 숨기고 운전자에게는 항상 동일한 이턴페이스를 제공한다.
- 복잡한 실무에서 이 같은 추상화는 매우 중요한 개념이다. 그러나 추상화가 지나치면 오히려 코드를 이해하기 어렵고, 활용하기는 훨씬 더 어렵다.
상속
- 한 객체를 또 다른 객체가 이어받는 것을 상속(Inheritance)이라고 하며, 부모의 재산을 자식이 상속받는 것과 같은 의미이다. 유사하게 부모 코드를 자식 코드가 재사용할 수 있다.
- 예를 들어 어떤 회사의 A 자동차가 좋은 엔진과 브레이크를 가지고있다고하면 B 자동차를 만들 때 A자동차를 상속받으면 A 자동차의 좋은 엔진과 브레이크를 그대로 사용할 수 있다. 자동차의 디자인 또는 변경할 부분만 추가로 구현하면 기존의 좋은 기능을 새로 개발하지 않고 그대로 사용할 수 있다.
- 실무에서는 이와같은 상속이 매우 번번하게 쓰인다.
다형성
- 다형성(Polymorphism)은 경우에 따라 객체가 다르게 동작하거나 또는 어떤 동작으 ㄹ다른 방법으로 동작하게 하는 개념이다. 구체적으로는 메소드 오버로딩(Overloading)과 오버라이딩(oberriding)이 이에 해당한다. 오버로딩은 이름은 길지만 파라미터가 다른 메소드를 말하며, 오버라이딩은 상속을 받아서 메소드를 재정의하는 것을 말한다.
- 이처럼 유연하게 변하는 객체의 다형성은 OOP에서 매우 중요한 개념이며, 코드 중복을 줄이고 변경 확장에 유연한 객체지향적인 코드를 작성할 수 있게 한다.