Sister Nosilv story

[명품C++] 1장 C++시작_ 연습문제 실습문제 해설

by 노실언니

명품C++Programming - 황기태 - 생능출판사 - 개정2판 4쇄(21.08.26)

* 이 책이 좋은 이유: 많은 정보 & 원어(영어)언급 多

Chapter 1. C++ 시작 (p.46 SUMMARY)

1.1 컴퓨터와 프로그래밍

 # SW(program∋Instructions, data)→HW(∋CPU,Memory)사용

 # 프로그래밍, 프로그래밍언어

 # 기계어;binary code←[Assembler]어셈블리어;mnemonic symbol←[Compiler]고급언어;Fortran, C, etc.

 [CHECKTIME p.21]

 1) 많은 전문가들이 미래 세상을 바꾸고 지배할 것으로 예측하는 것? ② Software

 2) 다음 중 가장 고급 언어는? ① C++

  └ ① C++ > ③ Assembly language > ②Machine language

  └ ④ Java bytecode: Java를 compiler가 → Java bytecode(≒Assembly L)를 JVM이 → Machine code (≒Assembly L)

1.2 C++ 언어의 역사

 # OS, Compiler개발용: BCPLBC; UNIX, 유용해서 광범위 사용

 # [C 문제] 코드개발&관리어려움&(절차=실생활괴리) → [개선] C++, OOP → [C++과 비슷한] Java → [C++ Java 섞어] C#

 # C++표준: ANSI ISO/[···] 모든 C++컴파일러에 의한 동일한 실행결과 보장

* IDE가 제공하는 전용키워드는 지양

 [CHECKTIME p.24]

 1) 생성연대? C1972 → C++1979 → Java1995 → C#2000

* 개발개선 → NEW Challenger → 혼종

* Java가 내 동생이구나. 나는 뭐했

 2) 다음 언어중 가장 관련성이 떨어지는 것? ③ Basic | C, C++, Java

  └ Fortran1954 → Basic1964

 3) C++ 표준의 중요성? ② 호환성; 모든 컴파일러 모든 플랫폼 상관없이 동일결과보장

1.3 C++ 언어의 특징

 # 목표4 ) C호환, OOP∋{캡슐화, 상속, 다형성}, 타입엄격, 효율저하방지(인라인함수)

  └ C호환의 문제: 전역변수 ← 캡슐 밖의 변수선언을 가능하게 함으로써 캡슐화 원칙이 무너짐

 # C+WHAT? ) overloading(function, operator), default parameter, reference, new/delete, generics

   generics: 동일한 코드, 다양한 데이터타입 C++ Standard IO Library(template선언) + STL(Standard Template Library)

 # OOP ∋ 1. Encapsulation(Class=Capsule, Object=Instance); private(default; 해당클래스멤버로만 접근), public

 # OOP ∋ 2. Inheritance; 타 클래스의 멤버를 모두 사용할 수 있는 클래스 생성가능 → Overriding OK

  └ class 상속받을클래스 : public 피상속클래스 { ■ } ;

 # OOP ∋ 3. Polymorphism; 같은이름 다른애ㅇㅈ

  └ Function overloading, Operator overloading, Function overriding(상속시, 부모자식간 같은이름 다른구현)

 [CHECKTIME p.31]

 1) C언어와의 호환성을 위해 무너진 C++언어의 객체지향특성? ① 캡슐화

 2) C++에서 C언어에 새로 추가한 기능이 아닌 것? ① 멀티스레딩

1.4 C++ 프로그램 개발 과정

 # 과정 ) source program 작성Compile; 현 소스 아닌 다른 소스는 참조표시Linking; 참조해야할 코드확보및결합

 # 결과물) source code.cpp 고급언어 →(컴파일 후) 목적파일.obj 기계어 →(링킹 후) 실행파일.exe

 # DLL: 링킹단계에서 결합하지 않고, 실행 중 필요한 순간에 결합하는 Library

 # Debug: Debugger(SW)→라인별실행, Breakpoint설정 등으로 프로그램실행과정관찰

 [CHECKTIME p.36]

 1) 링킹이 필요한 이유가 아닌 것? ① 디버깅을 효율적으로 하기위해 → Linking이 아니라 Debugger가 필요한 이유

 2) C++에서 C언어에 새로 추가한 기능이 아닌 것? ① 멀티스레딩; 뭔지모르겠네 C언어 뒷부분에서 배우나...?

