객체 지향 프로그래밍/OOP

객체 지향 특징 - 캡슐화, 상속, 추상화, 다형성

ghtis1798 2020. 12. 28. 04:21

객체 지향 4대 특성

1. 절차적/구조적 프로그래밍

 

객체 지향은 절차적/구조적 프로그래밍으로부터 발전해 왔습니다.

따라서 절차적/구조적 프로그래밍의 특징을 갖고 있습니다.

그래서 간단히 정리하고 넘어가려고 합니다. 😊

 

1.1. 절차적 프로그래밍

 

절차적 프로그래밍은 코드가 작성된 순서대로 실행되도록 구현해야 합니다. 👍

특히 Goto처럼 분기를 일으키는 명령문의 사용을 지양합니다.

잦은 분기는 프로그램의 작동 원리를 파악하는 데 혼동을 줄 수 있기 때문이죠. 😢😢

그래서 Java에서는 아예 막아 놓았습니다.

 

1.2. 구조적 프로그래밍

 

구조적 프로그래밍은 함수를 사용하여 중복을 줄이고 논리적으로 기능을 분리하는 것입니다.

이렇게 구현하면 프로그램 구조를 파악하기 쉬워지고 유지보수에도 용이해지죠.

또한 함수 안에서 지역변수를 사용함으로써 전역변수로 발생하는 문제도 줄일 수 있습니다. 👍👍

 

1.3. 함수와 메소드의 차이

 

객체지향 프로그래밍에서는 함수를 메소드라고 표현합니다.

기능상의 큰 차이는 없습니다.

하지만 모든 메소드는 클래스 안에 존재해야 한다는 점이 다릅니다.

반면, 함수의 경우 클래스와 관계가 없다는 점이 차이점 일 수 있겠네요. 😃

 

1.4. 객체 지향의 장점

 

우선 객체지향의 전단계라고 볼 수 있는 구조적 프로그래밍의 핵심은 함수였습니다. 😶

함수의 장점은 중복 코드를 줄여주고 논리적으로 코드를 분리해준다는 것입니다.

여기서 더 나아간 객체 지향의 특성은 무엇일까요? 🤔

객체 지향의 장점은 제목처럼 캡슐화, 상속, 추상화, 다형성에 있습니다.

우선 객체가 무엇인지 설명할 수 있어야 합니다. 😎😎

그리고 객체를 이야기하려면 클래스와 함께 이야기해야 합니다.

객체란 속성과 행위를 가지며 프로그램을 구성하는 단위라고 할 수 있습니다.

이 속성과 행위에 대한 설계도 역할을 하는 것이 클래스입니다.

고양이가 클래스이고 우리집 고양이 '디디'가 객체라면 다음과 같은 속성, 행위가 있을 수 있죠.

디디는 눈이 두 개, 다리가 네 개인 속성이 있습니다.

그리고 야옹하며 울거나, 높은 곳으로 점프할 수 있는 행위를 가지고 있죠.

이것들에 대한 정보가 고양이라는 클래스 안에 담겨 있는 것입니다.

현실에 비추어 보았을 때는 유일하게 존재하는 하나의 대상이 객체입니다.

사람, 강아지, 고양이, 핸드폰 등등 모든 것이 객체고 이들이 모여 현실을 구성하게 됩니다.

여기서 나타나는 첫 번째 객체의 장점은 바로 직관적이라는 것입니다.

함수만을 정의하던 것에서 현실의 사물들을 정의할 수 있게 된 것이죠.

구체적인 예시를 들어 보겠습니다.

강아지, 고양이, 토끼 10마리가 뛰어다니는 동물원 프로그램을 만든다고 가정하면,

동물원이라는 프로그램 안에는 강아지, 고양이, 토끼 클래스가 있을 것입니다.

그리고 강아지 클래스로부터 강아지1, 강아지2, 강아지3, ..., 강아지10을 생성할 것입니다.

고양이와 토끼에 대해서도 마찬가지입니다.

프로그램을 구성하는 것은 강아지, 고양이, 토끼 객체들이지만 그것들을 생성하기 위해서는 클래스를 반드시 작성해야만 합니다.

더 구체적으로 객체 지향의 장점에 대해 알아 보겠습니다. 😎

 

2. 객체 지향의 특징

 

2.1. 캡슐화(Encapsulation)

 

캡슐화란 속성(필드)과 행위(메서드)를 하나로 묶고, 접근 지정자를 통해 제어하는 것을 말합니다.

은행 거래를 예로 들어보겠습니다.

고객은 계좌번호, 잔액 등의 속성이 있고 입금/인출하기라는 행위가 있을 수 있습니다.

만약 고객이 100명이 있었다고 가정해봅시다.

우리는 클래스를 통해 고객객체를 생성하지 않고 100명의 고객을 생성했습니다.

