C++ OOP, 입출력, 변수

이영준·2022년 3월 26일
0

C++ 기본문법

목록 보기
2/10
post-thumbnail

🔑Object-Oriented Programming

•객체 지향 프로그래밍(OOP)은 데이터 필드(개체를 설명하는 속성)와 관련 프로시저를 가진 "개체"의 개념을 나타내는 프로그래밍 패러다임이다. 일반적으로 클래스의 인스턴스인 개체는 응용 프로그램 및 컴퓨터 프로그램을 설계하기 위해 서로 상호 작용하기 위해 사용된다.
• C++, Objective-C, Smalltalk, Delphi, Java, Javascript, C#, Perl, Python, Ruby 및 PHP는 객체 지향 프로그래밍 언어의 예이다.

🔑OOP의 3가지 특성

  1. Encapsulation (캡슐화)
  2. Polymorphism (다형성)
  3. Inheritance (상속성)

1. 캡슐화

데이터와 기능을 하나의 컴포넌트로 패킹하여 데이터와 기능을 선택적으로 숨길 수 있음

클래스의 private, public으로 메서드나 변수의 접근을 제어하는 개념

2. 다형성

서로 다른 유형의 엔티티에 대한 단일 인터페이스 제공하며 다형성을 함수와 연산자 모두에 적용할 수 있다.

함수, 연산자를 오버로딩 하는 개념!

3. 상속성

•상속을 통해 프로그래머는 다른 클래스의 관점에서 클래스를 정의할 수 있으므로 응용 프로그램을 쉽게 만들고 유지할 수 있다.
• 상속을 통해 코드 기능을 재사용하고 구현 시간을 단축할 수 있다.

🔑표준입출력 cout, cin

cout

"<<" 삽입 연산자를 통해 c 언어의 printf문을 대체하여 사용
삽입 연산자를 여러번 사용하여 문자열과 숫자를 연결지어 출력하는 것도 가능

endl을 사용하여 linebreak, 다음줄로 넘어가도록 할 수 있음

#include <iostream>

using namespace std;

int main() {
	cout << "First Sentence" << endl;
  cout << "Second Sentence. \nThird sentence." << endl;
}

결과:
First Sentence.
Second Sentence.
Third sentence.

참고로 endl의 경우 flush() 함수를 겸하기 때문에 실행마다 출력 버퍼를 지워주는 과정(flush)이 생겨 "\n" 보다 속도가 느리므로 "\n"을 사용하는 편을 습관화하는 것이 좋을 듯 하다.

cin

">>" 추출 연산자를 통해 선언된 변수의 입력을 받을 수 있다
역시 여러 연산자를 연결해서 사용도 가능하며 공백이나 개행으로 값을 받는다.

#include <iostream>

using namespace std;

int main() {
	int i;
	char c;
	cin >> i >> c; 
}

결과:
입력: i a
출력: ia

입출력 Quiz

#include <iostream>

using namespace std;

int main() {
	cout << "Enter age, grade, and name:" << endl;
	int age;
	float grade;
	char name[10];
	
	cin >> age >> grade >> name;
	cout << "Age= " << age << ", Grade= " << grade << ", Name = " << name << endl;

}

🔑변수

메모리의 특정 부분을 확보한 공간. 프로그램이 실행되는 동안 이 공간 안에서 내용물을 변경할 수 있어서 변수라고 한다.

  • 변수의 생명 주기(또는 범위) =변수가 생성되고 소멸될 때까지의 시간
  • 변수의 사용 가능한 범위 = 블록에 정의된 변수는 블록 내에서만 액세스

ex) Scope of Variables

#include <iostream>

using namespace std;

int main() {
	int var = 1;
	{
		char var = 'a';
		{
			cout << "var = " << var << '\n';
		}
		cout << "var = " << var << '\n';
	}
	cout << "var = " << var << '\n';
}

결과:
var = a
var = a
var = 1

가장 안쪽의 var은 블록 내에 변수선언이 없으므로 바로 바깥쪽의 변수 가져옴,
나머지는 블록의 변수 선언을 참조하여 출력함

지역변수, 전역변수

선언 위치local, global
저장 위치auto, static, register

local variable : main 함수 및 사용자 지정 함수에서 선언된 변수, 즉 블록 안에서만 정의되는 변수

  • 중괄호로 둘러싸인 영역임
  • 자동으로 0으로 초기화 되지 않음 (초기화 안하면 garbage value가 들어감)
  • stack에 저장

함수의 매개변수 : 함수의 헤더 부분에 정의되어 있는 변수

  • 일종의 지역변수로 지역변수가 지니는 모든 특징을 가짐
  • 함수를 호출할 때 넣어주는 인자값으로 초기화가 됨
  • stack에 저장

gloabl variable

  • data영역에 저장

static variable : static 키웢드를 붙여서 지역변수를 정적 변수로 만듦

  • 블록에서만 사용되지만 블록을 벗어나도 자동으로 제거 x
  • 프로그램이 시작할 때 메모리에 생성되고 프로그램 실행 종료시 메모리에서 제거됨
  • data영역에 저장

ex)

#include <iostream>
using namespace std;

