모던지 / 정보처리기사 / 프로그래밍 언어 활용 4강. 객체지향과 예외 처리

프로그래밍 언어 활용 4강. 객체지향과 예외 처리

객체지향은 기술이 아니라 세계관입니다. 프로그램을 명령의 나열이 아니라 서로 말을 거는 사물들의 모임으로 보자는 제안이었죠.

풀고 시작

문제 1. 상위 클래스에서 물려받은 메소드를 하위 클래스에서 같은 이름과 같은 매개변수로 다시 정의하는 것은?
물려받은 것을 덮어쓰는 것이 오버라이딩입니다. 오버로딩은 같은 이름의 메소드를 매개변수만 다르게 여러 개 만드는 것이고, 캡슐화는 데이터와 기능을 하나로 묶어 감추는 것이며, 인스턴스화는 클래스로부터 객체를 만드는 일입니다.

클래스는 설계도, 객체는 만들어진 물건입니다

객체지향의 출발은 1960년대 노르웨이의 시뮬레이션 언어 시뮬라였습니다. 배와 항구와 화물을 코드로 흉내 내려다 보니, 세상의 사물을 그대로 프로그램 안에 옮겨 놓는 편이 낫겠다는 생각에 이른 것이죠.

클래스는 설계도입니다. 어떤 데이터를 갖고 어떤 일을 할 수 있는지 정의하죠. 객체는 그 설계도로 실제 메모리에 만들어진 것이고, 이 만드는 행위를 인스턴스화라고 부릅니다. 자동차 도면이 클래스라면 공장에서 나온 차 한 대가 객체입니다.

클래스가 가진 데이터는 속성(attribute) 또는 필드라 하고, 할 수 있는 일은 메소드(method)라고 합니다. 객체끼리 일을 시킬 때는 메소드를 부르는데, 이것을 메시지를 보낸다고 표현합니다.

객체를 만들 때 자동으로 불리는 특별한 메소드가 생성자(constructor)입니다. 클래스 이름과 같고 반환형이 없다는 것이 특징이죠. 초기값을 넣어 주는 일을 맡습니다.

네 기둥으로 정리합니다

객체지향의 특징은 넷으로 정리하는 것이 정석입니다.

특징
캡슐화 데이터와 기능을 하나로 묶고 내부를 감춘다
정보 은닉 외부에서 직접 접근하지 못하게 막고 정해진 통로만 연다
상속 상위 클래스의 속성과 메소드를 하위가 물려받는다
다형성 같은 메시지에 객체마다 다르게 반응한다

캡슐화의 효과는 결합도를 낮추는 것입니다. 내부 구현을 바꿔도 바깥이 흔들리지 않죠. 그래서 속성은 감추고 값을 읽고 쓰는 메소드만 열어 두는 방식이 관례가 되었습니다.

접근 제어자가 이 감추기를 문법으로 지원합니다. private는 자기 클래스 안에서만, default는 같은 패키지 안에서, protected는 같은 패키지와 상속받은 하위 클래스에서, public은 어디서나 접근할 수 있습니다. protected가 상속 관계까지 허용한다는 점이 시험에 나옵니다.

다형성의 대표적 문법이 오버로딩과 오버라이딩입니다. 둘의 이름이 비슷해 헷갈리기 쉬운데, 기준은 명확합니다.

구분 오버로딩 오버라이딩
관계 같은 클래스 안 상속 관계
이름 같다 같다
매개변수 반드시 다르다 같아야 한다
결정 시점 컴파일 시점 실행 시점

상속보다 합성이 나을 때도 있습니다

상속은 강력하지만 부모가 바뀌면 자식이 전부 흔들립니다. 그래서 등장한 것이 추상 클래스인터페이스입니다.

추상 클래스는 구현된 메소드와 구현되지 않은 메소드를 함께 가질 수 있고, 그 자체로는 객체를 만들 수 없습니다. 인터페이스는 무엇을 할 수 있어야 하는지만 정한 약속이라 구현이 없죠. 자바에서 클래스는 하나만 상속받을 수 있지만 인터페이스는 여러 개를 구현할 수 있다는 점이 자주 출제됩니다.

앞서 5강에서 본 디자인 패턴이 여기서 다시 나옵니다. 패턴들은 대부분 상속 대신 인터페이스와 합성을 써서 유연함을 얻는 방법이었습니다. 상속은 관계를 굳히고 합성은 관계를 갈아 끼울 수 있게 하니까요.

예외는 미리 준비한 실패입니다

프로그램은 언젠가 실패합니다. 파일이 없거나, 0으로 나누거나, 통신이 끊기죠. 이 실패를 예외(exception)라는 객체로 만들어 던지고 받는 구조가 예외 처리입니다.

기본 문법은 셋입니다. try에는 예외가 날 수 있는 코드를, catch에는 예외가 났을 때 할 일을, finally에는 예외가 나든 안 나든 반드시 할 일을 적습니다. 여기서 가장 자주 나오는 함정이 있습니다. finally 블록은 try 안에서 return을 만나도 실행됩니다. 파일이나 연결을 닫는 코드를 여기에 두는 이유죠.

예외를 직접 만들어 던질 때는 throw를 쓰고, 내가 처리하지 않고 부른 쪽에 넘기겠다고 선언할 때는 throws를 씁니다. 한 글자 차이지만 뜻이 정반대입니다.

오류와 예외의 구분도 알아 두세요. 자바에서 Error는 메모리 부족처럼 프로그램이 손쓸 수 없는 심각한 문제이고, Exception은 코드로 대응할 수 있는 문제입니다. 잡아서 처리해야 하는 것은 후자입니다.

다음 강에서는 4과목의 나머지 절반인 운영체제와 네트워크를 봅니다.

인출 문제

문제 1. 오버로딩과 오버라이딩의 차이로 옳은 것은?
이름은 같되 매개변수를 달리하는 것이 오버로딩, 상속받은 메소드를 그대로 다시 정의하는 것이 오버라이딩입니다. 오버라이딩은 실제 객체의 타입에 따라 실행 시점에 결정되기 때문에 다형성의 핵심으로 꼽힙니다.
문제 2. 자바의 접근 제어자 중, 같은 패키지와 상속받은 하위 클래스에서 접근할 수 있는 것은?
protected는 패키지 범위에 더해 상속 관계까지 허용합니다. private는 자기 클래스 안으로 제한되고, default는 같은 패키지까지만이며, public은 아무 제한이 없습니다.
문제 3. 인터페이스에 대한 설명으로 옳은 것은?
다중 상속의 부작용을 피하면서 다형성을 얻기 위한 장치가 인터페이스입니다. 그래서 개수 제한 없이 구현할 수 있고, 그 자체로는 구현이 없어 객체를 만들 수 없습니다.
문제 4. try-catch-finally 구조에서 finally 블록에 대한 설명으로 옳은 것은?
반드시 치러야 할 마무리를 두는 자리가 finally입니다. 그래서 파일 닫기나 연결 해제를 여기에 적으며, return으로 빠져나가는 경우에도 건너뛰지 않는다는 점이 함정으로 나옵니다.

생각해볼 질문 (정답 없음)

예외를 모두 잡아 조용히 넘기는 코드와, 예외가 나면 즉시 멈추는 코드가 있습니다. 사용자를 위한 선택은 어느 쪽일까요.


이전: 3강 배열·포인터·문자열 · 다음: 5강 운영체제와 네트워크 기초

모던지 · 궁금하면 모던지 GitHub · 2026-09-10