1.5 C++ 표준 라이브러리

 # C++ 표준 라이브러리 ⊃ C(C□), C++ 입출력(i, o, stream들), C++ STL, new

1.6 Visual Studio를 이용한 C++ 프로그램 개발

 # IDE. Visual Studio: Solution ⊃ Project1, 2, ···

 # Build & Run (Ctrl+F5): Compile(Ctrl+F7) + Linking & .exe


p47. Open Challenge

Visual Studio로 솔루션과 프로젝트를 만들고 기본 C++ 프로그램 작성 및 돌려보기

- 지시받은 솔루션명, 플젝명, 소스파일명 지키기

- Add new item → Ctrl Shift A

- 컴+링+실행 → Ctrl+F5

* std::하고 항상 namespace를 항상 지정해주어야 하나보다

* 기본적으로 입출력에 사용하는 헤더파일이 달라짐: 느낌은 Standard Input Output Stream 으로 비슷

* cout (C언어에서 Output하는 함수→printf 를 데려왔다는 말인가벼)


p48. 연습문제 - 이론문제

1. 전문가들은 IT 분야에서 어떤 종류의 기업이 미래를 지배할 것이라고 예측? 소프트웨어 기업

└ p.18, 19:

'Software is eating the world.'

'Over the next 10 years, the battles between incumbents and software-powered insurgents will be epic.'

2. 다음 설명 중에서 틀린 것은?

 ① 사람과 가장 친밀한 프로그래밍 언어가 고급언어이다. (친밀한게뭐야?)

 ② CPU는 기계어만 이해하고 처리할 수 있다. (O!)

 ③ 고수준 언어를 저수준 언어로 번역할 컴파일러가 필요하다. (O!)

  기계어를 익혀서 프로그램을 작성하는 것이 좋은 개발자가 되는 지름길이다.

3.  다음 언어 중에서 계보가 다른 것은? Fortran

└ 22p [그림1-4]에서 보면 Assembly → (BCPL, Fortran) 로 다른 계통으로 갈라짐

4. 다음 중 객체 지향 언어가 아닌 것은? C

5. 객체 지향 언어가 태옹하게 된 원인이 아닌 것은?

└ 先 내 생각: 개발유지보수용이, 실생활괴리감극복

 ① 소프트웨어의 크기가 점점 커지게 되어 관리의 어려움을 극복하기 위해

 ② 소프트웨어의 생명 주기가 짧아지게 됨에 따라 빠른 소프트웨어 작성이 요구되어

  OS 독립적인 프로그램 작성이 필요해서 → 이건 가상머신의 필요성아닌가?

 ④ 실세계의 문제를 모델링하는데 객체의 개념이 적합해서

6. 다음 중 객체지향개념에 포함되지 않는 것은?

└ 先 내 생각: 캡슐/상속/폴리모프

 ① 상속

  흐름도

 ③ 캡슐화

 ④ 다형성

7. C++ 언어가 C언어의 문법적 체계를 계승받음으로써 좋은 점은?

 ① C언어로 작성된 프로그램과 호환성을 가질 수 있다.

 ② C언어처럼 빠르게 실행될 수 있다.

 ③ C언어처럼 절차지향프로그래밍도 할 수 있다.

  전역 변수를 만들어서 여러 함수에서 공유할 수 있다. → 아킬레스건임

8. C++ 언어가 C언어의 문법적 체계를 계승받음으로써 나타난 문제점은?

└ 先 내 생각: 전역변수로 인한 캡슐화 빠각

 ① 개발과정이 복잡해졌다. → C++언어목표가 개발과정개선임

 ② 프로그램 관리가 어려워졌다. → 이하동문

 ③ C 라이브러리를 사용할 수 없게 되어 불편하다. → C뭐시기로 사용가능

  전역 변수가 존재하여 캡슐화의 원칙이 무너졌다.

9. 다음 빈칸 적절단어 기입하라.

