본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]한원우_11월8일 실습보고서

by 알 수 없는 사용자 2011. 11. 9.
728x90
반응형

객체지향 프로그래밍은 무엇인가?

프로그래밍을 객체지향과 나누는 기준은 무엇을 타켓으로 맞추느냐.. 말 그대로 지향을 무엇으로

하는냐에 따라 나눠진다. 객체를 지향한다는 말은 객체에 집중한다는 말이다.

객체에 집중하여 만들어 진 프로그램이라고 할 수 있다. 그에 반해 C는 구조적 프로그래밍이다.

UFO는 정의되지 않은 비행물체, 한마디로 객체이다.Object-Oriented Programmig, OOP

객체지향을 영어로 무엇이라 하는가.? 객체지향적으로 짜는 C를 OOC라고 하고 메킨토시가 OOC의 예이다.

C로도 객체지향적으로 프로그래밍을 짤 수 있지만 시간이 너무 많이 걸린다. 단지 그 이유다.

객체지향이라는 개념이 있고, 거기에 따른 부속적인 기법이나 도구를 언어라고 한다.

객체지향적으로 언어를 잘 짜도록 도와주는 언어를 객체지향언어라고 한다. 객체지향만 되는 것이

아니다. C도 객체지향으로 짤 수 있다. 어떤 한 개념을 가지고 짜느냐에 따라 객체지향과 구조적

프로그래밍을 나뉘게 된다.

일반 공장에서 나오는 그릇과 도자기와 무엇이 다른가.? 를 생각해보자.

어떤 도자기는 1억원이고 어떤 도자기는 5천원이라면 어떤 차이가 있을까? 어디에서 기준을 잡아야

할까?

뭔가를 만들 때 개념을 가지고 만드는 것이다. 미술하는 사람은 표현하고자 하는 목적의식이 있다.

C프로그래밍도 객체지향 개념을 가지고 만들면 만들 수 있다. 억지로 억지로 C로 객체지향적 프로

그래밍을 구현할 수 있다. 어셈블리로 윈도우 프로그램을 만들 수 있다. 화면에 점을 찍을 수 있고

그래픽 형태로 모든 것을 짤 수 있다. 하지만 왜 어셈블리로 그래픽 형태로 짜지 않으냐?

어셈블리의 목적이 무엇인가? 그건 바로 제어하기 위해 태어난 언어이기 때문이다.

화면이 그다지 중요하지 않은 시기에 태어났기 때문에 화면을 지원하지 않는다.

카세트 테이프가 사라지고 MP3가 나오고 있지만 C언어는 도퇴되지 않는다.

왜 안되느냐? C는 제어를 위해 태어난 언어이다. 제어할 수 있는 언어가 지금의 C보다 나은게

없다. 자바로 대체한다면? 결코! 자바는 제어를 못한다. 가상의 머신을 제어하기 위한 언어가

바로 자바이기 때문이다. 실제로 존재하지 않는다. 지금 쓰고 있는 자바나 윈도우 프로그래밍

자체도 그래픽에 최적화 되지 못했다. 써보면 알겠지만 불편하다. 하지만 그 불편을 덜어주기

위해 태어난 것이 다이얼로그창 기반의 비주얼 베이직이다.

그런 것들을 RAD툴이라고 한다. Delphi(델파이 언어)도 비주얼 베이직과에 속한다.

실질적으로 제어하려고 하는 것이 바로 하드웨어이다. 초창기에는 하드웨어를 제어하기 위해

어셈블리가 사용되었다. 어셈블리어전에는 기계어가 사용되었다. 그 위에 탄생된 것이 C언어

1000번지를 A 변수로 두고 1000번지에 64 + 1을 넣으려고 한다면..

C에서는

A = 64 + 1; 이라고 써주면 되지만,,

어셈블리로 표현하기 위해서는

mov eax, 0x64

inc eax   ;eax + 1

mov [1000], eax

C언어의 한 줄이 어셈블리의 경우 3줄이나 된다. C언어가 없었을 때는 어셈블리로 하드웨어를

제어했다. 사람 기준에서 알아보기 힘든 언어를 저급어라고 하고 사람이 알아 볼 수 있는 언어

를 고급어라고 한다.

3번째 블럭에 해당하는 언어인 자바. 자바 가상 머신은 C로 만들어 진다. 가상머신은 자바로

만들지 못한다. 자바 가상 머신 위에서 동작하는 언어가 바로 자바. 기본적으로 C나 어셈블리

기반을 필요로 한다. 결국에 3번째 블록까지의 언어가 존재하는 이유는 하드웨어를 제어하기

위해서이다. 소프트웨어가 존재하는 이유는 하드웨어를 쓰기 위해 존재한다.

그렇다면 프로그래밍을 하는 사람들은 하드웨어를 해야 할까?

힘들다. 그래서 뭐든지 중간 계층을 만들내기 마련이다. 자동차구조를 몰라도 자동차를 운전할

