목록전체 글 (70)

생성자 멤버 초기화 리스트 (Constructor member initializer list) 생성자의 멤버들을 초기화할 때 사용하는 Initializer list에 대해서 설명드리겠다. Something이라는 클래스를 만들었다. int, double, char 타입의 세 가지 멤버를 가지고 있다. 초기화하는 방법은 이전 포스팅에서 여러 번 설명드렸다. public으로 Something의 constructor를 하나 만들고 초기화를 해줬다. 이때 initializer list라는 것은 조금 더 표현이 우아하다. 이렇게 해주면 된다. 물론 이렇게 Initializer list에서 초기화를 한 다음에 아래 { }에서 다시 값을 바꿔 줄 수 있다. 일단 잘 되나 보기위해서 print함수를 하나 만들었다. 실행..

생성자 (Constructor) 객체를 설계하다 보면클래스의 인스턴스들이 만들어지자마자 어떠한 속성을 가져야한다거나, 어떠한 기능을 수행해야 하는 경우가 있다. 이럴 때 생성자 constructor를 사용을 한다. 생성자는 해당 클래스의 객체가 인스턴스화 될 때 자동으로 호출되는 특수한 종류의 멤버 함수이다. 생성자는 일반적으로 클래스의 멤버 변수를 적절한 기본값 또는 사용자 제공 값으로 초기화하거나 클래스를 사용하는데 필요한 설정(ex. 파일열기 등)이 필요한 경우 사용된다. 일반적인 멤버 함수와 다르게 생성자 정의 방법에는 특정 규칙이 있다. 생성자 이름은 클래스와 이름이 같아야 한다. 생성자는 리턴 타입이 없다. (void도 아니다.) 생성자의 기본적인 사용법에 대해서 설명드리겠다. 분수를 나타내는..

캡슐화 , 접근 지정자 , 접근 함수 크고 뛰어나고 복잡한 기능을 가진 프로그램을 개발하려면 어쩔 수 없이 내용이 복잡해진다. 많은 variable, function, class 들을 정의해서 사용하게 된다. 복잡해 보이는 것들을 단순해 보이도록 깔끔하게 정리를 잘하고 각각의 모듈별로 조립, 분리를 잘하는 사람이 프로그래밍을 잘 한다고 생각하는 게 일반적인 추세이다. 최근 소프트웨어 프로그래밍 기법은 재활용을 강조하는 방식으로 가고 있고 오픈소스를 많이 사용하고 있다. 그래서 프로그래밍을 할 때 복잡한 것들을 캡슐로 싸서 정리를 하는 것처럼 캡슐화하는 것이 중요한 개념 중 하나이다. 이번 포스팅에서는 캡슐화 Encapsulation 개념에 대해서 접근 지정자, 접근 함수와 함께 설명 드리겠다. 먼저 st..

객체지향 프로그래밍과 클래스 객체지향 프로그래밍(Object Oriented Programming)을 줄여서 OOP라고 부른다. 객체지향 프로그래밍을 클래스와 함께 살펴보자. 예를 들어 친구들에 대해서 데이터를 정리 해놓고 원할 때 그 친구에 대해서 출력해주는 프로그램을 만든다고 생각해보자. 친구에 대해서 생각해보면 이런 것들이 떠오를 수 있다. 정리해보자면 이렇게 정리할 수 있다. 그리고 이 데이터들을 전부 출력해주는 함수를 만든다고 생각해보자. 이렇게 작성할 수 있다. 이때 우리가 더 많은 친구들에 대해서 데이터를 저장하려고 한다면 array나 동적할당배열 같은 것들을 써야 한다. 친구가 늘었다 줄었다 할 수도 있으니까 vector를 사용해보자. 이런 식으로 접근을 해야 할 것이다. 이 중에 데이터 ..

생략부호 (Ellipsis) 함수를 여러 가지 구현하다 보면 매개 변수 개수가 정해져 있지 않으면 좋겠다고 생각할 수 있다. 이때 생략부호 Ellipsis를 사용할 수 있다. findAverage라는 함수를 하나 구현했다. 먼저 파라미터로 들어올 argument들의 개수를 받아주고 그다음에 찍어주면 된다. va_list라는 것을 선언을 하나 해주었다.’ 마우스 가져다 대면 char *가 뜨는데 문자로 받는 것이다. va_start를 하는데 이때 list를 첫 번째 파라미터로 넣어주고 두 번째로는 count 여기로 들어오는 argument가 몇 개인지 개수를 알려줘야 된다. argument 개수가 들어와야 된다는 것 잊지 말기! 그다음에 실제로 값을 읽어 들일 때에는 va_arg라는 함수를 사용을 한다. ..

명령줄 인수 (Command line arguments) 프로그래밍할 때 매번 main() 하고 괄호를 친다. 저 괄호 안에 매개변수 넣는 방법을 보여드리겠다. OS가 main을 호출할 때는 파라미터를 여러 가지 넣어 줄 수 있다. C언어의 컴파일러가 운영체제가 그렇게 작동할 수 있도록 미리 약속을 해둔 것이다. int argc는 개수이고 char *argv[] 는 실제 내용들이다. 이걸 출력하는 루틴을 먼저 만들고 실행하는 것을 보여드리겠다. cout으로 받아온 것을 출력을 해준다. 일단 실행해보면 실행파일 이름이 뜬다. * 초보 때는 파일의 위치를 출력하는 것이 별 의미가 없다고 생각할 수 있다. 전체 파일 시스템에서 실행파일의 위치가 어디인지를 아는 것이 매우 중요하다. 예를 들어서 프로그램이 이미..

단언하기 (Assert) 프로그래밍 시간의 대부분은 사실 프로그래밍 그 자체보다는 디버깅에 소모가 많이 된다. 디버깅을 할 때도 컴파일러의 도움을 받을 수 있다면 훨씬 빠르게 디버깅할 수 있다. 여기서는 컴파일러 도움을 받을 때 사용하는 assert(단언하기)에 대해서 말씀드리겠다. How to use Assert 사용법은 간단하다. 를 include 해주고 assert라고 적어주고 그 안에 필요한 조건을 적는데 지금은 이 성질을 테스트하기 위해서 false를 적어보겠다. debug 모드에서 실행시켜보면 런타임 에러가 발생을 하고 더 좋은건 Assertion failed라고 어디서 오류가 났는지 까지도 알려준다. 그런데 이 assert의 특징은 release 모드로 바꾸면 작동을 안 한다. 아무 일도 없..

방어적 프로그래밍의 개념 (Defensive Programming) 많은 사람이 사용하는 소프트웨어를 개발할 때에는 사용자가 어떻게 사용을 하던지 정상적으로 작동하도록 만드는 것이 좋다. 방어적 프로그래밍에대한 간단한 개념을 살펴보자. syntax error 'syntax error' 라는 문법 에러가 있다. 예를 들어 int x 입력하고 세미콜론을 넣어줘야 하는데 까먹었을 때 요즘은 VS같은 id가 많이 좋아져서 미리 잡아주기도 하고, 컴파일을 하면 아주 잘 잡아준다. 그래서 컴파일러에게 좀 의존적으로 코딩하는 것도 나쁘지 않다. 오히려 오류가 있으면 컴파일러가 미리 잡아줄 수 있도록 코딩을 하는 게 좋다. semantic error 일반적으로 문법에러는 어느 정도 숙련이 되면 크게 걱정하지 않아도 된..