객체 지향 프로그래밍이란 우리가 실생활에서 쓰는 모든 것을 객체라 하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하며 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말합니다. 현재 제가 주로 사용하는 언어인 JAVA도 객체지향 언어이기 때문에, 자연스럽게 OOP(Object-Oriented Programming)에 대해 공부하게 되었습니다.
절차 지향
- 절차지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다.
- 프로그램을 기능 중심으로 바라보는 방식으로 '무엇을 어떤 절차로 할 것인가?'가 핵심이 된다.
- 즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춘다.
객체 지향
- 객체 지향 기법은 현실 세계의 개체를 기계의 부품처럼 하나의 객체로 만들어, 기계적인 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때에도 객체들을 조립해서 작성할 수 있도록 하는 기법이다.
- 객체 지향 모델링은 기능이 아닌 객체가 중심이 되며 '누가 어떤 일을 할 것인가?'가 핵심이 된다.
- 즉, 객체를 도출하고 각각의 역할을 정의해 나가는 것에 초점을 둔다.
객체 지향 VS 절차 지향
대형 프로그래밍의 경우 많은 기능을 수반하기 때문에 각 객체가 하는 역할이 많아도, 많은 역할을 객체로 묶을 수 있는 객체지향이 적합하다. 반대로 소형 프로그래밍의 경우 작은 기능을 수반하기 때문에 작은 기능을 객체별로 나눌 경우, 오히려 복잡해질 수 있어서 절차지향이 적합하다.
클래스와 객체
OOP란 현실 세계를 프로그램의 설계에 반영하는 것이다. 쉽게 이해를 돕기 위해 우리가 일상적으로 사용하는 단어인 '숙소'를 예시로 들어보려 한다. 제주도 여행을 해보신 분은 알겠지만, 숙소에는 '게스트 하우스', '호텔', '민박' 등 하위 카테고리들이 존재한다. 우리가 만약 제주도 여행객들이 숙소를 예약하는 에어비앤비 프로그램을 만든다고 가정하면, 먼저 숙소가 무엇인지부터 정의해야 한다.
일상적으로 우리는 여행을 갈 때 숙소를 필수로 잡는다. 그리고 숙소 중에서 하위 카테고리인 '게하','호텔','민박' 등을 선택하게 된다. 무의식적으로 '숙소'라는 포괄적인 개념을 떠올리고 하위 개념들을 선택하게 된다는 것이다. 이런 접근 방식은 우리에게 이미 일상적이고 익숙한 방법이다.
여기서 중요한 점은, 모든 하위 카테고리들은 상위 개념인 숙소의 특징을 모두 가지고 있다는 것이다. '게하', '호텔', '민박'은 숙소라는 개념의 특징을 그대로 가지며 자신들만의 고유한 특징을 추가적으로 가질 수 있다.
이런 식으로 개념을 추적해 나가면서 설계하는 것이 OOP의 기초다. 그리고 이때 게하, 호텔, 민박과 같은 개념들을 클래스(Class)라고 부른다. 그리고 시작점을 하위 개념으로부터 상위 개념을 만들어나가는 행위 자체를 추상화(Abstraction)라고 한다.
그렇다면 객체(Object)는 무엇일까? 잘 생각해보면 여행지에 호텔이 한 두군데 인가? 고유하다는 의미는 전 세계에 단 한 개만 존재하는 수준이다. 즉, 호텔이라는 클래스는 어떠한 실체가 있는 것이 아니라 우리가 일반적으로 생각하는 개념이고, 사업자 등록증을 내고 고유한 사업자번호를 가지는 특정 호텔이 바로 객체가 되는 것이다.
즉, 클래스는 일종의 설계도이고 이것을 사용하여 우리가 실제로 만들어 내는 행위가 객체이다.
객체 지향 프로그래밍의 특징
1. 추상화(Abstraction)
앞서 말한 개념과 같이 객체들의 공통적인 특징을 도출하는 과정이며, 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.
2. 상속성(Inheritance)
하나의 클래스가 가진 특징을 다른 클래스가 그대로 물려받을 수 있으며, 기존 코드를 재활용해서 사용할 수 있다. 한 가지 예시를 다시 한번 숙소로 들어보겠다.
class Lodging {
String nation = "Korea:'
String reserveMethod = "AirBnB";
}
class Hotel extends Lodging {
String name = "Java Hotel";
}
class Maing {
public Static void main (String[] args){
Hotel javaHotel = new Hotel();
System.out.println(javaHotel.nation);
System.out.println(javaHotel.reserveMethod);
System.out.println(javaHotel.name);
}
}
Korea
AirBnb
Java Hotel
Hotel 클래스를 생성할 때 extends를 사용하여 Lodging 클래스를 상속받았다. Hotel에는 국가와 예약방법에 대해 명시적으로 선언되지 않았지만 부모 클래스인 Lodging 클래스의 속성을 그대로 물려받은 걸 확인할 수 있다.
3. 캡슐화(Encapsulation)
실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다. 보통 public, private, protected 같은 접근 제한자를 사용한다. 또한, 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하며 데이터를 보이지 않고 외부와 상호작용을 할 때는 메소드를 이용하여 통신한다. 그리고 대게 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
class Hotel {
public String name;
private String address;
protected String ceoName;
public Hotel (String name, String address, String ceoName) {
this.name = name;
this.address = address;
this.ceoName = ceoName;
}
}
이렇게 클래스를 만들고 난 후, 객체를 생성해서 접근하려 하면 private로 선언한 address는 에러가 날 것이다. private 접근제한자를 사용하면 선언된 멤버 변수나 메소드는 클래스 내부에서만 사용될 수 있고 외부로는 아예 노출 자체가 되지 않는다.
4. 다형성(Polymorphism)
동일한 명령의 해석을 연결된 객체에 의존하는 것이다. Java에서 다형성을 위한 대표적인 기능은 바로 추상 클래스(Abstract Class)와 인터페이스(Interface), 그리고 오버 로딩(Overloading)이 있다.
오버 라이딩(Overriding) : 부모 클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의 하는 것.
오버 로딩(Overloading) : 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
인터페이스(Interface) : 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것. 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위한 방법
5. 동적 바인딩(Dynamic Binding)
- 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것이다.
- 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행된다.
- 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장한다.
OOP의 장점
1. 생산성 향상
객체지향 프로그래밍은 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 지향한다. 이미 만들어진 클래스를 상속받거나 객체를 가져다 재사용 또는 부분 수정을 통해 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다.
2. 실세계에 대한 쉬운 모델링
산업 전반에서 요구되는 응용 소프트웨어 특성상, 절차나 과정보다 관련된 많은 객체들의 상호 작용으로 묘사하는 것이 더 쉽고 적합하다.
3. 보안성 향상
객체 지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
OOP의 단점
1. 느린 실행 속도
객체 지향 프로그래밍은 캡슐화와 격리 구조 때문에 절차 지향 프로그래밍과 비교하면 실행 속도가 느리다.
2. 어려운 설계
모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가며, 설계면에 있어서 절차지향 프로그래밍보다 어렵다.
👨👩👦👦 오픈채팅방 운영
취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁
참여코드 : 456456
https://open.kakao.com/o/gVHZP8dg
👨💻 전자책 출간
아울러 제가 🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁
마치며
지금까지 객체지향 프로그래밍(OOP)에 대해 알아보았다. 필자도 OOP를 쓰면서 정확한 개념을 잘 알지 못했는데, 이번 기회에 포스팅을 하면서 더욱더 원리를 잘 이해할 수 있었다. OOP는 오랜 기간 동안 전 세계에서 사랑받는 설계 패턴이며, 현재 대한민국에 흔히 아는 네카라쿠배 또한 Java 언어를 기반으로 하기 때문에, OOP는 선택이 아닌 필수로 알아둬야 할 것 같다. 포스팅을 하면서도 부족한 부분이 많이 보여서 추후에 조영호 님의 객체지향의 사실과 오해를 독서하고 포스팅하려 한다.
JAVA 관련 포스팅
'TIL' 카테고리의 다른 글
Java Enum 클래스 (0) | 2022.05.19 |
---|---|
Java 추상 클래스와 인터페이스 구분 (0) | 2022.05.18 |
JPA 영속성 컨텍스트 정의 및 핵심요약 (0) | 2022.05.12 |
JPA의 정의와 장·단점 (0) | 2022.05.10 |
가짜 데이터 생성 Faker.js 파헤치기 (0) | 2022.05.03 |