C++는 C언어와의 호환성을 목표로 하여 설계되었으며 객체 지향 개념을 추가하였다. 그러나 클래스 바깥에 전역 변수나 함수들을 선언하게 됨으로써 객체 지향의 핵심 개념인 캡슐화의 원칙이 무너지게 되었다.

10. C++ 표준으로 C++ 프로그램을 작성할 때의 장점은?

└ 先 내 생각: 모든 C++컴파일러에서 동일한 결과보장

 ① 확장성

  호환성

 ③ 실행성능

 ④ 개발 용이성

11. C++의 객체 지향 특징이 아닌 것은?

└ 先 내 생각: 캡 상 폴

 ① 상속

 ② 함수 중복 → Function overloading ∈ Polymorphism

  인라인 함수 → 효율저하방지

C++는 Class private가 존재하기때문에 의도적으로 멤버함수호출이 과하게 사용됨

→ 냅두면 효율이 떨어지므로 (선언부에 있다는 느낌으로?)자동 inline 혹은 inline키워드를 통해

멤버함수호출로 인한 시간효율 저하 방지

∴ 인라인 함수는

객체지향의 특징인 잦은 멤버함수호출로인한 시간효율저하를

막기위한 보완적 특징이다.

 ④ 클래스

12. C++언어가 가지고 있는 3가지 객체지향특성을, 주어진 예를 이용하여 설명하라

 (1) 캡슐화:

  TV(객체) 사용자는 TV 속 구조(멤변), 작동 매커니즘(멤함)는 모른다. → private

  사용자가 TV(객체)의 멤버중 사용가능한 것은 버튼(멤함)과 리모컨(멤함)이다. → public

  TV사용자는 버튼과 리모컨을 통해 TV 속 구조물을 이용하고, TV를 작동시킨다.

  → public을 통한 private접근 예. 채널변경버튼(□){ 채널변경매커니즘(); }  

 (2) 다형성: + 연산자는 정수나 실수형인 경우는 합(Addition) 연산을 하고,

  문자, 문자열인 경우는 결합(Concatenate) 연산을 한다.

  예) 1 + 3 = 4,   '1' + '3' = '13'

 (3) 상속성: 생물 ⊃ 메뚜기

 - 생물 (클래스): 세포로 구성, 에너지활동, 항상성유지, 유전과 진화

 - 메뚜기 (클래스): 번데기과정없음, 뒷다리가 뛰어다니기 좋게 김

  모든 메뚜기 (객체)들은 메뚜기 클래스의 멤버인 번데기X, 긴 뒷다리는 공통적으로 가졌다.

  그런 메뚜기 클래스는 생물 클래스를 상속받았기때문에, ( 메뚜기 : public 생물{ }; )

  모든 메뚜기 (객체)들은 세포, 에너지활동, 항상성유지, 유전과진화 특성도 공통적으로 가진다.

13. C++에서는 C언어와 달리 다음 3개의 함수를 작성하고 구분하여 호출할 수 있다. 어떤 객체 지향 특성을 말하는가? Polynorphism(다형성) 중 Function overloading ←같은 이름의 함수 다른 매개변수OK

14. C++언어가 C언어에 추가한 내용이 아닌 것은?

 ① delete연산자

 ② 함수 중복

 ③ 참조에 의한 호출

 ④ 타입 변환 → 타입변환이아니라 타입일반화(generics)?

15. C와 C++언어에 대해 말한 것 중 틀린 것은?

 ① 객체 지향 개념의 도입에 따라 C 코드에 비해 실행 속도가 떨어진 것 맞음(inline등으로 보완)

 ② C++표준을 지키면 다양한 C++컴파일러와의 호환성↑

 ③ 바꿔말함; C언어와의 호환성 유지가 개발방향 중 하나였으므로(p.24),

  C언어로 작성된 object파일, 라이브러리파일은 C++에서 링크 가능하다. C소스코드는 불가하다.

 ④ 표준 확장자명: C 소스파일 = .c , C++ 소스파일 = .cpp

