가상함수

 

상속하는 클래스 내에서 오버라이딩 될 수 있는 함수입니다. 

부모 클래스에서 가상함수를 선언하면 자식 클래스에서 해당 함수는 가상함수가 됩니다.

 

 

오버라이딩이란

 다형성을 가진 클래스에서 상속받은 함수를 재정의하는 것을 의미합니다.

 기초 클래스 타입의 포인터나 참조로 실제 객체의 함수를 호출하여 함수의 다형성을 수행할 수 있게됩니다.

 

 

바인딩이란

 함수를 호출하는 코드에서 어느 블록에 있는 함수를 실행할지 해석하는 것을 의미합니다.

 

동적 바인딩이란

 런타임 시점에서 이루어지는 바인딩을 의미합니다.

 가상 함수가 기초 클래스 타입의 포인터나 참조를 통하여 호출될 때 동적 바인딩이 이루어집니다.

 

정적 바인딩이란

 컴파일 시점에서 이루어지는 바인딩을 의미합니다.

 일반적인 함수는 모드 이러한 정적 바인딩이 이루어집니다. 

 

가상함수 테이블이란

 가상 함수를 단 하나라도 가지는 클래스에 대해서 가상 함수 테이블이 작성됩니다. 

 가상 함수들의 주소가 저장되며, 동적 바인딩이 일어날 때 이 테이블의 주소로 함수가 호출됩니다. 

 

가상 소멸자

 소멸자에 virtual 키워드를 붙이는 것을 의미합니다. 

 

가상 소멸자를 사용하는 이유는 무엇인가?

 다형성을 가진 클래스에서 파생 클래스의 소멸자가 호출되지 않는 문제가 발생할 수 있습니다.

  기초 클래스 형으로 포인터나 참조자를 이용하기 때문에 소멸 시 기초 클래스 소멸자만 호출되기 때문입니다.

 이러한 문제로 인하여 메모리릭과 같은 문제가 발생할 수 있습니다.

 

 

 

추상 클래스

 하나 이상의 순수 가상함수를 멤버로 두어 인스턴스 생성이 불가능한 클래스입니다.

 

 

순수 가상함수

 파생 클래스에서 반드시 재정의해야하는 멤버 함수를 말합니다.

 순수 가상함수를 가지고 있는 클래스는 추상 클래스가 되는 특징이 있습니다.

'언어 > C++' 카테고리의 다른 글

질문형식 5. 클래스의 상속  (0) 2020.02.03
질문형식 4. Class 기본  (0) 2020.02.03
질문형식 3. C++ 함수  (0) 2020.02.03
질문형식 2.C와 C++ 비교  (0) 2020.02.03
질문형식1. 메모리 영역, exe 파일 생성과정  (0) 2020.02.03
블로그 이미지

연한그린커리

,

상속이란 무엇입니까

한 클래스가 다른 클래스로 자시느이 속성과 메서드 등을 물려주어 사용할 수 있도록 하는 것입니다.

 

상속을 사용하는 이유는 무엇입니까.

 공통되는 속성을 물려받기 위해 사용합니다.

 그리고 클래스를 계층적으로 구성할 수 있게 됩니다.

 

 

자식 클래스 생성 소멸 과정을 말하시오

 자식 클래스 inltializer list

 부모 클래스 initializer list

 부모 클래스 생성자 실행

 자식 클래스 생성자 실행

 자식 클래스 소멸자 실행

 부모 클래스 소멸자 실행

 

상속관계 중 is a 관계에 대해 말하시오 

 논리적인 상속을 표현하는데 사용됩니다. 

 이 상속은 클래스를 계층적으로 구성하는 특징을 더 활용하는 상속방법입니다.

 직업은 프로그래머이다 라는 예시처럼 기초 클래스로 갈수록 추상적이고 파생클래스로 갈수록 구체화 되는 특징을 보입니다.

 

상속관계 중 has a 관계에 대해 설명하시오

 포함되는 상속관계를 표현하는데 사용합니다. 

 이 상속은 상속의 물려주는 특성을 더 활용하는 상속방법입니다.

 경찰은 총을 가진다 라는 예시처럼 파생 클래스가 기초 클래스를 포함하는 특징이 돋보입니다.

 

 

다중 상속이란

 둘 이상의 클래스를 상소갛는 형태입니다. 

 둘 이상의 클래스의 내용을 모두 상속받고자 할 때 사용합니다.

 

다중 상속의 문제점

 모호성의 문제가 발생할 수 있습니다.

  상속받는 클래스에서 변수, 함수 이름이 겹쳐 오류가 날 수도 있습니다.

  같은 클래스를 두번 상속 받은ㄴ 형태가 만들어 질 수 있습니다. 

   이 문제를 해결하기 위해 상속 시 virtual 키워드를 붙여 상속합니다.

