TIL 2024/8/1

Sung Joo Lee·2024년 8월 1일

절차적 프로그래밍

  • 프로그램이 수행하는 일련의 작업을 기준으로 하는 프로그래밍 패러다임

  • 작업의 구현 = 함수 , 함수의 집합 = 프로그램

  • 데이터와 작업이 분리되어 있는 개념

  • 데이터는 작업의 실행을 위해 매개변수로 전달될 뿐

    • 우리가 함수를 모듈화 하여 필요한 부분에서 사용했던 것을 기억
  • 쉽게 말하면 위에서부터 아래로 진행되는 코드를 말한다.

절차적 프로그래밍의 단점

  • 함수가 데이터의 구조를 정확히 알아야만 함

    • 데이터가 변하면, 함수의 수정이 필요
      • int를 매개변수로 받게 했는데 double도 사용하고 싶을 때
    • Tightly coupled
      • 데이터가 변해도 함수를 사용할 수 있게 하는것이 좋은 함수
  • 프로그램의 규모가 커지면

    • 이해하기 어렵고, 유지/보수 및 코드의 재사용이 어렵다.

객체지향 프로그래밍

  • 절차적 프로그래밍의 단점을 극복하기 위한 방법

  • CPP, C# , Java 등에서 쉽게 구현할 수 있는 문법을 제공

    • 함수형 프로그래밍등 새로운 패러다임을 적용할 수 있도록 계속 확장 가능
  • 클래스객체를 기반으로 함

    • 데이터와 작업을 하나로 묶어서 표현

객체 지향 프로그램의 특징

  • 캡슐화

    • 객체는 (데이터 + 함수)로 구현
  • 정보 은닉

    • 사용자는 내부 구현에 대해 알 필요도 없고, 알아서도 안됨
      • 잘못된 사용 및 수정을 방지
    • 사용자는 외부로 노출된 인터페이스만 활용 가능
    • 테스트, 디버깅 , 유지보수 , 확장이 용이해짐
  • 상속

  • 다형성

  • 절차적 프로그램의 상위 호환이 아니다!

  • 예시

    #include <iostream>
    
    class Player
    {
    public:
    	int x, y;
    	int speed;
    
    	void Move(int dx, int dy) {
    
    		x += dx * speed;
    		y += dy * speed;
    
    	}
    
    };
    
    int main() {
    
    	Player player1;//클래스 기반 객체 생성
    	Player player2;//클래스 기반 객체 생성
    
    	player1.x = 10, player1.y = 10, player1.speed = 2;//
    	player1.Move(2, 3);
    
    	player2.x = 4, player2.y = 3, player2.speed = 4;
    	player2.Move(5, 3);
    
    	return 0;
    }
    

클래스

  • 객체가 생성되기 위한 틀

    • 객체가 가져야 할 데이터와 기능을 정의
    • 설계도, 도장을 예로 들 수 있다
    • 실제로 메모리에 어떻게 올라가야 하는지 알려주는 설계도
  • 사용자 정의 “자료형”

  • 멤버 변수를 가진다 (데이터)

    • Property, filed 라고도 한다.
  • 멤버 함수를 가짐 ( 함수 , 동작)

    • Method라고도 한다.
  • 데이터와 함수를 은닉 가능

  • 인터페이스 공개 가능

객체

  • 클래스로부터 생성된 객체

    • 메모리에 올라간 객체는 인스턴스로 구분하여 명명하는 경우도 있음
  • 객체는 개별적으로 관리되면, 원하는 만큼 생성 가능함

  • 객체를 통해 클래스에 정의된 멤버 함수를 호출 가능

  • 개념적인 예

    • “철수”는 학생이라는 클래스의 객체
    • “영희”도 학생이라는 클래스의 객체
    • 철수와 영희는 각각의 학과, 학번 , 키 , 몸무게, 나이 등의 멤버 변수(데이터)를 가지고 있음

클래스와 객체

  • 클래스는 자료형(int,double….) 처럼 사용함

  • 클래스는 새로운 데이터 타입을 만드는 것

  • 기본 형태

class Player
{
		//멤버 변수
	  std::string name;
	  int age;
	  int hp;
	  
	  ////////////////////////////////////
	  
	  //멤버 함수
	  void Talk(std::string text);
	  bool isDead();
};
  • 객체를 생성 할 때

위의 기본 형태를 기반으로 만들어 보겠다.

Player Lee;
Player Park;
Player* Joon = new Player(); // 동적 할당으로 객체생성 또한 가능

delete Joon;

클래스 멤버의 접근

  • 객체가 필요하다.
    • 단, static 변수는 다르다
  • “ . ” 연산자 사용
Lee.xp = 100;
Lee.name = "우주최강천하무적";
  • 객체의 포인터인 경우
  1. 역참조 후 점 연산자 사용
int main()
{
	//객체의 생성
	Account kimAccount;
	Account leeAccount;

	Account* parkAccount = new Account();

	std::cout << (*parkAccount).balance;
	(*parkAccount).Deposit(10000.0);

	return 0;

}

Account(); 라는 처음보는 표현이 나왔는데 이는 ‘생성자’라는 놈이다. 객체의 동적 할당시 선언해야 하며 생성자를 사용하여 Heap 공간에 클래스에 기반한 객체를 생성한다.

  1. 화살표 연산자 사용
  • ‘ → ’ 를 사용하여 객체내의 멤버들에 접근을 한다. 역 참조보다 더 간단하며 직관적이기 때문에 더 많이 사용한다.
int main()
{
	//객체의 생성
	Account kimAccount;
	Account leeAccount;

	Account* parkAccount = new Account();

	std::cout << parkAccount -> balance;
	parkAccount -> Deposit(10000.0);

	return 0;

}
profile
개발로그

0개의 댓글