본문 바로가기

Language

(105)
[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 ..
[C++] <random> 라이브러리 (난수 생성) C 스타일의 난수 생성의 문제점 아래는 C 스타일로 0부터 99까지의 난수를 생성하는 코드이다. #include #include #include int main(){ srand(time(NULL)); for(int i = 0; i < 5; i++){ print("난수 : %d \n", rand() % 100); } return 0; } 위 코드는 진짜 난수를 생성하는 것이 아니라 마치 난수처럼 보이는 의사 난수(pseudo random number)을 생성하는 코드이다. 첫 번째 수만 무작위로 정하고, 나머지 수들은 그 수를 기반으로 여러가지 수학적 방법을 통해서 난수처럼 보이지만 실제로는 무작위로 생성된 것이 아닌 수열들을 만들어내게 된다. 무작위로 정해진 첫 번째 수를 시드(seed)라고 부르는데, ..
[C++] <string> 라이브러리 C++에서 문자열을 다룰 수 있는 두 가지 방법 - C-string C언어에서 사용해오던 문자열로, '/0'으로 끝나는 char 타입의 배열을 취급하는 방법이다. char s[100]; scanf("%s", s); - string 클래스 C++ 표준 라이브러리에서 제공하는 클래스로 문자열의 끝에 '/0' 문자가 들어가지 않으며, 문자열의 크기를 동적으로 변경 가능하다. string str = ""; getline(cin, str); cout n; cin.ignore(); getline(cin, str); cin.ingore()가 입력 버퍼의 모든 내용을 제거해주어 getline()이 정상적으로 동작할 수 있다. string 클래스 생성 먼저 헤더 파일을 추가해주어야 한다. #include string을 ..