'언어 > C++' 카테고리의 다른 글

질문형식 6. 상속의 다형성  (0) 2020.02.03
질문형식 4. Class 기본  (0) 2020.02.03
질문형식 3. C++ 함수  (0) 2020.02.03
질문형식 2.C와 C++ 비교  (0) 2020.02.03
질문형식1. 메모리 영역, exe 파일 생성과정  (0) 2020.02.03
블로그 이미지

연한그린커리

,

C++에서의 구조체

 

 

구조체란 무엇입니까?

 

구조체는 연관 있는 데이터를 하나로 묶는 문법적 장치입니다.

연관 데이터를 하나의 사용자 정의 자료형으로 만들어 관리할 수 있게됩니다. 

C++에서는 class와 디폴트 접근제어 지시자가 다르다는 점 외에 큰 차이가 없으나, 구조체는 연관 데이터 관리, class는 객체로 사용합니다.

 

클래스란 무엇입니까?

 객체가 가지는 변수와 메소드를 정의하고 있는 추상적인 설계도 입니다.

  실제 사용하는 것이 아닌 객체를 선언할 때 사용되는 '틀' 개념이므로 추상적인 설계도라는 표현을 사용했습니다.

 

 

 

객체 생성 소멸 순서는?

 메모리 공간 할당 -> 초기화 리스트(생성자 호출) -> 생성자 실행 -> 소멸자 실행 -> 메모리 해제

 

 

클래스가 디폴트로 생성하는 것

 

생성자, 복사 생성자, 소멸자, 대입 연산자 입니다.

 

초기화 리스트(Initializer list)란 무엇입니까?

 생성자 호출과 동시에 멤버변수를 초기화해주는 구간입니다. 

 생성자 함수 이전에 실행되는 구간이며 객체 멤버변수를 선언과 동시에 초기화 할 수 있습니다.

 

멤버변수를 선언과 동시에 초기화하는 이유는 무엇입니까?

 성능 상 선언과 동시에 초기화하는 편이 효율적입니다. 

 반드시 생성과 동시에 초기화해야만 하는 const 변수, 참조자가 있습니다.

 

 

생성자란 무엇입니까?

 객체 생성 시 딱 한번 호출되는 함수라고 할 수 있습니다.

 따라서 객체를 생성하며 초기에 해야할 작업들을 수행할 수 있습니다.

 생성자를 정의하지 않으면 인자를 받지 않고 몸체가 비어있는 디폴트 생성자가 컴파일러에 의해 추가됩니다. 

 생성자도 함수의 일종이므로 오버로딩, 디폴트 매개변수 설정도 가능합니다. 

 그러나 반환형은 선언되지 않고 실제 반환도 하지 않습니다.

 

소멸자란 무엇입니까?

 객체 소멸시 자도응로 호출되는 함수라고 할 수 있습니다. 

 객체가 소멸하면서 처리해야할 작업을 수행할 수 있습니다.

 소멸자는 인자를 가지지 않으며 오버로딩 역시 불가능합니다. 

 소멸자를 정의하지 않으면 내용 없는 디폴트 소멸자가 컴파일러에 의해 자동으로 추가됩니다.

 

 

복사 생성자란 무엇입니까?

 객체를 복사했을 때 호출되는 생성자입니다. 

 같은 종류의 객체를 여럿 생성하는 경우 복사 생성자를 이용한다면 효과적입니다.

 복사 생성자를 정의하지 않으면 '얕은 복사'를 수행하는 디폴트 복사 생성자가 자동으로 컴파일러에 의해 추가됩니다.

복사 생성자의 문제점은 무엇입니까?

 

복사 생성자가 const 참조형을 사용하는 이유는 무엇입니까?

 const를 사용하는 이유는 복사를 담당하지 넘겨받은 인자 객체의 원본을 보호하기 위해서입니다.

  복사 생성자는 오로지 인자의 값을 복사하지 인자를 변경할 일은 없습니다.

 참조자를 사용하는 이유는 스택 오버 플로우가 발생하는 것을 방지하기 위해서입니다.

  call by value로 객체를 전달하면 자동으로 복사 생성자가 호출됩니다.

  복사 생성자가 실행되었더니 다시 복사 생성자가 호출되어 실행된 것입니다. 

  계속해서 복사생성자만 실행하는 루프를 타게 되므로 스택 오버 플로우가 발생하게 되는 것입니다.

 

 

 

