Menu
Coddy logo textTech

프로그래밍에서 추상화란 무엇인가요?

프로그래밍에서 추상화(abstraction)는 어떤 것이 동작하는 방식의 세부 사항을 더 단순한 인터페이스 뒤에 숨겨서, 그것이 무엇을 하는지만 알고도 사용할 수 있게 하는 것입니다. sorted(names)를 호출하면 정렬 알고리즘을 직접 작성하거나 보지 않고도 리스트가 정렬됩니다.

글쓴이: Kevin Spektor, 공동 창업자, CTO

업데이트: 2026년 9월 24일

print("hi")라고 쓸 때 그 글자들이 어떻게 화면에 도달하는지는 생각하지 않아요. 그 한 줄 아래에서 Python은 텍스트를 바이트로 바꾸고 운영체제에 이를 쓰라고 요청하고, 운영체제는 바이트를 터미널에 넘기며, 터미널은 폰트를 써서 각 글자를 픽셀로 그려요. 각 계층은 위 계층에 단순한 약속을 제공하고, 그 약속을 어떻게 지키는지는 숨겨요. 그렇게 숨기는 것이 추상화이며, 모든 프로그램은 이런 계층 여러 개 위에 놓여 있어요.

추상화 수준

수준다루는 것숨기는 것
여러분의 프로그램print("hi"), sorted(names)라이브러리가 일을 처리하는 방법
Python과 표준 라이브러리문자열, 리스트, 파일메모리 관리, 시스템 호출
인터프리터(CPython)바이트코드바이트코드를 실행하는 C 코드와 기계어
운영체제파일, 프로세스디스크 블록, 장치 드라이버, CPU 스케줄링
하드웨어기계어 명령어트랜지스터와 전기 신호

각 수준은 아래 수준으로 만들어지지만, 아래 수준 없이도 이해할 수 있어요. 디스크 블록이 무엇인지 몰라도 동작하는 Python 코드를 작성할 수 있고, 운영체제는 파일에 Python 코드가 들어 있는지 몰라도 파일을 저장할 수 있어요.

코드에서 추상화는 어떻게 동작하나요

프로그래머는 크게 두 가지 방식으로 자기만의 계층을 만들어요.

절차 추상화는 함수예요. 이름, 매개변수, 반환값이 인터페이스이고, 본문은 숨겨진 세부 사항이에요. average(scores)가 한번 만들어지면, 프로그램의 나머지 부분은 그것이 어떻게 더하고 나누는지 읽지 않고 사용해요.

데이터 추상화는 타입을 무엇을 저장하는 방식이 아니라 그것으로 무엇을 할 수 있느냐로 정의해요. 큐는 "뒤에 넣고 앞에서 꺼낸다"예요. 항목이 메모리에 어떻게 놓이는지는 내부의 결정이에요.

serving soup
serving pasta
serving cake

아래쪽 코드는 deque에 대해 아무것도 몰라요. 이를 평범한 리스트와 pop(0)로 바꿔도 출력은 똑같고, 긴 큐에서 느려질 뿐이에요. 리스트의 첫 항목을 꺼내면 나머지 항목이 모두 한 칸씩 옮겨지기 때문이에요. 인터페이스가 그대로였으므로 클래스 밖에서는 아무것도 바꿀 필요가 없었어요.

추상 클래스와 인터페이스

객체지향 프로그래밍에서 추상화는 보통 클래스 집합이 무엇을 해야 하는지 정하고, 어떻게 할지는 각 클래스에 맡기는 것을 뜻해요. Python에서는 abc 모듈로 메서드를 추상 메서드로 표시해요. 구현되지 않은 추상 메서드가 있는 클래스는 인스턴스를 만들 수 없어요.

email to ana@example.com: Your package arrives today
sms to +15550100: Your package arrives today
Notifier is abstract: create an Email or an SMS instead

remind()는 추상화, 즉 send 메서드를 가진 무언가에만 의존해요. 푸시 알림을 추가하려면 새 클래스 하나만 작성하면 되고 remind()는 손대지 않아도 돼요. 이 마지막 단계, 즉 호출 하나가 클래스마다 다른 코드를 실행하는 것이 다형성이에요. 추상화는 공통 인터페이스를 정의하고, 다형성은 그것이 동작하게 해요.

Java에는 같은 도구가 키워드로 있어요.

interface Notifier {
    void send(String to, String text);
}

class Email implements Notifier {
    public void send(String to, String text) { /* talk to the mail server */ }
}

new Notifier()라고 쓰면 컴파일 오류가 나요. 인터페이스에는 실행할 구현이 없기 때문이에요. Java의 추상 클래스와 인터페이스는 문서에서 자세히 설명해요.

추상화와 캡슐화의 차이

두 개념은 너무 자주 함께 등장해서 헷갈리기 쉬워요.

