1. 현실에서 "추상"

"네 말은 너무 추상적이야"

더보기

1. 목표

프로그래밍의 추상화 개념에 앞서, 
현실에서 "추상"이라는 단어가 사용된 예시들을 살펴보면서 "추상화"의 용어를 이해해 봅니다.

 

 

 

2. 예시

1) "네 말은 너무 추상적이야"
위 문장의 반대말은, "구체적"입니다.


2) 미술에서 추상화 기법을 찾아봅시다.
현실 세계의 형태, 색, 선, 질감을 >> 변형하거나 단순화하여 감정, 개념, 또는 본질을 표현하는 방식입니다.
반대 의미는, 구체적인 형상을 "사실적"으로 그려내는 것입니다.


3) 현실에서 멀리서 다가오는 친구의 구분해 봅시다.
여러 사람 중 친구를 구분할 수 있다면, 그 기준은 친구만이 가진 "특징, 특성"이 기준일 것입니다.


4) 눈을 최대한 감고, 희미하게 뜬 상태에서 옆사람을 바라봅시다.
옆사람을 다른 사람과 구분할 수 있나요?
그렇다면 그 이유는 무엇인가요?

 

 



3. 추상 사전적 정의

추상(抽 뽑을 추 象 코끼리 상)
>> 여러 가지 사물(事物)이나 개념(槪念)에서 공통(共通)되는 특성(特性)이나 속성(屬性) 따를 추출(抽出)하여 파악(把握)하는 작용(作用).

 



4. 현실의 "추상"을 프로그래밍 "추상화"로 

개발자는, 원한다면 세상의 모든 것을 소스코드로 구현해 프로그램을 만들 수 있어야 합니다.
이 때, 프로그램 구현에 필요한 특성 선택하고 소스코드로 구현하는 과정을 추상화라고 합니다.

개발자는, 구현 대상의 모든 구체적이고 사실적인 속성들과 값을  소스코드로 구현할 필요도 이유도 없습니다.
프로그램 실행에 필요한 것들만 소스코드로 구현하면 됩니다.


 

 

 

2. 프로그래밍에서 "추상화(Abstraction) "

더보기

1. 프로그래밍에서 "추상화" : 데이터

 

'사람(Person)' 이라는 현실의 대상 가지고 있는 구체적인 속성 데이터의 가짓수는 무한합니다.

이름, 나이, 키, 몸무게, 직업, 혈액형, 생년월일, 출생일, 발 크기, 손가락 반지 사이즈, 상의 사이즈 등...

 

개발자는 이 모든 속성 데이터를 프로그램화할 이유는 없습니다.

개발자가 의도한 프로그램의 목적에 따라 그중 필요한 정보만 추려서 구현합니다.

필요한 데이터는, '이름'과 '나이'입니다.

 

'사람'을 소스코드에서 Person 객체로 추상화한다면, 

Person 객체는 'Name'과 'Age'라는 2가지 속성(특성)을 가진 "사용자 정의 자료형"으로 구현됩니다.

// C언어, Person 구조체 정의
typedef struct {
char name[100]; // 이름 (문자열)
int age; // 나이
} Person;
// C#, Person 클래스 정의
public class Person
{
public string Name { get; set; } // Name 속성 (이름)
public int Age { get; set; } // Age 속성 (나이)
}

 

 

 

 

2.프로그래밍에서 "추상화" : 함수(메서드, 기능, 로직)

#include <stdio.h>
#include <string.h>
// Person 구조체 정의
typedef struct {
char name[100]; // 이름 (문자열)
int age; // 나이
} Person;
int main() {
// Person 구조체 변수 선언 및 초기화
Person p;
strcpy(p.name, "Alice");
p.age = 25;
// 출력
printf("Name: %s\n", p.name);
printf("Age: %d\n", p.age);
return 0;
}
public class Person
{
// Name 속성 (이름)
public string Name { get; set; }
// Age 속성 (나이)
public int Age { get; set; }
// 생성자: Name과 Age 값을 초기화
public Person(string name, int age)
{
Name = name;
Age = age;
}
// Person 정보를 출력하는 메서드
public void PrintInfo()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}

 

 

 

 

3. 프로그래밍에서 "추상화" : 객체

 

인터페이스, 추상클래스 등 에서 확인

 

 

 

 

4. 프로그래밍에서 "추상화" : 관심사(Concern) 분리

 

디자인 패턴(MVVM) 에서 확인

 

 



5. MVVM "추상화" 관련 개념


대상의 자료, 정보, 값을 추상화 할 >> 속성(Property), 값(Data)

대상의 행위(Behavior), 동작(Command)을 추상화한 >> 로직(Logic)

구현된 소스코드 객체(Object)의 공통된 특성이 추출된 >> 일반화(Generalization)

구현된 소스코드 객체(Object)의 기능(관심사-Concern)이 추상화(추출)되어 패턴화된 >> 디자인 패턴(예. MVVM)


 

 

 

3. 자료형에서 클래스로

더보기

1. 프로그래밍

 

프로그램은 '데이터'와 '로직' 단, 2가지만 존재합니다.

이 중, 데이터는 자료형이라는 기준으로 관리됩니다.

 

 

 

 

2. 자료형

 

자료형을 사용하는 이유와 원리는 생략하고, 자료형의 종류에 대해 살펴봅니다.

 

1. 기본 자료형

2. 복합 자료형