복사 생성자를 호출하는 방법은 무엇입니까?

 인스턴스를 이용하여 새로운 객체를 초기화 하는 경우가 있습니다.

  객체를 선언하면서 인자로 인스턴스를 넘겨주는 형태

  객체를 선언하면서 인스턴스를 대입하는 형태 둘 다 가능합니다. 

 call by value 방식으로 함수 호출과정에서 객체를 인자로 전달한 경우,

 객체를 반환하되 참조형으로 반환하지 않는 경우에도 복사 생성자가 호출됩니다.

 

디폴트 복사 생성자의 문제점은 무엇입니까?

 객체가 내부적으로 메모리를 동적할당하는 경우, 얕은 복사가 이루어지므로 동일한 메모리를 여러 객체가 가리키는 상황이 발생하게 됩니다. 객체가 소멸하면서 이 메모리를 자동으로 해제하는 구조라면 두 번째 객체가 소멸할 때 이미 사라진 메모리에 접근하게 되는 문제가 발생하게 됩니다.

 

얕은 복사란 무엇입니까?

 객체를 초기화 할 때 모든 변수를 대입으로 초기화하는 복사를 의미합니다. 디폴트 복사 생성자는 얕은 복사 형태입니다.

깊은 복사란 무엇입니까?

 객체를 초기화 할 때 대입하되, 동적 할당하는 경우는 새로 동적할당하는 복사를 의미합니다.

 

 

대입 연산자란 무엇입니까?

 객체를 대입하는 연산자를 의미합니다. 

 대입 연산자를 정의하지 않으면 디폴트 대입 연산자가 자동으로 추가됩니다.

 디폴트 대입연산자는 '얕은 복사'처럼 모든 변수를 대입하기 때문에 문제점도 얕은 복사와 동일합니다.

 

 

 

this란 무엇입니까

 

사용된 객체 자신의 주소값을 정보로 담고 있는 포인터 입니다.

 

 

 

인스턴스란

 객체가 메모리에 실장되어 사용될 때 인스턴스라고 합니다.

 

객체란

 클래스를 대상으로 생성된 변수입니다.

 

멤버변수란

 클래스 내에 선언된 변수입니다.

 

멤버함수란

 클래스 내에 정의된 함수입니다.

 

 

 

 

객체 지향 프로그래밍 4대 속성 맞나? 클래스의 4대 속성이었나?

 

추상화

  객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법입니다.

 

캡슐화

 외부에 노출할 필요가 없는 정보들을 숨기는 것입니다.

 접근제어자를 이용하여 캡슐화를 표현할 수 있습니다. 

 객체의 은닉화를 가능하게 해줍니다.

 

상속성

 부모 클래스의 기능을 자식 클래스에게 물려주는 것입니다.

 is a나 has a 관계로 클래스의 구조를 만들어 상속을 구현할 수 있습니다. 

코드의 중복을 피할 수 있으며 클래스를 구조적으로 설계할 수 있게됩니다.

 

다형성

 같은 모양의 코드가 다른 행위를 하는 것이다.

 오버로딩과 오버라이딩을 통해 다형성을 구현할 수 있다.

 코드가 유연해질 수 있습니다.

  동일한 객체로 상속관계를 표현할 수 있고, 같은 함수로 여러 기능을 수행할 수 있습니다.

 또한 객체를 다양하게 사용할 수 있습니다.

  오버라이딩으로 해당 객체만의 기능을 부여할 수도 부모와 동일하게 사용할 수도 있습니다.

 

'언어 > C++' 카테고리의 다른 글

질문형식 6. 상속의 다형성  (0) 2020.02.03
질문형식 5. 클래스의 상속  (0) 2020.02.03
질문형식 3. C++ 함수  (0) 2020.02.03
질문형식 2.C와 C++ 비교  (0) 2020.02.03
질문형식1. 메모리 영역, exe 파일 생성과정  (0) 2020.02.03
블로그 이미지

연한그린커리

,

1. 함수 오버로딩

 

함수 오버로딩이란 무엇입니까?

 함수 이름과 전달 인자 정보를 동시에 참조하여 호출할 함수를 결정하는 기능입니다. 

  하나의 함수 이름으로 여러 기능을 정의할 수 있게 되므로 '함수의 다형'을 수행할 수 있습니다. 

 함수 오버로딩과 디폴트 매개변수를 함께 사용하면 모호성 오류가 발생할 수 있으므로 주의해야합니다.

 const 멤버함수의 경우 함수 오버로딩의 조건이 될 수 있습니다.

 

함수 오버로딩 vs 함수 오버라이딩

 

시점으로도 비교될 수 있겟다

 

2. 매개변수 디폴트 값

 

디폴트 매개변수란 무엇입니까?

 함수에 인자전달을 생략할 수 있는 기능입니다.

  함수 인자를 기본 값으로 넘겨주고 싶을 때 사용합니다. 

 디폴트 매개변수 지정은 가장 우측에 있는 매개변수부터 지정해줘야 합니다.

 

 

 

