4.1 추상화
1. "추상"
: 단어의 의미
A. 목표
프로그래밍에서의 "추상화" 개념을 배우기 전에,
일상생활에서 사용되는 "추상"이라는 단어의 의미를 먼저 이해합니다.
일상 속 예시와 미술에서의 추상을 살펴보며, "추상"의 뜻과 "구체"의 대비를 명확히 알아봅니다.
B. 예시
1) 추상 ↔ 구체
“네 말은 너무 추상적이야”라는 표현이 있습니다. 이는, 내용이 너무 막연하고 실체가 없다는 뜻입니다.
이와 반대로 “구체적”이라는 말은, 실제 사례, 수치, 경험 등을 들어 명확하게 설명하는 경우를 의미합니다.
2) 미술에는 추상화 라는 기법이 있습니다.
현실 세계의 사물을 그대로 재현하지 않고 형태, 색, 선, 질감을 단순화하거나 변형하여 감정, 개념을 표현하는 기법입니다.
반대로, 현실을 실제처럼 묘사하는 화풍은 “사실주의”가 있습니다.
3) 멀리서 다가오는 친구를 바라본다고 가정합시다.
멀리서 다가오는 여러 사람 중에 친구를 알아본다면,
그 이유는 친구만이 가진 수많은 특징 중 일부(예: 걸음걸이, 체형, 목소리, 헤어스타일 등)를 근거로 하기 때문입니다.
이처럼 우리는 모든 세부 사항을 보지 않아도, 몇몇 특징(추상적)만으로 대상을 구분할 수 있습니다.
4) 눈을 최대한 희미하게 뜬 상태에서 옆사람을 바라봅시다.
옆사람을 다른 사람과 구분할 수 있나요?
그렇다면 그 이유는 무엇인가요?
눈을 반쯤 감고 옆사람을 바라보면, 세부적인 모습은 잘 보이지 않지만
전체적인 윤곽이나 큰 특징(키, 체형, 헤어스타일 등)으로 인해 여전히 그 사람이 누구인지 구분할 수 있습니다.
이 과정에서 우리는 “세부”를 제거하고 “본질적인 특징”만 남기는 추상화를 경험하게 됩니다.
'추상' 이라는 단어에 대해 어느정도 개념이 잡히시나요?
C. 추상 사전적 정의
추상(抽 뽑을 추 象 코끼리 상)
>> 여러 가지 사물(事物)이나 개념(槪念)에서 공통(共通)되는 특성(特性)이나 속성(屬性) 따를 추출(抽出)하여 파악(把握)하는 작용(作用).
D. 현실의 "추상"을 프로그래밍 "추상화"로
개발자는 현실 세계의 개념이나 현상을 프로그램 속으로 옮겨 모델링할 수 있어야 합니다.
이때, 모든 구체적이고 사실적인 속성을 다 코드로 구현할 필요도 이유도 없기에 프로그램 실행과 문제 해결에 꼭 필요한 속성만 선택하여 구현(추상화) 합니다.
다시 말해, 추상화는 현실을 있는 그대로 복사하는 것이 아니라, 본질적인 특징만 뽑아내어 단순화하는 것입니다.
또한, 프로그래밍에서 추상화는 단순히 코드 작성에만 국한되지 않습니다.
예를 들어,
- 클래스 설계에서 공통 속성과 동작만 정의하기
- 인터페이스로 다양한 구현을 감추고 통일된 사용법 제공하기
- API 설계에서 내부 동작을 감추고 단순한 호출 방법만 제공하기
등이 모두 추상화의 한 형태입니다.
2. 프로그래밍에서 "추상화(Abstraction)"
: 불필요한 세부사항을 제거하고 필요한 핵심만 남겨 단순화하는 과정
A. 데이터 추상화
'사람' 이라는 현실의 대상이 가지고 있는 구체적인 속성 데이터의 가짓수는 무한합니다.
이름, 나이, 키, 몸무게, 직업, 혈액형, 생년월일, 출생일, 발 크기, 손가락 반지 사이즈, 상의 사이즈 등...
개발자가 '사람(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 속성 (나이)
}
- 이렇게 불필요한 속성을 제거하고 필요한 속성만 남기는 것이 데이터 추상화(모델링)입니다.
B.함수 추상화
using System;
public class Person
{
// 속성 (데이터 추상화)
public string Name { get; set; }
public int Age { get; set; }
// 생성자
public Person(string name, int age)
{
Name = name;
Age = age;
}
// 행위 추상화: 내부 구현을 숨기고 단순화된 기능 제공
public void PrintInfo()
{
// 내부 동작: 문자열 포맷팅 + 콘솔 출력
Console.WriteLine($"이름: {Name}, 나이: {Age}");
}
// (내부 동작 변경, 가정1) 사람 정보를 출력 + 파일 저장
public void PrintInfo()
{
string info = $"이름: {Name}, 나이: {Age}";
File.WriteAllText("person.txt", info);
}
// (내부 동작 변경, 가정2) 사람 정보를 출력 + 로그 기록
public void PrintInfo()
{
string info = $"이름: {Name}, 나이: {Age}";
File.AppendAllText("log.txt", info + Environment.NewLine);
}
}
class Program
{
static void Main()
{
// Person 객체 생성
Person p = new Person("Alice", 25);
// 사용자는 PrintInfo()가 내부에서 무엇을 하는지 몰라도 됨
// PrintInfo() 콘솔 출력 → 파일 저장 → 로그 기록 변경에 영향을 받지 않음
p.PrintInfo();
}
}
- 사용자는 p.PrintInfo( );만 호출하면 되며, 내부에서 콘솔 출력 / 파일 저장 / 로그 기록 중 어떤 방식으로 구현되었는지는 알 필요가 없습니다.
C. 객체 추상화
public interface IAnimal
{
void Speak();
}
public class Dog : IAnimal
{
public void Speak() => Console.WriteLine("Bark");
}
public class Cat : IAnimal
{
public void Speak() => Console.WriteLine("Meow");
}
- 인터페이스, 추상클래스는 객체 추상화의 대표적인 방법입니다.
- 인터페이스를 사용하면 “구현 방법이 달라도 동일한 동작을 보장”할 수 있습니다.
D. 관심사(Concern) 분리
추상화는 역할을 나누고 책임을 분리하는 원칙과 연결됩니다.
디자인 패턴(MVVM) 에서 확인
- Model : 데이터 관리
- View : UI 표현
- ViewModel : 로직과 상태 관리
위 함수, 객체의 추상화처럼, 목적에 따라 분할된 한 영역(View)을 변경해도
다른 영역(Model, ViewModel)에 최소한의 영향만 주도록 설계합니다.
E. MVVM "추상화" 관련 개념
- 속성(Property) 추상화 → 데이터를 캡슐화
- 행위(Command) 추상화 → 버튼 클릭 등 사용자 동작을 로직으로 연결
- 일반화(Generalization) → 여러 객체의 공통된 특성을 클래스 계층으로 정의
- 관심사 분리(Separation of Concerns) → UI, 로직, 데이터 책임을 분리
F. 요약
- 추상화란 필요한 것만 남기고 불필요한 세부사항을 감추는 과정이다.
- 데이터, 함수, 객체, 아키텍처(디자인 패턴) 등 다양한 수준에서 적용된다.
- MVVM은 추상화를 활용하여 데이터-로직-UI를 분리하는 대표적인 패턴이다.
3. 데이터 추상화, OOP 클래스
A. 자료형
프로그램은 '데이터'와 '로직' 단, 2가지만 존재합니다.
이 중, 데이터는 자료형이라는 기준으로 관리됩니다.
자료형을 사용하는 이유와 원리는 생략하고, 자료형의 종류에 대해 살펴봅니다.
1. 기본 자료형
2. 복합 자료형
3. 사용자 정의 자료형 (Enum, Struct, Class, Model)
기본 자료형은, 데이터 하나를 다룹니다.
복합 자료형은, 데이터 여러 개를 다룹니다.
사용자 정의 자료형은, 사용자가 원하는 여러 종류의 자료형, 여러 개를 조합해 다룹니다.
B. 클래스는 자료형입니다.
// 자료형과 변수명
int age;
Person person;
class는 흔히 ‘학급’이라고 알고 있지만,
프로그래밍에서의 class는 "분류"를 의미하는 영어 단어의 본래 뜻에서 출발합니다.
객체지향 프로그래밍(OOP) 에서,
Class 는 Struct(구조체)와 같은 자료형에 해당합니다.
Class는 기본 자료형, 복합자료형, 다른 사용자 정의 자료형(Enum, Struct) 들 처럼 자료형입니다.
C. 변수 대신, 객체(Object)라는 용어를 사용하는 이유
클래스 변수 라는 명칭 대신, 객체(Object)로 불리는 이유는,
단순한 데이터 묶음인 구조체(Struct) 특성 외에,
데이터와 행동(기능)이 포함되고, OOP의 특성인 캡슐화, 추상화, 상속, 다형성 이 구현된 개념이기 때문입니다.
사실, (학술적 이론적 의미를 제외하면) 객체는 변수라고 접근해도 무방합니다.