F.R.I.D.A.Y.

[TIPS 19TH] 11 : 2018.07.30. (월) 본문

외부활동/TIPS 19th

[TIPS 19TH] 11 : 2018.07.30. (월)

F.R.I.D.A.Y. 2018. 7. 31. 18:29
반응형

1. 다형성

 Polymorphism, 즉 다형성은 간단히 설명하면 서로 다른 타입의 자료형이 하나의 자료형으로 캐스팅되어 전달되어도 서로 달리 동작하는 것을 말한다. 일단, 아래 코드를 보자.


struct A{
    char a;
    short b;

};

struct B{
    char a;
    short b;
    int c;

};

int main(void){
    B temp;
    A *p = (A *)&temp;

    return 0;
}

 작성된 위 코드는 A와 B가 유사한 코드이다.  B에는 A에 없는 [ c ] 변수가 추가되긴 했지만, 위 코드를 사용하면 정상적으로 컴파일되는 것을 볼 수 있다. 그러나 구조체 [ A ]는 [ B ]보다 작아서 [ B ]구조체에 있는 [ c ] 변수를 가리킬 수 없다. 따라서 포인터 [ p ]는 [ temp ]변수의 [ c ]변수에 접근할 수 없다. 이러한 문제때문에 C++에서 다형성이 언급되었다.


#include <iostream>

using namespace std;

class A {
public:
	void JOB() {
		cout << "의사" << endl;
	}
};

class B :public A {
	void JOB() {
		cout << "간호사" << endl;

	}
};

int main(void) {
	B temp;
	A *p = &temp;
	p->JOB();
}

 위 C++ 코드에서 포인터 [ p ]에 [ B ]클래스 변수 주소를 넣어줄 때는 형변환을 해줄 필요가 업다. [ B ] 클래스는 [ A ]클래스를 상속받기 때문에 절대 [ A ]클래스보다 작을 수 없기 때문이다. 즉, [ A ]클래스 포인터로 [ B ] 클래스 데이터에 접근하지 못하는 경우는 생길 수 있더라도 잘못된 주소에 접근할 여지가 없기 때문에 C++문법에 포함되었다.


 그렇다면 저 코드에서 [ p->JOB(); ]은 어느 함수가 실행될까? A 클래스 포인터 [ p ]로 B 클래스 변수 [ temp ]를 가리켰다고 하더라도 주소는 B 클래스 변수를 의미하므로 "간호사"가 출력될것같지만, 실제로는 A 클래스의 "의사"가 출력된다.

 이는 컴파일러가 A 클래스 포인터 [ p ]가 가리키는 대상이 실제 [ A ] 데이터인지 [ B ]데이터인지 모르는 모호성에서 발생하는 문제이다. 따라서 이러한 모호성을 없애기 위해 상속되는 부모 클래스의 멤버 함수에 [ virtual ]을 작성해 다형성 사용에서 발생하는 모호성을 없앴다.


#include <iostream>

using namespace std;

class A {
public:
	virtual void JOB() {
		cout << "의사" << endl;
	}
};

class B :public A {
	void JOB() {
		cout << "간호사" << endl;

	}
};

int main(void) {
	B temp;
	A *p = &temp;
	p->JOB();
}

 위처럼 작성하게 되면 컴파일러가 [ p->JOB(); ]가 무엇을 의미하는지 파악해서 정상출력을 해준다. 몇몇 책에서는 오버라이딩을 하면 무조건 부모 클래스 함수 앞에 [ virtual ]을 작성해야한다고 하는데, 다형성 기술을 사용하지 않는다면 굳이 하지 않아도 된다. 오히려 남발하게 되면 프로그램 컴파일 속도가 하락하는 원인이 된다.


 다형성은 프로그램의 유지 개/보수에 용이하기 때문에 이용되기도 한다. 다음 코드를 보자.


#include <iostream>

using namespace std;

class chair {
public:
	void typePrint() {
		cout << "의자입니다." << endl;

	}
};

class table {
public:
	void typePrint() {
		cout << "책상입니다." << endl;

	}
};