3. 참조자의 이해

 

참조자란 무엇입니까?

 기존에 선언된 변수에 붙이는 별칭이라고 할 수 있습니다. 

  참조자가 만들어지면 변수이름과 사실상 차이가 없게 됩니다. 

 변수에 대한 접근을 포인터보다 더 편리하게 하기 위해서 사용한다고 볼 수 있습니다. 

  포인터에 대한 연산자도 필요 없으며, 포인터 변수 메모리를 따로 할당할 필요 없이 사용 가능합니다. 

 

 

call by value

 함수 호출 시 넘기는 값을 복사하여 함수의 매개변수에 넣어 사용하는 방법입니다.

  복사되기 때문에 함수 호출부와 호출된 함수에서 사용되는 변수가 각각 다른 변수로 취급되는 특징이 있습니다.

  사본을 만들어내는 작업이므로 고비용 문제가 발생하며 특수한 경우 복사손실이 발생할 수 있습니다.

 

call by address

 함수 호출 시 메모리 주소값을 복사하여 함수의 매개변수에 넣어 사용하는 방법입니다.

  메모리 주소 값이 그대로 복사되었으므로 호출부와 호출된 함수의 변수는 동일한 메모리 주소를 가리키게 됩니다.

  따라서 호출된 함수에서 매개변수를 건든다면 원본값이 변경될 수 있는 문제가 발생하게 됩니다.

 

 

call by reference

 함수 호출 시 넘기는 값을 레퍼런스 매개변수로 받아 사용하는 방법입니다.

  참조하기 때문에 호출부와 호출된 함수의 변수는 동일하다고 볼 수 있습니다.

  따라서 호출된 함수에서 매개변수를 건든다면 원본값이 변경될 수 있는 문제가 발생하게 됩니다.

 

 

call by value vs call by reference

 함수 호출부의 변수와 호출된 함수의 매개변수 관계를 기준으로 둘을 구분할 수 있습니다.

  call by value는 복사가 이루어지므로 두 변수의 메모리공간이 달라 원본값을 변경할 수 없습니다.

   사본이 만들어지므로 고비용 문제가 발생하고 특수한 경우 복사 손실 문제를 가질 수 있습니다.

  반면 call by reference는 참조자 매개변수로 받으므로 두 변수는 사실상 동일하며 원본값 또한 변경 가능합니다.

   따라서 원본값이 변경되는 문제가 발생할 수 있습니다.

 

 

call by address vs call by reference

 함수의 인자를 전달하는 방법으로 둘을 구분할 수 있습니다.

  call by address는 변수의 주소를 보내고 전달받는 함수에서 포인터 형으로 받습니다. 

  call by reference는 변수를 보내고 받을 때 레퍼런스로 초기화하여 받습니다. 

 

 

복사손실(슬라이스)문제

 자식객체가 전부 복사되지 않고 부모객체 만큼만 복사되는 문제입니다.

 call by value 시 함수 호출부에 자식 객체를 넣고 인자로 부모 객체형으로 call by value 할 때 발생합니다.

 복사 생성자가 호출되면서 부모 객체를 새로 복사해서 만드므로 자식만 가진 내용은 손실되는 것입니다.

 

4. 인라인 함수

 

인라인 함수란 무엇입니까?

 매크로 함수의 장점은 취하고 단점은 보완한 함수입니다. 

  간단한 함수 기능을 빠르게, 그리고 매크로 함수의 단점 없이 사용할 수 있습니다. 

 inline 키워드로 사용하지만 인라인화에 대한 결정권은 컴파일러에게 있습니다.

  inline 선언을 하더라도 인라인화되지 않을 수 있으며,

  반대로 inline 선언하지 않더라도 컴파일러가 inline화 할 수 있습니다.

  기준은 컴파일러가 직접 치환하는 비용이 해당 함수를 호출하여 리턴받는 비용보다 작은지 큰지에 따릅니다.

 

 

 

매크로 함수란 무엇입니까?

 전처리기가 컴파일 이전에 치환하는 매크로 기능을 함수처럼 사용하는 것입니다.

 즉 함수 호출 없이, 간단한 함수 기능을 수행하기 위해 사용합니다.

 전처리기 과정에서 치환되는 것이므로 이에 따른 단점이 존재합니다.

  디버깅이 불가능합니다.

  자료형에 독립적입니다.

  연산자 우선순위의 영향으로 원하지 않는 결과가 나올 수 있으므로 소괄호 연산자를 사용해야 할 수 있습니다. 

 

