프로그래밍 언어 활용 4강. 객체지향과 예외 처리
객체지향은 기술이 아니라 세계관입니다. 프로그램을 명령의 나열이 아니라 서로 말을 거는 사물들의 모임으로 보자는 제안이었죠.
풀고 시작
클래스는 설계도, 객체는 만들어진 물건입니다
객체지향의 출발은 1960년대 노르웨이의 시뮬레이션 언어 시뮬라였습니다. 배와 항구와 화물을 코드로 흉내 내려다 보니, 세상의 사물을 그대로 프로그램 안에 옮겨 놓는 편이 낫겠다는 생각에 이른 것이죠.
클래스는 설계도입니다. 어떤 데이터를 갖고 어떤 일을 할 수 있는지 정의하죠. 객체는 그 설계도로 실제 메모리에 만들어진 것이고, 이 만드는 행위를 인스턴스화라고 부릅니다. 자동차 도면이 클래스라면 공장에서 나온 차 한 대가 객체입니다.
클래스가 가진 데이터는 속성(attribute) 또는 필드라 하고, 할 수 있는 일은 메소드(method)라고 합니다. 객체끼리 일을 시킬 때는 메소드를 부르는데, 이것을 메시지를 보낸다고 표현합니다.
객체를 만들 때 자동으로 불리는 특별한 메소드가 생성자(constructor)입니다. 클래스 이름과 같고 반환형이 없다는 것이 특징이죠. 초기값을 넣어 주는 일을 맡습니다.
네 기둥으로 정리합니다
객체지향의 특징은 넷으로 정리하는 것이 정석입니다.
| 특징 | 뜻 |
|---|---|
| 캡슐화 | 데이터와 기능을 하나로 묶고 내부를 감춘다 |
| 정보 은닉 | 외부에서 직접 접근하지 못하게 막고 정해진 통로만 연다 |
| 상속 | 상위 클래스의 속성과 메소드를 하위가 물려받는다 |
| 다형성 | 같은 메시지에 객체마다 다르게 반응한다 |
캡슐화의 효과는 결합도를 낮추는 것입니다. 내부 구현을 바꿔도 바깥이 흔들리지 않죠. 그래서 속성은 감추고 값을 읽고 쓰는 메소드만 열어 두는 방식이 관례가 되었습니다.
접근 제어자가 이 감추기를 문법으로 지원합니다. private는 자기 클래스 안에서만, default는 같은 패키지 안에서, protected는 같은 패키지와 상속받은 하위 클래스에서, public은 어디서나 접근할 수 있습니다. protected가 상속 관계까지 허용한다는 점이 시험에 나옵니다.
다형성의 대표적 문법이 오버로딩과 오버라이딩입니다. 둘의 이름이 비슷해 헷갈리기 쉬운데, 기준은 명확합니다.
| 구분 | 오버로딩 | 오버라이딩 |
|---|---|---|
| 관계 | 같은 클래스 안 | 상속 관계 |
| 이름 | 같다 | 같다 |
| 매개변수 | 반드시 다르다 | 같아야 한다 |
| 결정 시점 | 컴파일 시점 | 실행 시점 |
상속보다 합성이 나을 때도 있습니다
상속은 강력하지만 부모가 바뀌면 자식이 전부 흔들립니다. 그래서 등장한 것이 추상 클래스와 인터페이스입니다.
추상 클래스는 구현된 메소드와 구현되지 않은 메소드를 함께 가질 수 있고, 그 자체로는 객체를 만들 수 없습니다. 인터페이스는 무엇을 할 수 있어야 하는지만 정한 약속이라 구현이 없죠. 자바에서 클래스는 하나만 상속받을 수 있지만 인터페이스는 여러 개를 구현할 수 있다는 점이 자주 출제됩니다.
앞서 5강에서 본 디자인 패턴이 여기서 다시 나옵니다. 패턴들은 대부분 상속 대신 인터페이스와 합성을 써서 유연함을 얻는 방법이었습니다. 상속은 관계를 굳히고 합성은 관계를 갈아 끼울 수 있게 하니까요.
예외는 미리 준비한 실패입니다
프로그램은 언젠가 실패합니다. 파일이 없거나, 0으로 나누거나, 통신이 끊기죠. 이 실패를 예외(exception)라는 객체로 만들어 던지고 받는 구조가 예외 처리입니다.
기본 문법은 셋입니다. try에는 예외가 날 수 있는 코드를, catch에는 예외가 났을 때 할 일을, finally에는 예외가 나든 안 나든 반드시 할 일을 적습니다. 여기서 가장 자주 나오는 함정이 있습니다. finally 블록은 try 안에서 return을 만나도 실행됩니다. 파일이나 연결을 닫는 코드를 여기에 두는 이유죠.
예외를 직접 만들어 던질 때는 throw를 쓰고, 내가 처리하지 않고 부른 쪽에 넘기겠다고 선언할 때는 throws를 씁니다. 한 글자 차이지만 뜻이 정반대입니다.
오류와 예외의 구분도 알아 두세요. 자바에서 Error는 메모리 부족처럼 프로그램이 손쓸 수 없는 심각한 문제이고, Exception은 코드로 대응할 수 있는 문제입니다. 잡아서 처리해야 하는 것은 후자입니다.
다음 강에서는 4과목의 나머지 절반인 운영체제와 네트워크를 봅니다.
인출 문제
생각해볼 질문 (정답 없음)
예외를 모두 잡아 조용히 넘기는 코드와, 예외가 나면 즉시 멈추는 코드가 있습니다. 사용자를 위한 선택은 어느 쪽일까요.
이전: 3강 배열·포인터·문자열 · 다음: 5강 운영체제와 네트워크 기초