구조적 개발 방법론과 객체지향 개발 방법론
구조적 개발 방법론
절차를 중심으로 고객의 요구사항을 문서화하는 것
객체지향 개발 방법론
절차보다는 현실세계의 실체 및 개념들을 객체라는 독립된 단위로 구성하고, 이 객체들끼리 메시지를 주고받으며 상호작용함으로써 전체 시스템이 운영되는 것
객체지향 프로그래밍의 특징
객체지향 프로그래밍의 장점은 1)추상화, 2)캡슐화, 3)상속, 4)다형성의 4가지 특징으로 얻을 수 있다.
추상화
중요하지 않은 부분은 내부에 숨기고, 중요한 부분은 외부에 노출되도록 모델링하는 것
[c++예제]
자동차를 구현하는 코드를 생각해봅시다.
차에 특별히 관심이 많은 사람이 아니라면 페달을 밟으면 어떤 원리에 의해서 차가 움직이는지에 대해서는 크게 관심이 없습니다. 따라서 차 객체를 활용할 때 사용자는 차가 움직이는 원리의 코드까지 완벽히 이해할 필요없이 차 객체의 사용설명대로 코드를 가져다 쓰면 되는 것입니다. 이를 통해 우리는 복잡한 프로그램을 만들 때, 많은 객체를 가져다 사용할 수 있는 것입니다.
class Car{
String name;
String engine;
String wheel;
int speed;
protected:
void 엔진의움직임(){..engine을 다루는 매우 복잡한 코드..};
void 엔진의동력이바퀴로전달(){..wheel을 다루는 매우 복잡한 코드..};
public:
Car(String name, String engine, String wheel, int speed){
this.name=name;
this.engine=engine;
this.wheel=wheel;
this.speed=speed;
}
void move(){
엔진의 움직임();
엔진의 동력이 타이어로 전달();
System.out.println(this.name+"이 "+this.speed+"의 속도로 움 직인다.");
};
}
캡슐화
data와 그 data들을 처리하는 operation들을 중심으로 묶는 것
[c++ 예제]
아래의 코드에서 차라는 객체는 차의 이름과 차를 이루는 부품인 engine, wheel과 이 engine, wheel 등을 처리하는 메소드들로 묶여 있습니다. 즉, 차라는 객체는 차와 관련된 데이터들과 이 데이터를 처리하는 메소드들로 묶여 있는 것입니다.
class Car{
String name;
String engine;
String wheel;
int speed;
protected:
void 엔진의움직임(){..engine을 다루는 매우 복잡한 코드..};
void 엔진의동력이바퀴로전달(){..wheel을 다루는 매우 복잡한 코드..};
public:
Car(String name, String engine, String wheel, int speed){
this.name=name;
this.engine=engine;
this.wheel=wheel;
this.speed=speed;
}
void move(){
엔진의 움직임();
엔진의 동력이 타이어로 전달();
System.out.println(this.name+"이 "+this.speed+"의 속도로 움 직인다.");
};
}
상속
부모 클래스에서 정의한 속성과 함수들을 자식클래스가 그대로 물려받는 것. 상속을 통해 이미 정의한 속성과 함수들을 재사용할 수 있다.
[c++예제]
superCar 클래스는 Car 클래스를 상속받음으로써, Car 클래스에서 이미 구현된 속성과 메소드들을 재사용할 수 있다. 이를 통해 superCar의 기능들을 훨씬 편리하고 쉽게 구현할 수 있다.
class Car{
String name;
String engine;
String wheel;
int speed;
protected:
void 엔진의움직임(){..engine을 다루는 매우 복잡한 코드..};
void 엔진의동력이바퀴로전달(){..wheel을 다루는 매우 복잡한 코드..};
public:
Car(String name, String engine, String wheel, int speed){
this.name=name;
this.engine=engine;
this.wheel=wheel;
this.speed=speed;
}
void move(){
엔진의 움직임();
엔진의 동력이 타이어로 전달();
System.out.println(this.name+"이 "+this.speed+"의 속도로 움 직인다.");
};
}
class superCar: public Car{
...
}
다형성
각 객체의 고유한 특성에 따라 함수가 다르게 동작
*오버라이딩과 오버로딩
오버라이딩
부모클래스에서 정의한 함수를 자식클래스에서 재정의하는 것
오버로딩
메소드의 이름은 같지만 매개변수의 타입이나 개수가 다른 함수를 여러개 구현하는 것
[c++예제]
같은 차지만, 슈퍼카, 세단, 트럭 등은 엔진을 움직이는 방법, 엔진의 동력을 바퀴로 전달하는 방법 등이 다를 수 있다. Car 클래스를 상속받은 superCar, Truck 클래스 엔진의움직임(), 엔진의동력이바퀴로전달() 메소드를 다르게 구현하면 superCar, Truck의 특성에 맞게 메소드가 다르게 동작될 수 있다.(함수 오버라이딩)
class superCar: public Car{
void 엔진의움직임(){..superCar의 특성에 맞게 재정의..};
void 엔진의동력이바퀴로전달(){..superCar의 특성에 맞게 재정의..};
}
class Truck: public Car{
void 엔진의움직임(){..Truck의 특성에 맞게 재정의..};
void 엔진의동력이바퀴로전달(){..Truck의 특성에 맞게 재정의..};
}
*[c++]상속의 종류: public, protected, private 상속
public 상속
기본 클래스를 public으로 상속받으면, 기본 클래스의 protected, public 멤버들은 접근 지정 변경 없이 파생 클래스에 그대로 상속 확정된다.
protected 상속
기본 클래스를 protected로 상속 받으면 기본 클래스의 protected, public 멤버들은 모두 protected 접근 지정으로 변경되어 파생클래스에 상속 확장된다.
private 상속
기본 클래스를 private로 상속받으면, 기본 클래스의 protected, public 멤버들은 모두 private 접근 지정으로 변경되어 파생클래스에 상속 확장된다.
※참고: 상속 접근 지정자가 생략되면 private 상속으로 처리
class Derived : Base {...}; //접근 지정자 생략
class Derived : private Base {...}; /접근 지정자가 생략되면 private 상속으로 자동 처리된다.
*[c++}생성자, 소멸자
생성자
클래스 이름과 동일한 이름을 가진 메소드(오퍼레이션)으로 인스턴스를 생성함
파생클래스의 객체가 생성될 때, 기본클래스의 생성자가 실행되고 파생클래스의 생성자가 실행된다.
소멸자
생성자의 반대로 생성된 객체 인스턴스를 메모리로부터 제거한다. 객체가 제거되면 자동적으로 수행된다.
생성자의 생성 순서와는 반대로 파생클래스의 객체가 소멸될 때, 파생클래스의 소멸자가 먼저 실행되고 기본클래스의 소멸자가 실행된다.
*static
static은 변수와 함수의 생명주기(life cycle)과 사용범위(scope)를 지정하는 방식 중 하나로서, static으로 선언된 변수와 함수의 생명주기와 사용범위는 다음과 같은 특징을 지닌다.
생명주기: 프로그램이 시작될 때 생성되고 프로그램이 종료할 때 소멸
사용범위: 변수나 함수가 선언된 범위 내에서 사용. 전역(global) 혹은 지역(local)로 구분
1. static 멤버 변수, 함수
멤버 변수를 static으로 선언함으로써 클래스의 모든 인스턴스(객체)들이 공유하는 변수, 함수를 만들 수 있다.
class Person{
public:
double money; //개인 소유의 돈
static int sharedMoney; //공금
...
static void addShard(int n){
sharedMoney+=n;
}
}
2. main의 static
main 함수를 static으로 선언해야하는 이유는 누군가 호출하기 전에 미리 메모리에 올라와 있어야하기 때문이다. static은 java 프로그램이 실행하기 전에 static 변수를 첫 단계로 메모리에 올려 프로그램을 실행시키고, static 변수를 프로그램이 종료될 때까지 메모리에서 사라지지 않는다.
public static void main(String args[]){
...
}
*[c++]추상 메소드
추상클래스란 최소 하나 이상의 순수 가상 함수를 가진 함수를 뜻한다. 순수 가상 함수란 함수의 코드가 없고 선언만 있는 가상 함수로, 주로 실행할 목적보다는 파생클래스에서 재정의하여 구현할 함수를 알려주는 인터페이스의 역할을 한다.
추상클래스는 상속을 위한 기본 클래스로, 파생클래스에서 구현할 함수의 원형을 보여주는데 목적이 있다.
class Shape { //Shape은 추상 클래스
public:
void paint(){
draw();//순수 가상 함수를 호출할 수 있다.
}
virtual void draw() = 0; //순수 가상 함수
};
*[c++]제네릭 클래스
클래스 안의 데이터타입을 미리 정하지 않고 객체를 생성할 때 그 타입을 선언하여 만들 수 있게 한다.
template <class T>
class List{
T* contents;
public:
void append(T item);
}
List<int> intList; //제네릭 클래스의 구체화
객체지향의 장점
객체지향 코드의 유연성을 통해 요구사항의 변화에서 신속하게 대응할 수 있다.
표준 구성 요소의 재사용을 통해 새로운 애플리케이션의 개발시간과 코드의 양을 단축할 수 있다.
소프트웨어의 유지보수성의 향상으로 신뢰성이 향상되고 유지보수 비용이 줄어든다.
객체지향의 단점
개발속도가 느림: 객체가 처리하려는 것에 대한 정확한 이해가 필요하기 때문에 설계단계부터 많은 시간이 소요된다.
실행속도가 느림: 객체지향언어는 대체적으로 실행시간이 느리다.
코딩 난이도 상승
OOA(Object-Oriented Analysis)
요구사항을 분석해 객체들을 뽑아내는 것
OOD(Object-Oriented Design)
OOA로 만들어진 객체들의 리스트를 이용해서 객체들의 관계를 설명하는 것
Comments