인라인 함수 vs 매크로 함수

 치환하는 주체에 차이가 있습니다. 

  인라인 함수는 컴파일러에 의해, 매크로 함수는 전처리기에 의해 치환됩니다.

   따라서 전자는 디버깅이 가능하고 자료형에 독립적이지만 

   후자는 디버깅이 불가능하고 자료형에 독립적이지 않습니다.

 치환을 결정하는 주체에도 차이가 있습니다. 

  인라인 함수는 사용자가 inline 키워드를 사용하더라도 결정은 컴파일러가 합니다.

  매크로 함수는 사용자가 매크로 함수를 사용하면 무조건 치환되므로 결정권은 사용자에게 있습니다.

 

 

 

5. 연산자 오버로딩

 

연산자 오버로딩이란 무엇입니까? 

 하나의 연산자를 여러 의미로 사용할 수 있게하는 기능입니다. 

  함수 오버로딩의 개념을 연산자에 확장시킨 것입니다. 

 복잡한 함수 이름 대신 간단하게 연산자로 사용할 수 있다는 장점이 있습니다.

'언어 > C++' 카테고리의 다른 글

질문형식 6. 상속의 다형성  (0) 2020.02.03
질문형식 5. 클래스의 상속  (0) 2020.02.03
질문형식 4. Class 기본  (0) 2020.02.03
질문형식 2.C와 C++ 비교  (0) 2020.02.03
질문형식1. 메모리 영역, exe 파일 생성과정  (0) 2020.02.03
블로그 이미지

연한그린커리

,

1. C언어와 C++의 비교

 

객체지향 프로그래밍이란?

 객체를 만들고 그 객체들 간 상호작용을 통해 로직을 구성하는 프로그래밍 설계 방법론입니다.

 

모듈화란?

 분할된 시스템을 의미합니다. 프로그래밍에 적용한다면 프로그램의 기능 단위로 분할하는 것입니다.

 

객체 지향 프로그램이의 장점, 단점은?

 코드 재사용이 용이합니다. 

  객체를 가져와 사용할 수 있으며, 상속을 통해 확장도 가능합니다.

 유지보수가 수월합니다. 

  객체로 나눠져있으므로 객체 단위로 나누어 유지보수가 가능하기 때문입니다.

 대형 프로젝트에 적합합니다. 

  객체단위로 모듈화시켜 개발할 수 있기 때문입니다.

 절차지향 프로그래밍에 비해 느립니다.

  컴퓨터가 연산하는 방식인 절차지향을 따르는게 아닌 객체 단위로 로직이 구성되기 때문입니다.

 

절차지향 프로그래밍이란?

 프로그램의 절차에 중점을 둔 프로그래밍 설계 방법론입니다. 

 

절차지향 프로그래밍의 장점은?

 속도가 빠르다는 장점이 있습니다.

  컴퓨터가 연산하는 방식에 맞춰 코딩하는 방법이기 때문입니다.

 

new 연산자에 대해 설명하시오

 c++에서 메모리를 동적할당 하는 연산자입니다. 

 

malloc에 대해 설명하시오

 메모리를 동적할당하는 라이브러리 함수입니다. 

 

new와 malloc의 차이에 대해 말해보시오

 타입에서 차이가 있습니다. 

  malloc은 라이브러리 함수이고, new는 연산자입니다.

 사용 방식의 차이입니다. 

  malloc은 할당할 메모리 크기를 지정하고 void*로 반환합니다.

  new는 알아서 메모리 크기를 잡고 생성한 타입의 포인터를 리턴합니다. 또한 생성자를 자동으로 호출합니다. 

 재할당 가능여부에서 차이가 있습니다. 

  malloc은 realloc으로 크기를 바꿔 재할당이 가능하지만, new는 대응하는 기능이 없어 새로 할당해야합니다.

 

namespace에 대해 설명하시오

 정의된 객체에 대해 어느 소속인지 영역을 지정해주는 명령어입니다.  

 

왜 namespace를 사용하나요?

 객체의 이름이 같더라도 namespace가 다르면 다른 객체로 인식하게 됩니다. 따라서 이름에 대한 모호성이 사라지고 영역만 다르다면 동일한 이름의 객체를 사용할 수 있게됩니다.

 scope연산자로 소속을 명시한 후 해당 객체를 사용할 수 있습니다. 

 

 

const 키워드에 대해 설명하시오

 객체를 상수화 시키는 키워드입니다.  읽기전용 객체를 만들 때 사용할 수 있습니다.

 변수, 멤버함수, 객체를 상수화시킬 수 있습니다.

 

 

const 변수에 대해 설명하시오

 const 키워드에 의해 상수화된 변수입니다.

 자료형 앞쪽에 위치하여 데이터 변수를 상수화 시킬수도, 

 포인터 연산자 앞에 위치하여 포인터 변수를 상수화 시킬 수 있습니니다.

 

 