void sub(void) {
	int i=0;
    static int s = 0;
    i++;
    s++;
    cout << "(" << i << "," << s << ")" << endl;
 }
 
 int main(){
 sub(); // 1,1
 sub(): // 1,2
 sub(); //1,3
}

🔑상수

값을 변경할 수 없는 저장소 엔티티.

  • 값이 언제나 고정적
  • const라는 한정자와 이름을 지정한 뒤, 할당 연산자를 입력하고 저장할 값을 저장한다.
const double PI = 3.141593 // 상수 선언

🔑구조체

  • 변수 하나의 이름 밑의 블록에 변수 목록을 선언하는 복잡한 데이터 형식 선언이다.
  • 몇몇 변수는 포인터 혹은 변수명을 통해 액세스 할 수 있다.
  • 기본적으로 구조체는 public이다.
#include <iostream>

using namespace std;

struct Student {
	int id;
	float grade;
	int gender;
};

int main() {
	struct Student st;
	cout << "학번을 입력하세요\t";
	cin >> st.id;

	cout << "성적을 입력하세요\t";
	cin >> st.grade;

	cout << "성별을 입력하세요(남자:1, 여자:2)\t";
	cin >> st.gender;

	cout << "\n\n";
	cout << "입력하신 학생의\n";
	cout << "학번은 " << st.id << "\n" ;

	cout.setf(ios::showpoint);
	cout.precision(2);

	cout << "성적은" << (float)st.grade << "\n";
	cout << "성별은" << (st.gender == 1 ? "남자" : "여자") << "\n";
	cout << "입니다\n";

}

결과:
학번을 입력하세요 2017312365
성적을 입력하세요 4.5
성별을 입력하세요(남자:1, 여자:2) 1

입력하신 학생의
학번은 2017312365
성적은4.5
성별은남자
입니다

cout.setf(ios::showpoint): 소숫점 표시(.), 생략된 0 들을 모두 출력 (기본 6자리)
cout.precision(2): 2자리 까지 표시 ex)45.5 넣으면 46. 과 같이 표시

구조체 Quiz

#include <iostream>

using namespace std;

struct Drink {
	int Sprite = 10;
	int Coke = 10;
};

struct Food {
	int Rice = 10;
	int Pizza = 10;
};

int main() {
	Drink drk;
	Food fd;

	while (1) {
		int answer = -1;
		cout << "Order (0: Drink, 1: Food, 2: Quit) : ";
		cin >> answer;

		if (answer == 0) {
			int drinkAnswer = -1;
			cout << "Drink(0: Coke, 1 : Sprite) : ";
			cin >> drinkAnswer;
			if (drinkAnswer == 0) {
				drk.Coke--;
			}
			else
				drk.Sprite--;
		}

		else if (answer == 1) {
			int foodAnswer = -1;
			cout << "Food(0: Rice, 1 : Pizza) : ";
			cin >> foodAnswer;
			if (foodAnswer == 0) {
				fd.Rice--;
			}
			else
				fd.Pizza--;
		}

		else if(answer ==2){
			break;
		}

		cout << "Remaining: Coke = " << drk.Coke << ", Sprite = " 
        << drk.Sprite << ", RIce = " << fd.Rice << ",Pizza = " << fd.Pizza << "\n";

	}
}

🔑Namespace

Namespace는 고유한 변수이름 공간을 설정하기 위해 만든다. 즉, 같은 이름을 가진 변수나 함수, 클래스 등을 독립적으로 가질 수 있는 공간이다.

• 네임스페이스는 변수 및 함수와 같은 식별자 집합을 위한 컨테이너, 구조체도 넣을 수 있음.
• 네임스페이스를 통해 동일한 이름의 식별자를 구분할 수 있다.
• 특정 네임스페이스의 변수 및 함수는 '::' 연산자를 사용하여 액세스할 수 있다.
혹은 using namespace std와 같이 네임스페이스 선언을 해줘야 함

#include <iostream>
using namespace std;

namespace AA{ 
	char test = 'A';
	void func(char c) {
		cout << "Inside AA, Input: " << c << endl;
	} 
} 

namespace BB {
	char test = 'B';
	void func(char c) {
		cout << "Inside BB, Input: " << c << endl;
	}
} void main() { 
	AA::func(AA::test);
	AA::func(BB::test);
	BB::func(AA::test);
	BB::func(BB::test);
}

세상에는 많은 영준이가 있으나 이씨 가문의 영준이를 불러오고 싶을 때 네임스페이스를 사용하는 걸로 생각하면 됨(같은 이름의 함수명, 변수명을 네임스페이스에 따라 다르게 정의가 가능)

🔑묵시적 형변환, 명시적 형변환

묵시적 형변환:
•컴파일러에 의한 자동 형 변환
• 혼합형 표현식에서는 프로그램이 올바르게 실행되도록 실행 시 필요에 따라 하나 이상의 서브타입 데이터를 슈퍼타입으로 변환할 수 있다.

명시적 형변환
•프로그램 내에서 명시해주는 형변환
•여러가지 방식의 명시적 형변환이 있음

결과 :
Weight percent = 0
Real Weight percent = 75

   cout << (30/40) * 100 << endl;
   cout << (float)(30/40) * 100 << endl;
   cout << (float) 30 / 40 * 100;

0
0
75

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글