추상화

|

 

 추상화

 

추상화란 주어진 문제나 시스템 중에서 중요하고 관계 있는 부분만을 분리하여 간결하고 이해하기 쉽게 만드는 작업이다. 이러한 과정은 원래 문제에서 구체적인 사항은 되도록 생략하고 핵심이 되는 원리만을 따지기 때문에 원래 문제와는 전혀 관계가 없어 보이는 수학적인 모델이 나오기도 한다. 이 기법은 복잡한 문제나 시스템을 이해하거나 설계하는 데 없어서는 안 될 중요한 요소이다.

 

 

데이터 추상화

 

추상화는 구체적 사물들의 공통된 특징, 추상적 특징을 파악하여 인식의 대상으로 삼는 행위이다. 추상화가 가능한 개체들은 그것들이 소유하고 있는 특성의 이름으로 하나의 집합을 이룬다. 그러므로 추상화한다는 것은 여러 개체들을 집합으로 파악하는 것과 동일한 것이다. 그 추상적 특성은 집합을 구성하고 있는 개체들에게 「일반화」되는 것이므로 그 집합의 요소들에게 보편적인 것이다.

예를 들어 국어 점수, 영어 점수, 수학 점수의 3개 데이터가 있다고 하자. 이들은 성적이라는 하나의 공통적인 특징을 가지고 있다. 이를 활용하여 다음과 같이 묶어서 새로운 데이터형으로 정의할 수 있다.

 

class Score {

 

              int koreanScore;

              int englishScore;

              int mathScore;

}

 

Score 라는 클래스가 국어 점수, 영어 점수, 수학 점수의 3가지 데이터를 가지고 있다. 특정 개체들에게 일반화되는 특성을 찾아 그 추상적 특성의 이름으로 하나의 집합을 이루게 한 것이다. 이것을 데이터의 추상화라고 한다.

 

 

기능 추상화

 

기능 추상화에는 바로 함수가 있다. 어떤 기능들을 한데 묶어서 이름을 붙여 하나의 집합을 이루게 한 것이 바로 함수이다.

 

       void computeScore(int korMidterm, int korFinalExam, …생략) {

            

             koreanScore = korMidterm + korFinalExam;

             englishScore = engMidterm + engFinalExam;

             mathScore = mathMidterm + mathFinalExam;

       }

 

 

 

 

 

객체 추상화

 

객체의 추상화는 다른 종류의 객체와 구분 할 수 있는 필수적인 속성과 행위를 나타내는 것으로 객체가 어떻게 구현되는지 보다는 어떤 기능을 수행할 지에 초점을 맞추어 기술하는 개념이다. 따라서 하나의 대상에 대해 목적이나 원하는 기능에 서로 이름이 다른 여러 개의 추상화 모델이 존재할 수 있다. 객체의 추상화를 구체화시키기 위해서는 속성과 행위에 구체적인 값을 대입해서 인스턴스(instance)를 만드는 것이다.

 

Score student1 = new Score();

             Score student2 = new Score();

             Score student3 = new Score();

            

             student1.koreanScore = 77;

             student2.koreanScore = 98;

       student3.koreanScore = 87;

 

하나의 Score 클래스에 대해 student에 따른 서로 다른 인스턴스들을 만들어 여러 개의 추상화 모델이 존재하게 된다.

 

 

여기서 데이터의 추상화,기능의 추상화와 객체의 추상화에서 알 수 있는 하나의 사실이 있다. 추상화라고 하는 것에는 항상 새로운 이름이 붙는다는 점이다. 따라서 프로그래밍 입장에서 추상화라고 하는 것은‘공통의 속성이나 기능을 묶어 이름을 붙이는 것’이라고 정리해 볼 수 있다.

우리가 프로그램 상에서 사용할 실체는 객체인데 이 객체를 만들기 위해서는 틀이 필요하다. 시스템 적으로 들어가면 객체를 활용하려면 메모리상의 자원으로 적재되어야 하는 데 언어가 기본적으로 제공하는 type이 아니면 메모리에 적재할 수 없다. , 정의하지 않았거나 미리 약속되지 않은 것은 메모리에 적재할 수 없다는 것이다. 따라서 이미 약속된 것이 아니라면 하나의 type으로 정의해야 한다는 것이다. 예를 들어 언어가 기본적으로 제공하지 않는 기능은 함수라는 것을 만들어야 쓸 수 있다. (실행시에는 함수도 메모리에 적재된다.) 그리고 언어가 제공하지 않은 새로운 데이터형은 구조체나 typedef등의 방법으로 새로운 type을 만든 후 그 type에 대한 변수를 생성할 수 있다. (변수 생성은 메모리상에 변수 영역이 할당됨을 의미한다.)

객체도 마찬가지 이다. 객체가 가진 속성데이터와 기능을 정의하지 않고는 메모리에 올릴 수 없다. 그 객체 생성을 위한 type이 바로 클래스인 것이다. 그래서 객체가 중심이 되는 객체지향 프로그래밍에서는 클래스가 핵심이 될 수 밖에 없다.


'메모 > Java/Android' 카테고리의 다른 글

java vector 예제  (0) 2012.03.31
java swing 공통 메소드 예제  (0) 2012.03.31
객체지향 설계 원칙  (0) 2012.03.31
안드로이드 공식 API 레퍼런스 페이지  (0) 2012.03.14
안드로이드 버전정보  (0) 2011.12.26
And