const 멤버함수에 대해 설명하시오

 멤버변수의 값을 바꿀 수 없는 읽기전용 함수 입니다. 

 이 함수는 const 외 다른 함수를 호출 할 수 없습니다.

  다른 함수를 호출하게 된다면 멤버변수의 값을 간접적으로 변경할 수 있으므로 미리 차단한 것입니다.

 또한 const 키워드로 함수 오버로딩이 가능합니다. 

  일반 객체는 일반 함수를 호출, const 객체는 const 함수를 호출하는 오버로딩입니다.

 mutable 키워드가 붙은 멤버변수라면 예외적으로 이 함수에서 값 변경이 가능합니다.

  mutable은 상수화를 제거할 수 있는 기능을 가지고 있기 때문입니다.

 

const 객체에 대해 설명하시오

 읽기 전용으로 선언된 객체입니다. 

  초기화된 값 이외에 다른 값으로 변경이 불가능한 객체입니다.

 const 멤버함수와 일반함수를 오버로딩해서 사용할 때 const 멤버함수를 호출하는 객체입니다.

 

 

friend 키워드에 대해 설명하시오

 다른 클래스 멤버에 대한 접근 권한을 자유롭게 해주는 키워드입니다.

  특정한 멤버가 예외적으로 다른 클래스나 함수에 접근할 수 있도록 하기 위해 사용합니다. 

  정보은닉에 반하는 키워드이므로 매우 제한적으로 사용해야하는 주의점이 있습니다.

 

 

static 변수

 지역변수와 전역변수의 특징을 동시에 가지는 변수입니다. 

  지역적인 특색을 가지고 있어 다른 외부함수에 접근할 수없습니다. 

  전역적인 특색을 가지고 있어 

   데이터 영역에 저장되며 초기화를 하지 않으면 0초기화되며 프로그램이 종료될 때 메모리가 소멸됩니다.

  정적변수만의 특색으로 해당 변수가 있는 함수가 처음 실행될 때만 선언됩니다.

 

static 멤버변수

 객체 별로 존재하는게 아닌 프로그램 전체 영역에서 하나만 존재하는 함수입니다.

  따라서 클래스의 모든 객체들이 공유하는 변수입니ㅏㄷ. 

  또한 객체에 속한 것이 아니므로 인스턴스를 생성하지 않고도 클래스 이름만으로 해당 변수에 접근할 수 있습니다.

 

static 멤버함수

 객체 별로 존재하는게 아닌 프로그램 전체 영역에서 하나만 존재하는 함수입니다.

  따라서 클래스의 모든 객체들이 공유하는 함수입니다. 

  또한 객체에 속한 것이 아니므로 인스턴스를 생성하지 않고도 클래스 이름만으로 해당 함수에 접근할 수 있습니다. 

 static 함수, static 멤버변수에만 접근이 가능합니다. 

  인스턴스를 생성하지 않고 접근하므로 일반 함수 혹은 변수에 접근한다면 없는 메모리에 접근하는 행위가 됩니다.

 

 

 

지역변수에 대해 설명하시오

 함수 내부에서 정의된 변수입니다. 

 접근 가능 범위는 자신이 속한 함수 내부입니다.

 생성 및 소멸은 호출된 시점부터 자신이 속한 함수가 종료되는 시점까지 입니다.

 메모리 영역 중 Stack 영역에 할당됩니다.

 

전역변수에 대해 설명하시오

 함수 외부에 선언되는 변수입니다. 

 접근 가능 범위는 선언된 이후 파일 내 모든 함수에서 접근이 가능합니다.

 생성 및 소멸은 프로그램이 시작될 때 생성되고, 종료될 때 소멸합니다.

 메모리 영역 중 Data 영역에 할당됩니다. 그리고 초기화하지 않으면 자동으로 0 초기화 되는 특징이 있습니다.

 

 

extern 키워드에 대해 설명하시오

 외부 파일에서 참조하는 전역 변수의 존재유무를 알려주는 키워드입니다.

  전역변수를 오로지 해당 파일에서만 찾는 컴파일러의 특징 때문에 외부 파일에서 전역변수를 사용하려면 이 키워드를 이용하여 존재유무를 알려줘야할 필요가 있습니다.

 실제 연동은 링킹 단계에서 이루어집니다.

 

형변환이란 무엇입니까

 자료형을 다른 자료형으로 변환하는 작업을 의미합니다.

 