16. C++ 프로그램에 대해 다음 중 틀린 것은?

 ① 바꿔말함; C++ 소스파일은 바이너리가 아닌 txt파일

 ② 소스파일 표준 확장자명 .cpp, 컴파일러에 따라 .cc, .CC, .c++ 등 有

 ③ 목적파일 표준 확장자명 .obj, 컴파일러에 따라 .o 등 有

 ④ 디버깅이란 실행파일의 오류를 발견하고 수정하는 과정 O

17. 링킹에 대한 설명 중 바른 것은?

└ 先 내 생각: 현 소스가 아닌 것은 참조표시만 해둔 기계어 형태 목적파일 → 실제 결합

 ① obj 파일은 기계어로 이루어져 있기 때문에(O) 바로 실행가능(X; 참조표시만)

 ② 링킹 후 생성되는 실행파일(O)을 실행시키려면 목적파일이 필요(X; 실행F외 아무고토 필요없다) 

 ③ 링킹은 실행파일을 만들기 위해 반드시 필요하다.

 ④ 링킹은 실행파일과 다른 실행파일을 합칠 수 있다. (X; 현 목적파일+타 라이브러리)

18. 다음 그림에서 링킹의 의미를 구체적으로 설명하라.

 - hello.cpp에는 cout, << 가 사용되었고,

  이는 해당.cpp가 아닌 <iostream>이라는 c++라이브러리에서 자세하게 정의되어있다. 

 - cout, << 는 해당소스파일에 없는 연산자와 함수라서

  위 소스파일을 컴파일 하면 cout, << 에 관한 코드는 기계어 변환을 못하고 참조표시만 해둔

  hello.obj 파일이 생성된다.

 - 링킹을 통해서,

  c++라이브러리 속 cout, <<에 관한 바이너리코드 와 obj 파일을 결합하여

  실행파일(.exe)를 생성한다.

19. C++ 프로그램의 확장자에 대한 설명 중 틀린 것은?

 ① 소스파일 확장자: .cpp .cxx .c++ 등 OS에 따라 다양. ≒ 컴파일러에 따라 다양

 ② Visual C++에서는 .c는 c 컴파일러가, .cpp는 c++ 컴파일러가 자동으로 컴파일한다.

* 비주얼 C++은 비주얼 스튜디오 안에 포함되어 있다. - 위키백과-

 ③ 목적 파일의 확장자는 .obj, .o 등 OS에 따라 다르다.

  실행파일은 OS에 관계없이 .exe (X)

p.35 ' Window에선 .exe, Unix에선 정해진 확장자 없이 개발자 마음대로 사용하면 된다. '

20. C++ Standard Library에 포함되지 않는 것?

└ 先 내 생각: C, C++표준입출력, STL, new

 ① C++ 통신 라이브러리

 ② C++ 입출력 라이브러리

 ③ STL 라이브러리

 ④ C 라이브러리

22. C++ 통합 개발 환경이란 무엇을 말하는가?

 IDE는 Integrated Development Environment의 약자이다.

 개발자는, IDE를 사용하여 4가지 프로그램이 통합되어있는 개발환경을 누릴 수 있다.

 IDE라는 하나의 프로그램으로 Editor, Compilor, Linker, Debugger을 모두 사용할 수 있다.

 원래 개발자는 프로그램을 개발 및 수정할 때, 위 프로그램을 모두 사용해야하는 번거로움이 있었다.

 - Editor를 통해 소스코드작성 (예: 메모장, VIM)

  → Compilor를 이용해 목적파일생성

   → Linker를 통해 실행파일생성

    → Debugger를 통해 검사와 소스코드 수정

* 번거로운지 안번거로운지 직접 몸으로 느껴보기를 바라는 우리 교수님덕분에..

  이 번거로움을 IDE라는 개발 프로그램으로 해결한 것이다.

  IDE는 개발자의 편의를 고려하여 개발효율을 향상시키는 것이 목적이기때문에

  주로 GUI(Graphic User Interface)형식이라 더 개발하기 편하다.

p51. 연습문제 - 실습문제

1.

2.

* 솔루션 안에 프로젝트 여러개 담고 한 플젝만 구동시키기: ' Set as Startup Project '

3.

기왕이면 retrun 0; 도

4.

~END~

반응형

블로그의 정보

노력하는 실버티어

노실언니

활동하기