수 있게끔 해야 하기 때문에 운전하는 기술만 알면 자격증을 준다. 그것이 바로 면허증.

자동차를 수리할 수 있는 자격증과는 다르다.

언어에 비교하면 Assembly는 자동차를 수리하고 운용하는 자격증에 속하고 C는 자동차를 운전하

는 사람중에 자동차의 구조를 잘 아는 사람들에 속한다.

자동차를 잘 알려면 자동차를 만들어 봐야 한다.

C++도 C에 속한다. 주위를 둘러보면 C만 아는 사람이나 C++만 아는 사람이 대부분 일 것이다.

최적화의 개념이 거의 없다. C를 3년정도하면 최적화의 개념이 생긴다. 실제로 최적화는 중간 파일

을 열어봐야 알 수 있다. cl로 컴파일하는거와 gcc로 컴파일 하는 것은 틀리다. 최적화 시키는 기법이

나 알고리즘 자체가 틀리다. 똑같은 라인을 찾아보면 똑같이 컴파일 되는 경우도 있지만 다르게 되는

경우도 있다. 어떤 게 좋냐고 물어본다면 cl컴파일러다.

자기가 돈 주고 산 자전거와 정부에서 대여하는 자전거를 생각해보자.

자바와 C++로 프로그래밍을 해도 그래픽은 여의치 않다. 실제로 그래픽기반은 아니다.

그래서 그 위에 나온 것이 비주얼베이직과 델파이언어이다. 제일 빠르다. C로 한달 걸릴 일을

30분도 안되 만들 수도 있다.

RAD툴이라고 하는데 RAD는 rapid application development의 약자이다. 빠른 프로그램 개발

이라는 의미를 가진다. 다이얼로그는 10초안에 창이 나온다.

구조적 프로그래밍을 모든 언어들이 모두 가지고 있다. 문법을 쉽게 만든 것이 C언어이고, 객체

를 지향하는 언어가 객체지향 언어이다. 객체지향에서도 프로그램을 더 빨리 개발하는 것이 RAD

이다.

급어와 고급어의 차이는 어떠한 개념을 가지고 있느냐하는 차이이다. 다른 말로 하면 마인드

의 차이이다. 전체적으로 언어를 보는 눈을 넓혀라.

직접적인 제어는 C나 어셈블리밖에 없다. 그래서 40년이 지나도 사라지지 않는 것이다.

C로도 객체지향적으로 짤 수 있다. 하지만 험난하다.

구조적 프로그램을 구현하기 위한 도구가 바로 C언어이다.

 

C++

C는 C++의 부분집합이다. C가 사용하는 모든 기법들은 C++에서 사용된다.

gcc로 컴파일 했을 때

zcl로 컴파일 했을 때

확장자를 cpp로 바꾼다. C++ 컴파일러의 이름은 g++이다.

똑같이 컴파일 해보자.

cl와 g++로 이상없이 컴파일 된다.

다음은 구조체 변수를 선언하여

cl과 g++로 컴파일 해보자. 역시 이상없이 컴파일 되는 것을 확인할 수 있다.

이번에는 구조체변수를 하나 더 선언하고 앞에 struct를 빼보고 다시 컴파일 해보자.

확장자는 여전히 cpp이다. 이번에는 cl과 g++, gcc로 컴파일 해보자.

이상없이 컴파일 되는 것을 확인한다. 그럼 이번에는 확장자 cpp를 c로 바꾸어

gcc와 g++로 컴파일 해보자.

image

gcc와 g++컴파일러로 컴파일 했을 때 g++은 이상없이 컴파일 되지만 gcc는 error 메시지가 출력되는

것을 확인 할 수 있다. 구조체 앞에 struct를 붙이느냐 안 붙이느냐는 C에서는 중요하다.

하지만 C++에서는 중요하지 않다. 구조체를 선언할 때 struct를 붙이지 않아도 타입으로 입력해준다.

그래서 C++에서 구조체 앞에 struct를 붙이면 촌스럽다는 소리를 듣게 된다. 즉 촌스러운 짓은 삼가.ㅎ

이번에는 cl로 컴파일 해보자.

image

cl로 컴파일 해도 error가 뜬다. 하지만 확장자를 cpp로 바꿔서 하게 되면

image

이상없이 컴파일 되는 것을 확인 할 수 있다.

cl은 확장자로만 이것이 c인지 c++인지를 분류한다.

리눅스는 기본적으로 명령어로 분류되는데 윈도우 컴파일러 cl은 c도 되고 c++도 되기 때문에

확장자로 분류해줘야 한다.

다시 확장자 cpp를 c++로 바꾸어 보자. 바뀐 후에 cl로 다시 컴파일 해보자.

image

컴파일 되지 않는다. 다시 g++로 컴파일 해보자.

image

이상 없이 컴파일 된다. 다시 확장자를 CC로 바꾸고 cl로 컴파일 해보자.

image