int main(void) {
	chair *cir = new chair[10];
	table *tble = new table[5];

	for (int i = 0; i < 10; i++) {
		(cir + i)->typePrint();

	}
	for (int i = 0; i < 5; i++) {
		(tble + i)->typePrint();

	}

	delete[] cir;
        delete[] tble;

        return 0;
}

 의자와 책상에 대한 클래스를 생성해 각각 10개, 5개의 객체를 만들었다. 서로 몇개나 만들어질지 모르기때문에 각각 반복문을 나누어 만들어주었다.

 이번에는 다형성을 이용해 위 코드를 만들어보자[각주:1].


#include <iostream>

using namespace std;

class furniture {
public:
	virtual void typePrint() {};

};

class chair : public furniture {
public:
	void typePrint() {
		cout << "의자입니다." << endl;

	}
};

class table : public furniture {
public:
	void typePrint() {
		cout << "책상입니다." << endl;

	}
};

int main(void) {
	furniture *funi[20];
	funi[0] = new chair;
	funi[1] = new table;
	funi[2] = new chair;
	int count = 3;

	for (int i = 0; i < count; i++) {
		funi[i]->typePrint();
	}


	for (int i = 0; i < count; i++) {
		delete funi[i]; //해제
	}
}

 다형성을 사용하게 되면 여러개의 자료형이 하나의 자료형으로 귀속될 수 있기때문에 관리에 더 용이하다. 만일 다른 가구를 더 추가하게 된다면 다형성을 사용하지 않은 코드의 경우에는 일일이 하나씩 코드를 생성해야하지만, 다형성을 적용하면 새로운 자료형을 생성하고 사용할 부분에 작성만 해주면 코드 검증이 따로 필요하지 않다. 이렇게 만들고 나면 유지 보수에서 절대 코드를 수정하지 않는 부분이 늘게 되면서 유지, 보수가 용이해지는 것이다.



2. Windows 프로그래밍

 다형성 이후 남은 시간을 이용해 Windows 프로그래밍에 대해 잠깐 맛보기로 배웠다. 따라서 용어 설명이다.


 OS(운영체제)

>> 하드웨어와 이용자를 연결해주는 존재로, 사용자가 하드웨어를 좀더 쉽게 이용할 수 있도록 만들어주는 프로그램이다. 운영체제의 부재로 발생하는 문제로는 깊게 들어가지 않더라도 발생한다. 파일을 저장하기 위해 위치와 어떻게 저장할것인지 등 기본적인 부분을 직접 다루어야 함은 물론, 메모리 관리부터 대부분의 작업을 사용자가 직접 해야한다.


 API(Application Programming Interface)

>> 개발자가 프로그램을 개발할 때 운영체제가 지원하는 함수들의 집합이다. 개발자 단신으로 프로그램에 필요한 모든 코드를 작성하는 것은 생산성, 자원 측면에서 비효율적이므로 운영체제에서 만들어져있는 함수들을 가져다 쓸 수 있도록 하는 집합인것이다.


 SDK(Software Development Kit)

>> 소프트웨어를 개발할 때 도움을 주는 도구를 칭한다. 넓게 직접 기계어로 번역을 해야하는 작업을 대신 해주는 컴파일러를 예로 들 수 있다.


 Xamarin

>> 모든 플랫폼에서 사용가능한[각주:2] Java의 대항마로서 개발된 프레임워크이다.


 Docker

>> OS 위에서 돌아가는 프로그램이 문제가 발생할 경우 OS에 영향을 주는 문제를 최소화하기 위해 발생한 기술. 프로그램을 OS에 직접 올리지 않고 OS가 미니 OS를 만들어 해당 미니 OS가 프로그램을 실행하는 방식으로 동작한다. 프로그램에 문제가 발생하게 되면 미니 OS에만 영향을 주고 실제 메인 OS는 영향을 받지 않으므로 미니 OS만 메모리상에서 지워버리게 되면 아무 문제가 없는것이다. Windows에서는 svchost.exe가 해당 기능을 실행한다고 한다.



Ect.

사용자가 하드웨어를 이용하기 위한 과정으로 보면 될것같다.



 인터페이스는 서로다른 두 대상간의 통신규약과 비슷한 것으로 보면 된다. 다른 언어를 구사하는 사람간에 소통을 위해 통역사가 존재하는 것과 같은 이치이다. 정상적인 소통을 위해 인터페이스가 존재한다.


  1. 완전히 동일하게 프로그래밍하지는 않았다. [본문으로]
  2. 정확히는 JVM(Java Virtual Machine, 자바 가상머신)이 실행되는 모든 플랫폼 [본문으로]
728x90
반응형
Comments