3. 사용자 정의 자료형 (Enum, Struct, Class, Model)

 

 

 

 

3. 사용자 정의 자료형

 

기본 자료형은, 데이터 하나를 다룹니다.

복합 자료형은, 데이터 여러 개를 다룹니다.

사용자 정의 자료형은, 사용자가 원하는 여러 종류의 자료형 여러 개를 조합해 다룹니다.

 

 

 

 

4. 용어- Class

 

class는 흔히 ‘학급’이라고 알고 있지만, 

프로그래밍에서의 class는 "분류"를 의미하는 영어 단어의 본래 뜻에서 출발합니다.

 

객체지향 프로그래밍(OOP) 에서, 

Class 는 Struct(구조체)와 같은 자료형에 해당합니다.

Class는 기본 자료형, 복합자료형, 다른 사용자 정의 자료형(Enum, Struct) 들 처럼 자료형입니다.

 

 

 

 

5. 자료형 비교

 

분류 예시  코드설명
기본 자료형 int, float, char 가장 단순한 타입
복합 자료형 int[], char[], int* 여러 데이터를 하나로
열거형 (Enum) enum Day { MON, TUE, ... } 의미 있는 상수 묶음
구조체 (Struct) struct Person { char name[...]; } 다양한 데이터를 묶음
클래스 (Class) class Person { ... } 데이터 + 동작 포함

 

 

 

 

4. 클래스는 자료형 입니다.

더보기

1. 기본 자료형 (Primitive Types), 복합 자료형 (Composite Types)

// 기본 자료형 (정수형 변수 선언 및 초기화)
int age; // 정수형 변수 age 선언
age = 25; // 변수에 25 저장
// 복합 자료형 (정수형 배열 선언 및 초기화)
int scores[5] = {90, 85, 88, 92, 95}; // 정수 5개를 담는 배열 scores 선언 및 값 초기화

 

 

2. 사용자 정의 자료형 - 열거형 (Enum), 구조체 (Struct)

enum Day { MON, TUE, WED, THU, FRI };
enum Day today = WED;
struct Person {
char name[50];
int age;
};
struct Person p1 = { "Alice", 25 };

 

 

3. 자료형과 값

 

int, int[5], Day 구조체, Person 클래스, 모두 자료형입니다. 

그리고 값을 할당하고, 로직에 의해 변경됩니다.

 

 

4. 클래스 예시

#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
int age;
void sayHello() {
cout << "Hello, I am " << name << endl;
}
};
int main() {
// 사용 예시
Person person;
person.name = "Alice";
person.age = 25;
person.sayHello();
cout << "Age: " << person.age << endl;
return 0;
}
// C#
/public class Person {
public string Name { get; set; }
public int Age { get; set; }
public void SayHello() {
Console.WriteLine($"Hello, I'm {Name}");
}
}
// 사용 예시
class Program {
static void Main(string[] args) {
Person person = new Person();
person.Name = "Alice";
person.Age = 30;
person.SayHello();
Console.WriteLine($"Age: {person.Age}");
}
}

 

 

5. 클래스는 자료형입니다.

// 자료형과 변수명
int age;
Person person;

 

 

 

 

 

5. 변수와 객체

더보기

1.변수와 객체

 

소스코드에서 int 라는 자료형만으로 구현에 사용 가능한가요?

int 라는 자료형은, 변수명 age 와, 실제 할당할 정수 초기값(0)이 필요합니다.

 

클래스도 마찬가지 입니다.

Person 이라는 클래스 자료형은, 변수명 person과, 할당될 초기값이 필요합니다.

 

 

 

2. 객체(Object)로 구분하는 이유

 

클래스 변수 라는 명칭 대신, 객체(Object)로 불리는 이유는, 

단순한 데이터 묶음인 구조체(Struct) 특성 외에,

데이터와 행동(기능)이 포함되고, OOP의 특성인 캡슐화, 추상화, 상속, 다형성 이 구현된 개념이기 때문입니다.

 

사실, (학술적 이론적 의미를 제외하면)객체는 변수라고 생각해도 무방합니다.

 

 

 

 

 

6. 객체 지향 프로그래밍(OOP) 학습 방향

더보기

1. OOP 등장배경

 

모든 기술은, 기존의 문제를 해결하고 좀 더 효율적인 방법을 위해 등장합니다.

 

OOP를 이해하는 첫번째는,

기존 프로그래밍(절차 지향)의 문제점을 파악하고, 객체지향은 이를 어떻게 해결하려 했는지 의도를 이해하는 과정에서 객체지향의 특성에 대해 파악 할 수 있습니다. 

 

 

2. 객체 지향의 특성과 문법 이론

 

객체 지향의 특성
- 추상화

- 캡슐화

- 상속, 다형성

 

엘런케이
- 캡슐화, 메시지, 동적 바인딩

 

SOLID

분류 Eng. Kor.
SRP Single Responsibility Principle 단일 책임 원칙
OCP Open-Closed Principle 개방-폐쇄 원칙 
LSP Liskov Substitution Principle 리스코프 치환 원칙 
ISP Interface Segregation Principle 인터페이스 분리 원칙
DIP Dependency Inversion Principle 의존성 역전 원칙

 

추상화 w/ 클래스, 객체

캡슐화 w/ OOP 등장배경, 접근 제어자, 프로퍼티



 

SOLI 지키면 D 자연스럽게 됨, 동적 바인딩 됨