object oriented programming

ν”„λ‘œκ·Έλž˜λ°μ„ λ°°μš°λ©΄μ„œ '객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°' μ΄λž€ 말을 정말 많이 λ“€μ—ˆλ‹€. μ—¬μ „νžˆ μ–΄λ €μš΄ κ°œλ…μ΄μ§€λ§Œ ν•΄λ‹Ή 글을 읽고 μ‘°κΈˆμ€ 이해 ν•  수 μžˆμ—ˆλ‹€. 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ λ‚˜μ˜¨ 흐름과 μ™œ μ€‘μš”ν•œμ§€ μ‰½κ²Œ μ„€λͺ…ν•΄μ£ΌλŠ” κΈ€μ΄λ‹ˆ ν•œλ²ˆ μ½μ–΄λ³΄λŠ”κ±Έ μΆ”μ²œν•œλ‹€.

πŸ‘‰ μΆ”μ²œκΈ€ | 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

κ·Έλ ‡λ‹€λ©΄ 클린 μ•„ν‚€ν…μ²˜μ— μ„€λͺ…λœ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•΄ 정리λ₯Ό ν•΄λ³΄μž.

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μš”μ†Œ

μΊ‘μŠν™”(Encapsulation) μΊ‘μŠν™”λŠ” 객체의 일뢀 ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 κ΅¬λΆ„ν•˜λŠ” 것을 λ§ν•œλ‹€. 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œλŠ” μΊ‘μŠν™” κ°œλ…μ„ 클래슀의 private 멀버 데이터와와 public 멀버 ν•¨μˆ˜λ‘œ ν‘œν˜„ν•œλ‹€.

κ°„λ‹¨ν•œ C μ–Έμ–΄ 예제

// point.h
struct Point;
struct Point* makePoint(double x, double y);
double distance (struct Point *p1, struct Point *p2);
#include "point.h"
#include <stdlib.h>
#include <math.h>

struct Point {
    double x, y;
};

struct Point* makepoint(double x, double y) {
    strict Point* p = malloc(sizeof(struct Point));
    p->x = x;
    p->y = y;
    return p;
}

double distance(struct Point* p1, struct Point* p2) {
    double dx = p1->x - p2->x;
    double dy = p1->y - p2->y;
    return sqrt(dx*dx+dy*dy);
}

C++ μ»΄νŒŒμΌλŸ¬λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€ 크기λ₯Ό μ•Œ 수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

// point.h
class Point {
public:
    Point(double x, double y);
    double distance(const Point& p) const;

private:
    double x;
    double y;
};

// point.cc
#include "point.h"
#include <math.h>

Point::Point(double x, double y) : x(x), y(y) {}

double Point::distance(const Point& p) const {
    double dx = x-p.x;
    double dy = y-p.y;
    return sqrt(dx*dx + dy*dy)
}

C++ μ½”λ“œμ—μ„œλŠ” point.h 헀더 νŒŒμΌμ„ μ‚¬μš©ν•˜λŠ” μΈ‘μ—μ„œ 멀버 λ³€μˆ˜ x, yλ₯Ό μ•Œκ²Œ λœλ‹€. 멀버 λ³€μˆ˜ 이름이 λ°”λ€Œλ©΄ μ‚¬μš©ν•˜λŠ” μΈ‘μ—μ„œλ„ λ³€κ²½ν•΄μ•Ό ν•œλ‹€. μ΄λŠ” μΊ‘μŠν™”κ°€ κΉ¨μ§„ 것이닀. λ§Žμ€ 객체 μ§€ν–₯ μ–Έμ–΄κ°€ μΊ‘μŠν™”λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.

상속(Inheritance) 상속은 λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ˜ 유효 λ²”μœ„λ‘œ λ¬Άμ–΄μ„œ μž¬μ •μ˜ ν•˜λŠ” 것을 λ§ν•œλ‹€.

namedPoint.h

// namedPoint.h
struct NamedPoint;

struct NamedPoint* makeNamedPoint(double x, double y, const char* name);
void setName(struct NamedPoint* np, const char* name);
char* getName(struct NamedPoint* np);

// namedPoint.c
#include "namedPoint.h"
#include <stdlib.h>

struct NamedPoint {
   double x, y;
    char* name;
};

struct NamedPoint* makeNamedPoint(double x, double y, const char* name) {
    struct NamedPoint* p = malloc(sizeof(struct NamedPoint));
    p->x = x;
    p->y = y;
   p->name = name;
   return p;
}

void setName(struct NamedPoint* np, char* name) {
    np->name = name
}

char* getName(struct namedPoint* np) {
    return np->name;
}

// main.c
#include "point.h"
#include "namedPoint.h"
#include <stdio.h>

int main(int ac, char** av) {
    struct NamedPoint* origin = makeNamedPoint(0.0, 0.0, "origin");
    struct NamedPoint* upperRight = makeNamedPoint(1.0, 1.0, "upper right");
    printf("distance = %f\n", distance(origin, upperRight));
}

NamedPoint 데이터 ꡬ쑰가 Point 데이터 κ΅¬μ‘°λ‘œλΆ€ν„° νŒŒμƒλœ ꡬ쑰처럼 λ™μž‘ν•œλ‹€. NamedPointκ°€ Pointλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ μ§‘ν•©μœΌλ‘œ, NamedPointλŠ” Point의 λͺ¨λ“  멀버λ₯Ό ν¬ν•¨ν•œλ‹€. 이 λ°©λ²•μœΌλ‘œ 단일 상속을 κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ 닀쀑 상속을 κ΅¬ν˜„ν•˜κΈ°λŠ” μ–΄λ ΅λ‹€.

λ‹€ν˜•μ„±

객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œ λ‹€ν˜•μ„±μ€ μ•ˆμ „ν•˜κ³  νŽΈλ¦¬ν•˜κ²Œ μ œκ³΅ν•œλ‹€λŠ” 것은 μ†ŒμŠ€ μ½”λ“œ μ˜μ‘΄μ„±μ„ μ—­μ „μ‹œν‚¨λ‹€λŠ” 것이닀. ν˜ΈμΆœν•˜λŠ” λͺ¨λ“ˆμ΄λ“  ν˜ΈμΆœλ˜λŠ” λͺ¨λ“ˆμ΄λ“  관계없이 μ†ŒμŠ€ μ½”λ“œ μ˜μ‘΄μ„±μ„ μ›ν•˜λŠ” λ°©ν–₯으둜 μ„€μ •ν•  수 μžˆλ‹€.

λ‹€ν˜•μ„± λ„ˆλ¬΄ μ–΄λ €μ›Œμ„œ 반볡 ν•™μŠ΅ ν•„μš” μ°Έκ³ 

Last updated