5. 객체지향


javalogo

객체지향의 개념

객체지향 설계(object-oriented design) 방법은 객체지향 개념(object-oriented concepts)에 입각하여 시스템 명세를 분석하고 잘 정의된 객체들을 먼저 식별한 뒤에 이들이 상호작용할 수 있도록 구성함으로써 원하는 결과를 생성하게 하는 것이다.

이것은 먼저 시스템을 처리 기능 중심의 모듈로 분해한 뒤, 서브 프로그램 방식으로 구현하는 정통적인 하향식 설계(topdown design)방법과는 그 철학이 다르다.

전통적인 방법에서는 소프트웨어를 기능적 모듈로 분해한 뒤에 각 모듈의 구현에 필요한 자료 구조를 고려한다.

반면에 객체지향 방법에서는 먼저 기초적이고 핵심적인 객체를 식별하고 설계한 뒤에 시스템의 기능적 분해를 고려하는 것이다.

따라서 객체지향 설계 방법은 오히려 재사용에 중점을 둔 상향식 설계(bottomup design) 방법과 유사하다.


객체지향 개념의 본질

기본적으로 객체지향 세계에서 처리 대상으로 삼고 있는 것은 객체이다.

객체(object)는 각각 데이터값과 이 값들을 조작할 수 있는 연산자들로 구성되어 있다.

이러한 객체는 어떤 클래스의 한 인스턴스(instance)로 생성되는데, 클래스(class)는 데이터 값을 저장하는 필드(field)들과 이 필드에 연산을 수행하는 메소드(method)들을 정의하고 있다.

다라서 클래스는 똑같은 종류의 클래스 객체를 생성하는 틀인 템플릿(template) 기능을 한다.

클래스의 인스턴스로 한 객체가 생성되면 그 객체는 그 클래스에서 정의된 필드들을 가지게 되고 이 필드들은 그 클래스의 메소드를 통해서만 접근되고 조작될 수 있다.

다른 클래스의 객체들에 접근하기 위한 메소드들은 원하는 객체와 함께 매개변수를 통해 함수 호출 형태로 기동된다.


캡슐화

위와 같은 클래스의 특성은 클래스 내부의 필드의 존재나 메소드의 구현을 외부에 노출시키지 않는다는 것인데, 이것을 캡슐화(encapsulation)라 한다.

캡슐화의 핵심은 외부와의 인터페이스를 위한 부분만 공개하고 나머지 부분은 은닉시키는 것이다.

이것을 정보 은닉(information hiding)이라고도 한다.

이 캡슐화는 복잡한 내부 구조를 외부에 숨김으로써 객체를 간단하게 표현하게 할 수 있고 메소드 사용을 쉽게 한다.

또한 이 클래스 사용자에 영향을 주지 않고 필요에 따라 필드의 내부 표현이나 메소드의 구현을 자유롭게 변경시킬 수 있는 장점을 가지고 있다.


상속

객체지향 방법을 사용하는 주요 목적 중의 하나는 기존 소프트웨어 코딩의 재사용(reuse)에 있다.

검증된 기존 소프트웨어의 재사용은 백지에서 출발하는 것보다 개발 기간을 절약하고 시스템 오류를 감소시켜, 보다 신뢰성 있는 소프트웨어를 생산할 수 있게 한다.

객체지향 방법에서는 새로운 클래스를 만들 때 기존의 클래스를 이용하여 만들 수 있도록 함으로써 재사용 개념을 철저하게 실현하고 있다.

객체지향 방법에서 기존의 클래스에 추가로 필요로 하는 필드와 메소드를 더하여 새로운 클래스로 확장시킬 수 있다.

이 때 새로 확장된 클래스는 원래의 클래스 필드와 메소드들을 모두 그대로 상속받아 자기가 만든 것과 같이 사용할 수 있는데, 이것을 상속(inheritance)이라 한다.

이때 재사용된 기존의 클래스를 슈퍼클래스(super class)라 하고 새로 확장된 클래스를 서브 클래스(sub class)라 한다.

이 슈퍼 클래스와 서브 클래스는 서로 이행적(transitive) 성질을 가지고 있다.

이행적 성질 : 클래스 A B C가 있을때, B가 A를 상속받는 서브 클래스이며 다시 C가 B를 상속받는 서브 클래스라면 C는 A를 상속받는 서브클래스가 되는 성질

이 때 서브클래스가 슈퍼클래스로부터 상속받은 메소드가 그대로 사용하기에 적절치 않다고 판단하면 그 구현을 무시하고 재정의하여 사용할 수 있다.

