객체 지향 프로그래밍에서 빼놓을 수 없는 특징 3가지 있는데, 사람들은 이것을 객체 지향 프로그래밍의 3요소라고 합니다.

이번에는 이 객체 지향 프로그래밍의 3요소에 대해서 얘기하고자 합니다.

 

객체 지향 프로그래밍의 3요소

  • 캡슐화 (Encapsulation)
  • 상속 (Inheritance)
  • 다형성 (Polymorphism)

 

 

먼저 캡슐화 (Encapsulation) 입니다.

캡슐화란 객체의 속성(data)과 행위(메서드)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉하는걸 뜻합니다.

캡슐화는 중요한 데이터(예를 들면 비밀번호)를 보호하거나, 외부에는 불필요한 즉 내부적으로만 사용되는 부분을 감춰서 복잡성을 줄이기위해 사용됩니다.

자바에서는 다음과 같은 접근 제어자를 이용하여 캡슐화를 구현할 수 있습니다.

 

private:  같은 클래스 내에서만 접근이 가능

default:  같은 패키지 내에서만 접근이 가능

protected:  같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능

public:  접근 제한이 전혀 없음

 

주의할 점은 대상에 따라 사용할 수 있는 접근 제어자가 다르다는 것이다.

클래스: public, default 접근 제어자만 사용 가능

메서드, 멤버변수: public, protected, default, private 모두 사용가능

지역변수: 사용 할 수 있는 접근 제어자 없음

 

 

 

 

다음으로 상속 (Inheritance) 입니다.

상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다.

상속을 이용하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가, 변경이 용이합니다.

상속의 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 도움이 됩니다.

자바에서 상속을 구현하는 방법은 클래스 또는 인터페이스의 이름을 키워드 'extends', 'implements'와 함께 써 주기만 하면 됩니다.

 

// Parent클래스를 상속받는 Child클래스

class Child extends Parent {

         //...

}

 

class 클래스이름 implements 인터페이스이름{

        // 인터페이스에 정의된 추상메서드를 구현

}

 

주의할 점은 extends와 implements를 사용할때는 다음과 같은 규칙들이 있다는 것입니다.

  1. 클래스가 클래스를 상속받을땐 extends 사용
  2. 클래스가 인터페이스를 상속받을땐 implements 사용
  3. 인터페이스가 인터페이스를 상속받을땐 extends 사용
  4. 인터페이스를 다중 상속받는것은 가능하지만, 클래스를 다중 상속받는것은 불가능

 

 

 

마지막으로 다형성 (polymorphism) 입니다.

다형성은 객체 지향 프로그래밍의 3요소중 가장 중요하다고 여겨지는 것입니다.

다형성이란 여러 가지 형태를 가질 수 있는 능력을 의미합니다.

예를들어, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하거나,

똑같은 이름으로 서로 다르게 동작하는 메서드를 정의하고 호출할 수 있도록 하면서 다형성을 실현할 수 있게 합니다.

다형성을 취하므로 얻을 수 있는 이익으로는 메서드나 객체 설계시 역할(메서드 이름, 인터페이스)을 먼저 부여하고,

그  후에 해당 역할을 수향하는 구현체를 만듦으로써

사용자는 구현체의 내부 구조를 몰라도 사용가능하고, 구현체의 내부 구조가 변경되어도 영향을 받지 않으며, 구현대상을 변경해도 영향을 받지 않게 된다는 점이 있습니다.

 

구체적인 예로는 업캐스팅, 오버로딩, 오버라이딩 정도가 있습니다.

위 3가지는 하나하나가 포스팅 주제로 다뤄질 만큼 중요하고 설명할 양이 적지않아 여기서는 정의와 이것들이 어떤 방식으로 다형성을 이루는지 정도만 설명하겠습니다.

 

업캐스팅: 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것으로,

한가지 타입의 참조 변수가 여러 타입의 인스턴스를 참조 할 수 있다는 점에서 다형성을 실현하였다 할 수 있습니다.

 

오버로딩: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것으로,

똑같은 이름으로 여러가지 메서드들을 나타낼 수 있다는 점에서 다형성을 실현하였다 말할 수 있습니다.

 

오버라이딩: 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것으로,

이 역시 같은 이름으로 다르게 구현하는 메서드를 호출하므로 다형성을 실현하였다 할 수 있습니다.

 

 

 

참조: Java의 정석 3rd Edition(남궁 성 지음)

 

+ Recent posts