그런데 계좌번호, 잔액 외에 이름이라는 필드를 추가하려고 하면 어떻게 될까요? 😢

100명의 고객들에 대해 생성해주어야 할 것입니다. 이건 너무 고통스러운 일이에요.

클래스로 정의한 뒤 객체를 생성해 주었을 때는 클래스만 수정해주면 되는 것이지요. 👍

또한 클래스 내부 필드들은 접근 지정자로 제한해야 합니다.

예를 들어 Public이 아닌 Private으로 설정한다던가 하는 것입니다.

사용자에게 모든 정보가 Public으로 공개되어 있다면,

그래서 자신의 계좌 잔액을 수정한 뒤 인출하려고 한다면 큰 문제가 발생할 수 있기 때문이죠.

접근 지정자를 통해 사용자의 권한을 제어하는 것을 '정보 은닉'이라고 합니다.

따라서 캡슐화를 사용하면 '정보 은닉'과 리팩토링의 장점이 있습니다.

리팩토링이란 내부 코드를 바꾸더라도 사용 방법을 유지할 수 있음을 의미합니다.

 

2.2. 상속(Inheritance)

 

상속은 클래스와 클래스 사이의 관계를 의미합니다.

'확장' 혹은 '분류'의 개념으로 받아들이면 이해가 빠릅니다.

클래스 B가 클래스 A를 상속한다면 A가 지닌 속성과 메서드를 그대로 가져와 사용할 수 있습니다.

예를 들면 고양이 품종인 먼치킨, 러시안블루, 페르시안고양이입니다.

러시안블루고양이의 특징과 행동을 모두 갖고 있습니다. 👍

다른 말로 러시안블루고양이의 확장 버전이라고 볼 수도 있습니다.

그래서인지 Java에서 상속하는 명령어는 extends로 설정되어 있습니다.

러시안블루하위 클래스, 고양이상위 클래스가 됩니다.

이렇게 상속을 사용하면 좋은 점은 코드를 재사용할 수 있다는 것입니다. 😊

러시안블루를 정의할 때는, 고양이의 일반적인 특징과 행동을 정의하지 않아도 되는 것이죠.

이것이 상속으로 인한 재사용의 장점입니다.

 

2.3. 추상화(Abstraction)

 

추상화란 구체적인 것을 분해해서 내가 관심 있는 것들 위주로 구성하는 것이라고 볼 수 있습니다.

추상화를 하려면 내가 무엇에 관심이 있는 지를 정해야 합니다.

개발에 있어선 어플리케이션 경계를 고려해야 합니다.

예를 들어 학교 어플리케이션을 만든다면 학생 클래스에 학업 관련 필드와 메서드를 구성할 것입니다.

하지만 쇼핑몰 어플리케이션 만든다면 고객 클래스로 바꾼 뒤 쇼핑 관련 필드와 메서드를 구성하겠죠.

사람이라는 구체적인 대상을 내가 필요한 것들 위주로 뽑아내서 재구성하는 것이 추상화입니다.

이 과정을 모델링이라고도 합니다.

추상화 과정을 거치면 필요한 정보들만 골라서 설계할 수 있으므로 직관적입니다.

그리고 이 과정을 거친 결과물이 클래스입니다.

 

2.4. 다형성(Polymorphism)

 

다형성은 오버라이딩(Overriding)과 오버로딩(Overloading)으로 구현할 수 있습니다.

오버라이딩과 오버로딩의 차이는 무엇일까요? 😶

처음 공부할 때는 이 둘이 참 헷갈렸는데요.

1개를 계속 사용하느냐, 여러 개를 만드냐로 구분하니 이해가 쉬웠습니다. 😮

더 자세히는 메서드를 재정의하느냐 중복해서 '' 정의하느냐 차이입니다.

오버라이딩은 상위 클래스의 메소드를 새롭게 작성해서 사용하는 것입니다.

오버로딩은 상위 클래스의 메소드는 그대로 두고,

이름은 똑같지만 매개변수가 다른 메소드들을 여러 개 정의하는 것입니다.

오버라이딩을 예시로 다형성을 설명한다면,

동물 클래스의 Cry()라는 메서드를 강아지, 고양이 클래스가 상속받아 오버라이딩합니다.

Cry()함수만 호출하더라도 강아지는 "멍멍", 고양이는 "야옹"하고 동작하도록 구성할 수 있게 됩니다.

이렇게 다형성을 이용하면 편리한 장점이 있습니다.

 

References

gmlwjd9405.github.io/2018/07/05/oop-features.html

 

[Java] OOP(객체지향 프로그래밍)의 특징 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

김종민 저, 스프링 입문을 위한 자바 객체 지향의 원리와 이해

'객체 지향 프로그래밍 > OOP' 카테고리의 다른 글

객체지향 설계원칙 이해하기  (0) 2021.03.07