이렇게 되면 메소드의 이름과 매개 변수의 수와 타입, 즉 시그니처(signature)가 같으면서도 슈퍼 클래스의 것과는 연산 내용이 전혀 다른 메소드가 된다.

이와 같이 서브 클래스가 슈퍼클래스로부터 상속된 메소드를 재정의 하여 사용하는 것을 메소드 오버라이딩(method overriding)이라 한다.


다형성

다형성(polymorphism)이란 여러(poly) 형태(morph)라는 뜻으로, 객체지향 프로그래밍 관점에서 하나의 메소드 이름이 상이한 클래스에 여러 메소드로 중복되어 나타나 있다는 의미이다.

이렇게 되면 실행시켜야 할 메소드는 실행시간에 가서야 정확히 결정할 수 있는데 이것을 동적 바인딩(dynamic binding)이라 한다.

앞서 설명한 상속의 원리는 서브 클래스와 슈퍼 클래스 간 is-a 관계에 기반을 두고 있다.

이 is-a 관계는 서브 클래스는 슈퍼 클래스에 속하는 것 중의 하나라는 것으로 서브 클래스에 속하는 객체는 당연히 슈퍼클래스에 속하게 된다.

이렇게 서브 클래스가 상속 받은 메소드를 재 정의하여 슈퍼 클래스의 메소드를 무시하는 메소드 오버라이딩이 일어나면 메소드 이름과 매개 변수가 정확히 같으면서 구현이 다른 메소드가 클래스 계층상에 여러 개가 있게 된다.

이와 같이 중복된(오버라이드) 메소드가 여러 개 존재하는 클래스 계층에서 한 클래스의 참조 타입으로 선언된 변수가 여러 상이한 서브 클래스 객체를 참조할 수 있다.

이 때, 이 참조 변수에 의해 호출되는 메소드가 여러 개 중복 구현되어 있으면 어느 클래스의 메소드를 실행시켜야 될지 애매하게 된다.

시스템은 실행시간에 실제로 이 참조 변수가 참조하고 있는 객체의 클래스를 결정해서 그 클래스에서 구현된 메소드를 실행시킨다.

이것을 다형성(polymorphism)이라 한다.

예를 들어 다음과 같은 Person 클래스와 서브 클래스 Student 클래스 정의가 있다.

class Person {
    public void output() { 
        System.out.println("Person's object method");
    }
}

class Student extends Person {
    public void output() {
        System.out.println("Student's object method");
    }
}

여기서 다음 코드는

Person p = new Person();
p.output();
p = new Student();
p.output();

다음과 같은 결과가 출력된다.

Person's object method
Student's object method

이와 같이 두 개의 똑같은 p.output() 명령문에 대해 상이한 결과를 생성하는 것은 동적 바인딩 때문이다.

즉 시스템은 참조 변수 p가 현재 참조하고 있는 객체의 타입을 동적으로 검사하고 판단해서 그 타입에 적절한 메소드를 선택한다.

그래서 참조 변수 p가 타입 Person으로 선언되었지만 두 번째 지정문에서는 Student 타입의 객체가 지정되고 이로 인해 p.output()은 Person 클래스에서 정의된 output() 메소드가 아니라 Student 클래스에서 정의된 output() 메소드를 실행하게 된다.

이 때 p.output() 메소드가 경우에 따라 Person 타입의 output() 메소드를 실행시키기도 하고 Student 타입의 메소드를 실행시키기도 하는 것이 다형성이다.

또한 한 클래스 내에서 이름이 같고 매개변수의 수나 타입만 다른 메소드들이 여러개 구현되어 있는 메소드 오버로딩(mehtod overloading)환경에서 메소드를 호출하면 시스템은 인자의 수와 타입에 일치하는 메소드 구현을 선정하여 실행시켜 준다.


정리

객체 지향 개념의 캡슐화와 상속은 객체지향 설계에서 사용되고 다형성은 주로 객체를 이용하는 응용프로그램에서 사용된다고 볼 수 있다.

객체 지향설계는 다음 두 단계로 요약할 수 있다.

  1. 문제 해결을 위한 핵심 클래스(ADT)들을 식별한다. 이 때 클래스가 지원하는 캡슐화를 이용한다.
  2. 식별된 클래스들간의 계층 관계를 설계한다. 이 때 클래스들간의 상속을 이용하여 프로그램 코드를 재사용할 수 있도록 한다.

참고 문서

  • 이석호. (2004). 자료 구조와 JAVA. 정익사.





© 2019. by RaP0d

Powered by aiden