역시 컴파일이 되지 않는다. 윈도우는 확장자가 까다롭다. 원래 확장자 기반이기 때문이다.

c는 기본적으로 유연하다. 유연한 이유 그 첫번째는 gcc나 g++같은 명령어에 의존하고 두번째로는

리눅스에서 c++이라는 파일의 종류는 다양하기 때문이다. 비주얼 스튜디오에서만 cpp를 사용한다.

그래서 cl은 cpp에 민감하다. 보통 c++의 확장자는 cpp, c++, cc, C등이 있다.

cl은 확장자 기반으로 동작하고 gcc는 명령어 기반으로 동작하는 것을 알 수 있다.

리눅스에 make가 있다. 확장자 cc만 남기고 모두 삭제한 후 make 해보자

image 확장자 cc를 make 했을 때

image 확장자 cpp를 make 했을 때

image 확장자 c++을 make 했을 때

image 확장자 C를 make 했을 때

확장자에 따라 g++을 호출해준다. 지능적으로 동작한다는 것을 알 수 있다.

C++은 struct와 enum 그리고, union의 생략이 가능하다.

image

enum을 선언하고 main안에 enum을 생략하고 test2만 적은 후 변수 obj3을 선언하고

g++로 컴파일 해보자.

image

이상없이 컴파일 되는 것을 확인 할 수 있다. 이번에는 소스로 돌아와 enum을 생성과 동시에

초기화 해보자.

image

그런 후에 다시 컴파일 해보자.

image

여전히 이상없이 컴파일 된다. 이번에는 printf로 obj3을 찍어 보자.

image

image

정상적으로 컴파일 되고 실행도 이상 없다.

이번에는 ZERO 대신에 숫자 0을 넣고 컴파일 해보자.

image

image

error가 발생한다. 에러 메시지를 살펴보면 int 와 enum test2의 타입이 틀리다는 것을 확인

할 수 있다. 그럼 이번에는 생략했던 enum을 붙이고 확장자를 c로 바꾼 후에 gcc와 g++로

컴파일 해보자.

image

image

gcc는 되지만 g++은 되지 않는다. c++은 안되고 c는 되는 상황이다.

원래 enum은 int형이 아니다. c에서 그냥 봐주는 것이다. 타입에 엄격하지 않은 것이 c이다.

c++은 타입을 명확하게 검사한다. 그래서 타입을 조금이라도 틀리게 하면 컴파일 시키지 않거나

error를 일으킨다. 그 이유는 정확한 프로그래밍을 위해서이다.

그렇지만 역은 된다.

소스로 가서.

image

int obj4를 선언하고 enum의 ZERO를 대입한 후에 gcc와 g++로 컴파일 해보자.

image

이상없이 컴파일 된다. enum타입에 정수형을 대입할 수 없지만, enum타입에서 나온 멤버는

숫자 자체를 가지고 있기 때문에 정수형에 대입할 수 있다. c++을 쓰면서 타입에 더욱 엄격

해졌다. struct를 생략하기 위해 사용되었던 typedef가 필요 없게 되었다.

새로운 소스를 하나 만들자. 확장자를 cpp로 한다.

더이상 <stdio.h>를 쓰지 않는다. 대신 <iostream.h>을 사용한다. C++에서 입출력을 stream

이라고 부른다. 앞에 입출력을 뜻하는 io를 붙혀 위와 같이 사용하게 된다.

c++에서는 더 이상 우리의 친구 printf는 쓰지 않는다.

C에서 모니터의 출력을 위해 기본적으로 사용되는 함수가 바로 printf이다.

C++도 모니터에 출력을 위해 cout을 사용한다. cout의 c는 consol, out은 출력을 말하며,

즉, 모니터에 문자를 출력을 위해 다음과 같이 쓰면 된다.

image

cout << “문자열\n”;

화살표는 cout으로 보내라는 표시이다. 보낼 대상은 오른쪽에 쓴다.

출력 기법은 자동이다. 변수를 선언해보자.

image

cout은 <<를 통해서 계속 옆으로 출력하고자 하는 내용을 쓸 수 있다.

위 내용을 출력하면..

image

위와 같은 출력이 되는데 이상한 건 c의 값이다. 분명 97을 입력했지만 출력 할 때는 소문자 a가

출력된 것을 볼 수 있다. 그것은 cout도 지능적이라 타입에 반응하기 때문이다. 원래 타입이 무

엇인지 보고 타입에 맞게 출력해준다. 아스키코드 97로 인식하여 a를 출력해준다.

 

cout을 이용하여 만든 구구단 소스

image

 

오버로딩 : 메소드명은 같고 인자 값을 달리하여 사용하는 기법

오버라이딩 : 확장한 상위 클래스의 메소드를 재정의하는 기법

image

위 소스는 함수 이름은 같지만 인자에 따라 다르게 사용하는 기법인 오버로딩을 나타낸 것이다.

“\n” 대신에 endl을 쓴다.


728x90