형변환을 하는 목적은 무엇입니까

 사용자의 편의를 위해 자료형을 변환하는 것입니다. 

 C++에서는 다형성을 위해서도 형변환이 이루어집니다.

  상속관계인 클래스의 기초 포인터 혹은 레퍼런스를 파생 자료형으로 변환하는 예시가 있습니다.

 

묵시적 형변환이란 무엇입니까

 형변환 연산자 없이 컴파일러가 자동으로 처리하는 형변환입니다.

 

암시적 형변환이란 무엇입니까

 사용자가 형변환 연산자로 직접 명시하는 형변환입니다.

 

c style 형변환 대신 c++ style 형변환을 사용하는 이유는 무엇입니까?

 C style 형변환이 가지는 단점 때문입니다.

 첫째는 단점은 C style형변환은 안전성에 문제가 있다는 점입니다.

   상속 관계에서 형변환 하는 경우 제한이 없기 때문에 다운 캐스팅에 의한 오류가 발생할 수 있습니다.

   기본 자료형의 포인터형끼리 변환하는 경우 제한이 없기 때문에 오류가 발생할 수 있습니다.

 두번째는 단점은 가독성이 떨어진다는 단점입니다.

   괄호 안에 타입을 넣는 방식으로 변환하므로 괄호가 많아진다면 읽기 불편수 있습니다.

   게다가 함수 연산자와 구별이 어려워질 수 있수도 있습니다.

 

 

 

dynamic_cast에 대해 설명하시오

 다형성을 가진 클래스를 안전하게 형변환할 때 사용합니다.

  기본적으로 업 캐스팅만 허용하며, 하나 이상의 가상함수를 가진 다형성 클래스에서만 다운 캐스팅을 허용합니다. 

  또한 형변환에 오류가 있을 시 포인터라면 null, 참조자라면 bad_cast를 반환합니다. 

  캐스팅되는 시점은 런타임 중 일어납니다.

 

static_cast에 대해 설명하시오

 기본 자료형을 형변환하는 경우 C style보다 안전합니다.

  C style로 기본 자료형의 주소 형변환 시 나타나는 문제점이 static_cast에는 없기 때문입니다. 

 다형성을 가진 클래스를 형변환 할 때 사용 가능하지만 이 경우는 안전성이 떨어집니다.

  그러나 업, 다운 캐스팅을 구분하지 않고 캐스팅하기 때문입니다.

 캐스팅되는 시점은 컴파일 중 일어납니다.

 

 

const_cast에 대해 설명하시오

 객체의 상수성을 없애는 캐스팅입니다.

 

reinterpret_cast 에 대해 설명하시오

 특정 자료형 포인터를 무조건 다른 자료형 포인터로 변환하는 캐스팅입니다.

 

 

c style 형변환 vs static_cast

 C style이 가진 단점을 static_cast가 보완했다고 할 수 있습니다.

  기본 자료형의 포인터를 형변환 할 때 c style에서는 포인터가 가리키는 자료형을 상관하지 않고 변환합니다. 

   따라서 이 포인터에 있는 값에 접근할 때 오류가 발생할 수 있는 문제가 있습니다. 

  자료형 변수가 const 선언이 된 경우에도 포인터 형으로 형변환 하여 포인터 연산자로 접근하는 경우 const를 무시하는 문제도 존재합니다.

  static_cast는 이러한 경우를 허용하지 않습니다.

 C style 형변환이 괄호를 사용하기 때문에 함수 연산자와 헷갈릴 수 있는 문제도 있습니다. 

  static_cast에서는 이러한 가독성 문제가 발생하지 않습니다. 

 

 

static_cast vs dynamic_cast

형변환을 검사하는 시점에서 차이가 있습니다. 

 static_cast는 컴파일 시점에서 형변환에 대한 검사를 진행하지만, dynamic_cast는 런타임 시점에서 진행됩니다.

기본 자료형에 대한 형변환 가능 여부로도 갈라집니다.

  static_cast는 기본 자료형에 대한 안전한 형변환을 수행할 수 있으나, dynamic_cast는 형변환 자체가 불가능합니다.

 다형성을 가진 클래스를 캐스팅할 때 안전성에 차이도 존재합니다.

  static_cast는 업, 다운 캐스팅을 모두 허용하므로 불안전합니다.

  dynamic_cast는 기본적으로 업 캐스팅만 허용, 예외적인 경우에만 다운 캐스팅을 허용하고 실패시 null이나 bad_cast를 반환하므로 안전합니다.

 

 

up casting이 무엇인지 말하시오

 다형성을 가진 클래스에서 객체를 가리키는 포인터가 자식에서 부모 방향으로 캐스팅 되는 형태이다. 

 

down casting이 무엇인지 말하시오

 다형성을 가진 클래스에서 객체를 가리키는 포인터가 부모에서 자식 방향으로 캐스팅 되는 형태이다.

 

