본문 바로가기

분류 전체보기

(370)
[C++] OOP 다형성 - 추상 클래스(abstract class) '추상'이란 단어의 뜻은 '구체성이 없어 뜻이 분명하지 않다'이다. 따라서 추상 클래스는 기능이 구체적으로 작성되지 않은 클래스라는 뜻으로 받아들일 수 있다. C++에서 추상 클래스는 하나 이상의 순수 가상 함수(pure virtual function)를 지닌 클래스를 말한다. 이런 추상 클래스를 이용하면 다형성을 가진 다양한 함수들을 정의할 수 있다. 제작하고자 하는 객체들이 반드시 지닌 기능을 추상 클래스의 순수 가상 함수로 작성해 놓으면, 해당 클래스를 이용하여 만든 자식 클래스에서는 이 가상 함수를 재정의하여 사용하면 된다. 즉, 추상 클래스는 객체를 생성하기 위한 목적의 클래스가 아니라 상속을 통해 다양한 클래스의 생성을 위한 인터페이스라고 생각하면 된다. (Java의 경우 상속을 extends..
[C++] OOP 다형성 - 가상 함수(virtual function) 가상 함수를 사용하게 되면 부모 클래스에서 선언한 함수가 자식 클래스에서 재정의 될 수 있다고 알려주게 되어 기본 클래스 타입의 포인터 또는 참조를 통해 자식 클래스의 객체를 참조하여 해당 객체에 대한 함수를 실행할 수 있게 된다. 가상 함수는 순수 가상 함수(pure virtual function)와 일반 가상 함수(virtual class)로 구분되어 사용된다. 일반 가상 함수(virtual function)는 부모 클래스에서 선언한 메소드를 자식 클래스에서 재정의해서 사용해도 된다는 가능성을 열어두는 것이다. 앞의 오버라이딩에서 했던 것처럼 부모 클래스에서도 함수의 기능이 정의되어 있고 필요하다면 기능을 확장하거나 변경하는데 virtual 키워드를 통해 포인터 타입이 아닌 참조하는 객체의 메서드를 ..
[C++] OOP 상속성 - 상속(Inheritance) 상속(inheritance) 상속이란 기존에 존재하는 클래스를 이용하여 해당 클래스의 속성이나 기능 즉 멤버 변수와 함수를 물려받아 그대로 사용하거나 기능을 개선 또는 확장하여 사용하는 것을 뜻한다. 새로운 클래스 B를 만드는데 클래스 A와 기본적인 부분은 유사하나 다른 기능 몇 개가 추가되고 기존 기능보다 좀 더 확장된 기능을 가진 클래스라면 A에서 기능을 물려받아 사용할 수 있게 하는 것이다. 이때 기존에 존재하는 클래스를 상위 클래스(super class) 또는 부모 클래스(parent class)라고 하며 상속을 통해 작성되는 클래스를 파생 클래스(derived class) 또는 자식 클래스(child class)라고 한다. class 자식클래스명 : 접근제어자 부모클래스명[, 접근제어자 부모클래..
[C++] OOP 캡슐화 - static, const 멤버 정적(static) 멤버 변수 일반적인 멤버 변수의 경우 인스턴스화를 거쳐 객체를 만들 경우 해당 클래스를 통해 만든 여러 객체마다 멤버 변수의 메모리가 각자 할당되어 서로 영향을 주지 않지만 static 멤버 변수의 경우 해당 클래스를 통해 만든 모든 객체가 동일한 메모리를 공유하기 때문에 어떤 객체에서 static 멤버 변수의 값을 변경한다면 다른 객체에서도 같이 변경된다. 즉, 클래스 내의 전역변수라고 생각하면 된다. class 클래스명{ static 변수타입 변수명; }; static 멤버 변수의 특징 선언은 클래스 내부에서 하지만 초기화는 생성자 등 클래스 내부에서 진행할 수 없고 파일 영역에서 진행한다. 전역 변수와 같이 프로그램 시작 시 생성되고 프로그램 종료 시 변수가 사라지므로 객체가 생..
[C++] OOP 캡슐화 - 프렌드(friend) 캡슐화는 공통의 속성이나 기능, 행동 등을 캡슐에 보관하는 것처럼 하나의 클래스로 묶는 것이다. 캡슐화에 속하는 개념인 정보은닉을 수행하기 위해 접근 제어자를 사용하여 외부에서 직접적인 접근이 불가능하고 해당 객체의 public 멤버함수를 통해서만 접근할 수 있다. 만약 private 멤버에 접근해야 하는 경우가 생겨 그때마다 매번 새로운 public 멤버 함수를 생성해 접근해야 한다면 굉장이 번거롭다. 이러한 경우를 대비해 friend라는 접근 제어 키워드를 제공한다. friend 키워드를 이용한 대상은 해당 객체에 private와 protected로 선언된 멤버에 접근할 수 있게 된다. friend 클래스명 or 함수명(필요시 매개 변수 목록); friend를 클래스나 함수에 사용할 때 정의에서는 사..
[C++] OOP - 생성자와 소멸자 생성자 생성자는 객체 생성 시 자동으로 호출되면서 객체를 초기화 해주는 함수이다. Date 클래스의 day 객체를 만들면 생성자 Day(int year, int month, int day)가 호출된다. 따라서 Date의 객체를 생성할 때 생성자의 인자 year, month, day에 각각 2011, 3, 1을 전달하며 객체를 생성하게 되는 것이다. Date day(2021, 7, 9); // 암시적 방법 (implicit) Date day = Date(2021, 7, 9); // 명시적 방법 (explicit) 함수를 호출하듯이 사용하는 것이 암시적 방법, 명시적으로 생성자를 호출한다는 것을 보여주는 것이 명시적 방법인데 많은 경우 암시적 방법으로 축약해서 쓸 수 있으므로 이를 선호하는 편이다. 디폴트 ..
[C++] OOP - this 포인터 this 포인터는 class의 특징 때문에 등장한 포인터이다. 동일 클래스를 이용해 여러 개의 인스턴스가 생성될 때 멤버 변수의 경우 각각 메모리를 할당받아 사용하지만 멤버 함수의 경우 메모리 공간을 공유하기 때문에 이를 구분하기 위해 사용한다. 예를 들어 Test라는 클래스가 존재하는데 test1, test2라는 두 개의 클래스를 생성했다고 하면 멤버변수 num은 test1, test2 각각 독립된 메모리를 할당받지만 멤버 함수 printNum은 메모리 주소를 공유하고 있기 때문에 printNum을 호출할 경우 어떤 객체에서 호출하였는지 알기 어렵다. 이러한 문제를 해결하기 위해 등장한 것이 this 포인터이다. this 포인터는 멤버 함수를 호출한 객체 자신을 가리키는 포인터가 된다. 멤버 함수가 호..
[C++] OOP - 클래스(class) 객체 지향 프로그래밍을 수행하게 되면 데이터와 기능을 유기적으로 연결하기 위해 클래스(class)를 사용하게 된다. 추상화를 통해 원하는 객체를 class 키워드를 통해 사용자 정의타입으로 생성하며 struct와 구조가 같다. 구조체와 다른 점은 접근제어자가 추가되었고 함수를 포함할 수 있게 된 점이다. 클래스 선언 class 클래스명 { 접근제어자: 멤버 변수1; 멤버 변수2; ... 멤버 함수1; ... } C++은 3가지 접근제어자를 제공한다. ① private (디폴트) 객체의 멤버를 외부에 공개하지 않고 직접적으로 접근할 수 없게 한다. 동일 클래스 내에 있는 멤버 또는 friend 함수만 접근 가능하기 때문에 필요 시 public으로 선언된 메소드를 이용하여 기능을 수행한다. ② public ..