• OOP 2017.06.02

OOPreport.txt

 

OOP (Object-oriented programming,객체지향프로그래밍)

  

프로그래밍 방법론으로 클래스,자료 추상화,상속,다형성,캡슐화등을 이용하여 프현실세계를 시스템을 독립적 객체들의 집합으로 모델링 하는것이다. 다른 방법론들 또한 현실세계를 모델링 하므로 OOP의 고유특성은 아니나 사물과 그 행위을 하나로 묶고 객체간의 메시지를 기본 모형으로 하기때문에 각 객체가 종속 될 필요가 없고 객체지향프로그래밍의 장점으로 나타난다. 이 장점 때문인지 현재 프로그래밍 방법론 중 가장 많이 쓰이고 있다.

객체지향프로그래밍의 장점으로는 시스템의 복잡성을 낮추며 코드의 재사용성 증가, 유지보수 감소등을 들수있다.

 

 

Objcet, 객체

현실세계의 존재하는 모든 것을 말하며 예를 들어 사람,동물,교실 처럼 실체하는 것부터 거래,계좌,수학 같은 개념적인 것을 모두 포함한다. 객체는 식별성, 상태(state), 행위(behavior)의 특성을 같는다. 현실의 객체는 무한에 가까운 특성을 가지고 있기때문에 이를 모델링 하기 위해서는 시스템에 필요한 요소만을 분류/집합 해야만 한다. 

객체지향프로그래밍이라는 이름에서 알 수 있듯이 OOP에서 중요한 개념이다.

 

Class, 클래스

 

모든 객체는 클래스를 통해 정의 될 수있다. 클래스는 여러객체들의 공통적인 상태와 행동을 가지고 있는데 이 과정을 추상화라고 한다. 클래스가 정의 된 후 객체가 정의되는데 이렇게 한 클래스에 속한 각가의 객체를 그 클래스의 인스턴스(instance)라고 한며, 그 객체들의 유형이 되는 클래스를 객체의 타입(Object Type)이라고 한다.

 

 

Abstraction, 추상화

현실세계의 객체의 일반적인 특징을 표현하기에는 너무많은 특징을 가지고 있다. 때문에 모델링하고자 하는 시스템에 필요한 정보를 집중, 분류하며 상세내역을 없애가는 과정을 추상화라고 한다. 시스템에 따라 필요정보가 다르기때문에 시스템에 의존적이게 된다.

 

Generalization, 일반화 / Inheritance, 상속

'남자와 여자는 사람이고 사람과 강아지는 동물이다' 처럼 클래스의 공통 된 특징을 추출하여 상위 클래스로 추상화 되는데 일반화란 이처럼 추상적으로 상위 클래스로 향함을 말한다. 

상속이란 일종의 일반화이다.

상속은 일반화한 상위클래스를 이용하여 공통 된 특징이외 고유의 특징을 추가하여 하위 클래스를 만들게되면 이 둘의 관계를 상속관계라고 한다.

상속을 통하여 기존의 클래스로부터 추가적 특성을 추가하는 것 만으로 하위클래스를 정의 할 수있기때문에 반복을 막아주고 재사용성이 늘어나게된다.

Java에서 extends 키워드를 통한 상속을 지원하고 상위 클래스를 공유하는 의미를 지닌다.

 

Specialization, 구체화

일반화와는 반대로 상속을 통해 클래스의 추상 수준을 낮추어 나가는 과정을 구체화라 한다. 

일반화와 구체화는 클래스간의 is-a 관계를 나타낸다.

 

Realization

추상화 과정을 거쳐 만들어진 클래스를 하나의 객체로 만드는 것을 말하다.

이때 만들어진 객체를 클래스의 인스턴스라고 한다.

예를 들면 사람이라는 클래스로부터 홍길동이라는 인스턴스가 나타난것이다.

Java에서 완전한 추상클래스를 지원하기 위해 interface를 제공한다. 

implements로 사용 할 수있으며 상속과 마찬가지고 is-a관계를 갖고 있지만 상속은 공유의 의미를 가지고 인터페이스는 구현의 의미를 가진다.


Association (소유)

객체간의 참조관계를 나타낸다. 

예를 들면 자동차의 구성으로 사람이라는 객체의 구성으로 팔,다리,머리들이 있고 머리는 눈,코,입을 가지고있듯이 객체간의 has-a 관계를 나타낸다.

 

Dependency, 종속성 (사용)

A라는 클래스가 B라는 클래스 또는 인터페이스를 사용할때 마다 A는 B에 의존하게 된다. 이때 A가 B에 종속되어있다고 할 수있으며 이는 종속에는 방향성이 있기에 A가 B에 종속된다해소 B가A에 종속되었다고 볼수는 없다.

A는 B 없이는 사용 될 수없고 이때문에 재사용을 어렵게 할 수있기때문에 개발에 부정적인 영향을 끼칠 수 있다.

이에 관련 Dependency Inversion Principle(DIP, 의존성 역전 원칙)

"상위 레벨의 모듈은 하위 레벨들에 의존해선 안되며, 모든 것들은 추상에 의존해야 한다"는 중요개념이 있다.


Polymorphism, 다형성

객체지향 개념에서의 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 구현과정에서는 같은 상위클래스를 상속받아 동일한 메소드를 가지고있는 클래스들을 공통으로 상속받고있는 클래스 타입으로 참조하여 실제 구현내용은 다르지만 같은 타입으로 참조하기때문에 코드의 유지보수와 확장성에 유리하게 작용한다.



Encapuslation / 절차은닉 / 정보은닉

객체지향에서 캡슐화는 상태와 행위을 하나로 묶고 정보의 처리와 접근을 모두 클래스 내부에서 하도록 하는것이다. 

외부와의 상호작용은 메소드 호출로만 이루어지기때문에 외부로터 필드로 무분별한 접근을 막을 수있고 내부 내용의 변경이 외부에 영향을 끼치지않는다. 이로인하여 유지보수와 재상용성이 늘어나고 필드의 값이 손상 될 가능성또한 낮출수있다.

Access Modifier(접근 제한자)

정보를 은닉하기위해 프로그래밍언어에서는 Access Modifier(접근제한자)를 지원한다.

Java

public : 어디서나 접근가능

protected : 같은 패키지, 상속받은 클래스에서 접근가능

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

private : 외부접근 불가능



+ Recent posts