cross_casting(교차 캐스팅)이 무엇인지 말하시오

 다중 상속된 한 객체를 가리키는 부모 포인터를 또 다른 부모 포인터 타입으로 변환하는 캐스팅이다.

 

'언어 > C++' 카테고리의 다른 글

질문형식 6. 상속의 다형성  (0) 2020.02.03
질문형식 5. 클래스의 상속  (0) 2020.02.03
질문형식 4. Class 기본  (0) 2020.02.03
질문형식 3. C++ 함수  (0) 2020.02.03
질문형식1. 메모리 영역, exe 파일 생성과정  (0) 2020.02.03
블로그 이미지

연한그린커리

,

1. 메모리 영역

 

메모리 영역 중 Stack 에 대해 설명하시오

 프로그램에서 사용되는 임시 메모리 영역입니다. 

 유효기간 함수의 시작부터 종료되는 순간까지 입니다.

 메모리 영역 중 가장 끝부분부터 메모리를 할당하기 때문에 메모리가 늘어날 수록 주소는 낮아진다 특징이 있습니다.

 지역변수, 매개변수, 리턴 값 등이 이 영역을 사용합니다.

 

메모리 영역 중 Heap 에 대해 설명하시오

 프로그래머가 관리하는 메모리 영역입니다.

 유효기간 사용자가 원할 때 할당되고 소멸됩니다.

 동적할당되는 메모리가 이 영역을 사용합니다.

 

메모리 영역 중 Data 에 대해 설명하시오

 프로그램이 실행되는 내내 유지되는 데이터를 저장하는 메모리 영역입니다.

 유효기간 프로그램이 시작되는 순간부터 종료되는 순간까지 입니다.

 전역변수, 정적변수가 이 영역을 사용합니다.

 

메모리 영역 중 Code 에 대해 설명하시오

 코드 자체를 구성하는 메모리 영역입니다. 

 유효기간 프로그램이 시작되는 순간부터 종료되는 순간까지 입니다.

 함수, 제어문, 키워드 등이 이 영역을 사용합니다.

 

 

2. exe 파일 생성과정

 

프로그램 실행 파일을 생성하는 순서를 말하시오

 코드 -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링킹 -> exe파일 생성 입니다.

 

코드 단계에 대해 설명하시오

 프로그래머가 고급언어를 이용하여 코드를 작성하는 단계입니다. 

 

고급언어란 무엇입니까

 사람이 이해할 수 있도록 만든 언어, C언어, C++언어 등을 말합니다. 

 

전처리기 단계에 대해 설명하시오

 컴파일링 이전에 실행되는 단계로 컴파일러가 작업하기 좋도록 소스를 재구성해주는 단계입니다.

 include, define 등의 명령이 전처리기 단계에 해당됩니다.

 

컴파일링 단계에 대해 설명하시오

 컴파일러가 고급언어에서 저급언어로 번역하는 단계입니다. 

 

저급언어란 무엇입니까

 앞서 언급한 고급언어와 기계어 사이에 위치하는 언어입니다. 

 

어셈블링 단계에 대해 설명하시오

 어셈블러가 저급언어에서 기계어로 번역하는 단계입니다. 

 

기계어란 무엇입니까

 컴퓨터가 이해할 수 있는 언어, 이진수처럼 불 꺼짐과 들어옴 두 가지로 구성된 언어입니다.

 

링킹 단계에 대해 설명하시오

 obj 파일, 시동코드, 라이브러리를 연결하는 단계입니다.

 

obj 파일이란? 

 프로그래머가 작성한 소스코드를 말합니다.

 

시동코드?

 프로그램, 운영체제 사이의 인터페이스 역할을 수행하는 코드입니다.

 운영체제마다 프로그램을 처리하는 방식이 다리기 때문에 이를 중재하는 역할을 수행합니다.

 

라이브러리 코드?

 사용할 명렁어들에 대한 대한 정의가 있는 코드입니다.  

 전처리기 단계에서 사용할 라이브러리를 포함시킨 후 소스 코드에서 이 명령어들을 사용합니다.

 

exe 파일 생성 단계에 대해 설명하시오

 링킹으로 묵여진 파일을 exe파일이라고 합니다. 프로그램을 실행시키는 파일입니다.

 

'언어 > C++' 카테고리의 다른 글

질문형식 6. 상속의 다형성  (0) 2020.02.03
질문형식 5. 클래스의 상속  (0) 2020.02.03
질문형식 4. Class 기본  (0) 2020.02.03
질문형식 3. C++ 함수  (0) 2020.02.03
질문형식 2.C와 C++ 비교  (0) 2020.02.03
블로그 이미지

연한그린커리

,