추상화캡슐화
답하는 질문이것은 무엇을 하나요?누가 데이터를 건드릴 수 있나요?
초점인터페이스: 제공하는 연산내부: 인터페이스 뒤의 데이터
주요 도구함수, 추상 클래스, 인터페이스, 모듈private, _name, 프로퍼티, #fields
예시Notifier.send()가 이메일과 SMS에 모두 동작_balance는 withdraw()로만 바뀜
수준설계구현

추상화는 어떤 연산을 보여 줄지 정하고, 캡슐화는 나머지가 숨겨진 채로 있도록 보장해요. 위의 Queue는 둘 다 해요. add와 next는 추상화이고, _items의 밑줄은 캡슐화예요.

새는 추상화와 그 밖의 실수

조엘 스폴스키(Joel Spolsky)는 2002년에 새는 추상화의 법칙(law of leaky abstractions)이라는 이름을 붙였어요. 사소하지 않은 모든 추상화는 숨긴 세부 사항의 일부를 새어 나가게 한다는 거예요. 부동소수점 수가 대표적인 예예요. 평범한 소수처럼 보이다가 그 아래의 이진 저장 방식이 드러나요.

0.30000000000000004
False

0.1도 0.2도 이진 비트로는 정확히 저장할 수 없어서 합이 약간 어긋나요. 이를 신경 쓰지 않고 몇 년 동안 float를 쓸 수는 있지만 영원히 그럴 수는 없어요. 그래서 작업하는 계층보다 한 단계 아래를 알아 두면 도움이 돼요.

흔한 실수가 두 가지 더 있어요.

  • 너무 일찍 추상화하기. 끝내 오지 않는 경우를 위해 만든 클래스 계층은 읽고 고쳐야 할 코드만 늘려요. 샌디 메츠(Sandi Metz)는 이를 "중복은 잘못된 추상화보다 훨씬 싸다"라고 표현했어요.
  • 추상화를 abstract 키워드와 혼동하기. 추상 클래스는 도구 중 하나일 뿐이에요. 이름을 잘 지은 함수는 모두 추상화예요.

다음 단계

캡슐화와 다형성을 읽으면 객체지향의 전체 그림이 완성돼요. 운영체제 페이지는 여러분의 프로그램이 기대는 가장 큰 추상화를 보여 줘요. 연습하려면 처음부터 클래스와 함수를 만들어 보는 Python 강좌와, 추상 클래스와 인터페이스를 다루는 Java 강좌를 해 보세요.

자주 묻는 질문

추상화의 예로는 무엇이 있나요?
가장 단순한 예는 함수예요. len(items)를 호출할 때 Python이 어떻게 세는지가 아니라 무엇을 반환하는지만 알아요. 일상의 예는 자동차 페달로, 엔진이 연료를 어떻게 태우는지 몰라도 속도를 조절할 수 있어요. 객체지향 코드에서는 send 메서드 하나를 가진 Notifier 같은 인터페이스가 이메일, SMS, 푸시 메시지에 대한 추상화예요.
Python에서 추상화란 무엇인가요?
Python의 모든 함수, 클래스, 모듈은 그 안의 코드에 대한 추상화예요. 형식을 갖춘 방법으로는 표준 abc 모듈에서 @abstractmethod로 추상 기반 클래스를 선언할 수 있어요. 그러면 Python은 그 클래스의 객체도, 모든 추상 메서드를 구현하지 않은 하위 클래스의 객체도 만들지 못하게 해요.
Java 프로그래밍에서 추상화란 무엇인가요?
Java는 추상 클래스와 인터페이스로 추상화를 표현해요. 추상 클래스에는 본문이 없고 하위 클래스가 반드시 구현해야 하는 추상 메서드가 있을 수 있으며, new로 인스턴스를 만들 수 없어요. 인터페이스는 구현하는 클래스가 제공해야 할 메서드를 나열하며, 한 클래스가 여러 인터페이스를 구현할 수 있어요.
객체지향 프로그래밍의 네 기둥은 무엇인가요?
캡슐화, 추상화, 상속, 다형성이에요. 캡슐화는 객체의 데이터를 보호하고, 추상화는 객체가 하는 일만 드러내며, 상속은 한 클래스가 다른 클래스의 코드를 재사용하게 하고, 다형성은 하나의 코드가 공통 인터페이스를 통해 여러 타입과 함께 동작하게 해요.
추상화가 코드를 더 나쁘게 만들 수도 있나요?
네, 너무 일찍 하거나 엉뚱한 것을 숨기면 그래요. 끝내 오지 않는 경우를 위해 만든 코드는 아무 이득 없이 읽고 고쳐야 할 계층만 늘려요. 흔한 지침은 비슷한 코드를 두세 번 작성할 때까지 기다리는 거예요. 그래야 이름을 붙이기 전에 공통된 모양이 분명해져요.
Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기