프로그래밍
-
마치며프로그래밍 언어 속 타입 2022. 5. 17. 15:40
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 프로그래밍 언어의 역사를 되돌아보면 정적 타입 언어는 끊임없이 발전해 왔다. 자바가 처음 나오던 1990년대만 해도 매개변수에 의한 다형성은 당연한 기능이 아니었다. 학계에서는 1960년대부터 매개변수에 의한 다형성에 대한 연구가 이루어졌지만, 현실에 적용되는 속도는 훨씬 느렸다. 매개변수에 의한 다형성은 기껏해야 하스켈 같은 일부 함수형 언어에서나 찾아볼 수 있었다. 객체 지향 언어에게는 서브타입에 의한 다형성이면 충분해 보였다. 하지만 만들려는 프로그램이 크고 복잡해질수록 개발자들은 정적 타입 언어에 더 많은 기능을 요구했다. 그 결과 자바에 매개변수에 의한 다형성이 추가되었고, 매개변수에 의한 다형성을..
-
5.4 카인드프로그래밍 언어 속 타입 2022. 5. 17. 15:37
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 가든 비닐봉지, 가든 종이 상자 처르지: 고민이 있는 표정인걸? 큐리 박사: 잘도 알았네. 넌 항상 눈치가 빠르구나. 처르지: 우리가 하루 이틀 본 사이도 아닌데 이쯤이야 뭐. 그래서 뭔데? 큐리 박사: 최근에 과일 가게에서 포장 서비스를 시작했거든. 과일을 사면 비닐봉지나 종이 상자에 담아서 줘. 근데 매번 손님이 과일을 사갈 때마다 어디에 포장할지 물어 봐야 하는 게 꽤나 귀찮더라고. 한두 번이면 몰라도, 하루 종일 그러려니 좀 힘들달까? 처르지: 장사를 하려면 그 정도는 당연히 감내해야 하는 거 아니야? 뭐 대단한 거도 아니고. 큐리 박사: 그렇긴 하지만, 그래도 귀찮은걸. 처르지: 그러면 이렇게 하는..
-
5.3 타입클래스프로그래밍 언어 속 타입 2022. 5. 17. 15:30
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 사과가 든 비닐봉지 처르지: 기계가 하나 줄은 거 같네? 큐리 박사: 맞아. “과즙듬뿍카레자동조리기계”를 없앴거든. 사람들이 생각보다 과즙 들어간 카레를 별로 안 좋아하더라고. 어차피 쓸 일도 별로 없는 주제에 자리만 차지하는 게 싫어서 그냥 없애 버렸지. 그래서 이제 다시 “사과깍둑카레자동조리기계”랑 “복숭아깍둑카레자동조리기계”만 남았어. 처르지: 그랬구나. 아쉽네. 큐리 박사: 뭐, 이 정도는 괜찮아. 맛있는 카레를 만들기 위해서는 다양한 시행착오가 필요한 법이니깐. 그보다 오늘 재밌는 일이 있었는데 들어 볼래? 처르지: 오, 좋지. 뭔데? 큐리 박사: 아침에 손님이 한 명 왔었어. 그러더니 직원한테 가..
-
5.2 메서드 오버라이딩 - 메서드 오버라이딩과 결과 타입프로그래밍 언어 속 타입 2022. 5. 17. 15:16
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 지금까지는 매개변수 타입에만 집중해 왔다. 그리고 실제로 오버로딩을 할 때는 결과 타입에 내가 원하는 아무 타입이나 사용할 수 있다. 결과 타입이 무엇이든 매개변수 타입만 서로 다르면 타입 검사기가 문제 삼지 않는다. 예를 들면, 다음과 같이 두 write 함수의 결과 타입이 달라도 괜찮다. String write(Cell cell, String str) { ... } void write(Cell cell, Int num) { ... } 다음과 같은 코드 역시 가능하다. Float length(Vector v) { ... } String length(SparseVector v) { ... } 메서드의 경우에..
-
5.2 메서드 오버라이딩 - 메서드 선택의 한계프로그래밍 언어 속 타입 2022. 5. 17. 15:09
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 안타깝게도 메서드 선택이 수신자의 동적 타입을 고려하는 것만으로는 모든 문제가 해결되지 않는다. 문제는 수신자의 동적 타입만 고려하고 인자의 동적 타입은 고려하지 않는 데서 온다. 지금부터 인자의 동적 타입을 고려하지 않기 때문에 발생하는 문제를 알아보자. 두 벡터가 같은 개수의 원소를 가진다면 두 벡터를 더할 수 있다. 두 벡터의 합은 벡터의 원소들을 각각 더해서 만든 벡터다. 예를 들어 [1, 2]와 [5, 3]을 더한 결과는 [1 + 5, 2 + 3], 즉 [6, 5]다. 두 벡터의 합을 반환하는 add 메서드를 다음과 같이 정의할 수 있다. class Vector { Vector add(Vector ..
-
5.2 메서드 오버라이딩프로그래밍 언어 속 타입 2022. 5. 17. 15:05
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 씨 없는 딸기 주스 큐리 박사: 처르지, 이거 마셔 볼래? 처르지: 와, 끝내주게 맛있네. 이게 뭐야? 큐리 박사: 딸기 주스야. 내가 새로 만든 기계로 만들었지. 처르지: 별걸 다 만드는구나! 큐리 박사: 카레를 다 먹고 상큼한 과일 주스를 후식으로 먹으면 잘 어울릴 거 같더라고. 그래서 손님들한테 과일 주스를 제공할 수 있도록 기계를 만들었어. 처르지: 좋은 생각이야. 큐리 박사: 내 기계 구경할래? 처르지: 좋지! 큐리 박사: 내가 기계를 두 개 만들었거든. 얘가 그중 첫 번째로 만든 애야. 얘로는 딸기 주스만 만들 수 있어. 처르지: 아하, 그러면 이 기계는 딸기 주스 만드는 기계라 할 수 있겠다, ..
-
5.1 오버로딩 - 메서드 오버로딩프로그래밍 언어 속 타입 2022. 5. 17. 14:54
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 함수 오버로딩을 이해했다면 메서드 오버로딩은 쉽다. 오버로딩의 대상이 함수에서 메서드로 바뀌었을 뿐이다. 메서드 오버로딩은 한 클래스에 이름이 같은 메서드를 여럿 정의하는 것을 말한다. 물론 이름이 같은 메서드들은 매개변수 타입이 서로 달라야 한다. 가령 스프레드시트 편집 프로그램에서 write를 Cell 클래스의 메서드로 다음처럼 구현할 수 있다. class Cell { ... void write(String str) { ... } void write(Int num) { ... } } 오버로딩 여부에 상관없이 함수를 그냥 호출하면 되는 것처럼, 메서드 역시 오버로딩되었든 아니든 그냥 평소처럼 호출하면 된다..
-
5.1 오버로딩 - 가장 특화된 함수프로그래밍 언어 속 타입 2022. 5. 17. 14:48
이 글은 인사이트 출판사의 제안으로 작성 중인 책 『프로그래밍 언어 속 타입』 원고의 일부입니다. 지금부터 벡터vector를 다루는 프로그램을 만들 것이다. 벡터는 컴퓨터 그래픽스나 기계 학습 등 여러 분야에서 사용되는 개념이다. 벡터가 친숙하지 않다면 단순하게 정수의 리스트라고 이해하면 된다. 예를 들면 [1, 3]이나 [2, -4, 7, 10] 등이 벡터다. 사실 정확히 말하면 정수의 리스트만 벡터인 것은 아니고 아무 수의 리스트나 다 벡터지만, 우리의 논의에는 별 영향이 없으니 그냥 정수의 리스트라 하겠다. 다음 코드는 벡터를 나타내는 클래스를 정의한다. class Vector { List entries; } Vector 클래스는 벡터의 원소들을 나타내는 entries 필드를 가진다. 가령 [1, ..