Java의 OOP 특징에 대해 알아보자!

LSM ·2022년 2월 23일
0

작성 배경 :

방학기간 Java에 대해 복습 하던 중 자바 언어가 가지는 객체지향적 특징에 대한 이해에 혼동이 생겨 이를 바로 잡기 위해 작성하는 글이다!!


OOP란 ?

OOP (Object Oriented Programming: 객체지향개발) 으로 우리가 흔히 알고있는 Java나 Python은 OOP의 일종이다. 추가적으로 한때 나는 OOP의 반대말로 POP (Procedure Oriented Programm) 즉 절차지향개발을 생각했던적이 있었다. 그런데 지금 와서 생각 해 보면 반대의 개념이라기 보다는 다른 개념인 듯 하다! (이 부분에 대해 잘 알고 계시는 분은 댓글로 남겨주세요! ㅎㅎ)


OOP의 특징 5가지!

1) 추상화(Abstraciton)

출처 : https://velog.io/@jinan159/1.-객체지향

추상화란 ! 공통의 속성이나 기능을 묶어 이름을 붙이는 것이라고한다.

객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있다.

위 사진의 예시를 통해 좀 더 살펴보면

포유류와 조류의 공통적인 속성과 메소드를 동물 객체로 추상화 하였다고 할 수 있다.

즉 추상화란 객체 지향적 관점에서 정리하자면,

하위 객체들의 공통적인 속성, 메소드를 추출하여 상위 객체로 만드는 것이다.

이는 객체 모델링 이라고도 한다.

2) 캡슐화(Encapsulation)

사진 출처 : https://velog.io/@hansoleee/객체-지향-프로그래밍-입문-캡슐화

캡슐화란 실제로 구현되는 부분을 외부에 드러나지 않도록 캡슐로 감싸 이용방법만을 알려주는것이다!

데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것.
다시 한번 말하자면 변수와 함수를 하나로 묶는것을 말한다.

하지만 무작정 한대 묶으면 되는 것이 아니라 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야한다.

또한 데이터를 절대로 외부에서 직접 접근을 하면 안되고 오로지 함수를 통해서만 접근해야하는데 이를 가능하게 해주는 것이 바로 캡슐화이다.

캡슐화를 통해 묶고 숨김을 생각해 보았다.

그런데 왜 묶어야 하고 숨겨야 하는 것일까??

먼저, 묶음으로 인해 프로그램을 바라보는 단위가 커진다. 이전의 프로그래밍 언어인 C언어는 프로그램을 함수 단위로 구조화할 수 있으나, 프로그램 소스가 커지면 이해하기 어렵고 관리가 힘들어 질 수 있었다.

그러나 객체지향 프로그램에서는 프로그램 소스를 클래스 단위로 바라보게 됨으로써 좀더 복잡하고 커다란 소스코드도 쉽게 이해하게 되었다.

왜냐하면 클래스 내부에 여러 함수를 내포할 수 있기 때문에 프로그램 소스 코드를 바라보는 단위가 커졌으며, 그로 인해 프로그램 관리가 좀 더 수월해진 것이다.

두번째, 내부를 숨김으로써 내부를 좀더 자유롭게 변경할 수 있게 되었다.

이전의 함수 중심적인 구조적 프로그래밍 언어에서는 프로그램 내부에서 데이터가 어디서 어떻게 변경되는지 파악하기 어려웠고, 그로 인해 유지 보수가 힘들었기 때문에 자료를 중심으로 함수가 종속되는 구조가 되기도 하였다.

객체 지향에서는 클래스 내부의 데이터를 외부에서 참조하지 못하도록 차단하여 이러한 폐단을 없앨 수 있다.

이렇게 내부의 데이터나 함수를 외부에서 참조하지 못하도록 차단하는 개념을 정보 은닉Information Hiding)이라고 하며 이것이 바로 캡슐화라는 개념이다.

3) 은닉화 (hiding)

은닉이란 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 은닉(hiding) 혹은 격리(isolation)시키는 것이다!

격리에 방법으로 변수에 접근지정자를 private 로 지정하는 방법이 있다.

이러한 변수는 setter , getter 를 사용해 변수의 접근, 제어한다!

은닉화는 캡슐화에 비해 비교적 구체적인 개념이다.

은닉화는 캡슐화의 한 개념으로 객체 외부에서 객체내의 자료로의 접근을 제한하고 데이터를 수정,조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 결과만 받는것이다.

이렇게 되면 외부에서는 내부적인 움직임을 알수가 없으며 데이터에 어떤값이 있는지 또는 어떤 변화가 일어나는지 알수없다. 단지 데이터의 접근을 메서드(setter , getter)를 통해 결과만 받을뿐이다.

이런한 것을 은닉화라 한다

  • 흔히 캡슐화와 혼용된다. 아래 예시를 보며 이해해보자!

사진 출처 : https://blog.daum.net/gk468401/6

4) 상속성, 재사용(Inheritance)

OOP에서 상속이란?! 상위 개념의 특징을 하위 개념이 물려받는 것이다.

객체지향의 가장 핵심 요소라고 볼 수 있는 특징이다!

간단히 예를 들자면, 자동차라는 부모클래스를 만들면,

벤츠나 람보르기니는 자동차라는 공통적인 특징을 상속받고, 해당 회사에서 가진 고유의 특징을 덧붙혀 자식 클래스를 형성 할 수 있다.

즉 이런식의 상속이 가능해 지면, 재사용으로 인해 코드가 줄어든다. 하위 클래스에서 속성이나 오퍼레이션을 다시 정의하지 않고 상속받아서 사용함으로써 코드가 줄어든다. 그리고 좀 더 범용성있게 사용할 수 있다.

참고로 하위 클래스는 상위 클래스가 가지고 있는 모든 자료와 메소드를 물려받아 자유롭게 사용할 수 있지만, 또한 자신만의 자료와 메소드를 추가적으로 덧붙임으로써 새로운 형태의 클래스로 발전하게 된다!!

사진 출처 : https://www.fun-coding.org/PL&OOP1-6.html

5) 다형성(Polymorphism)

OOP에서의 다형성은 '여러 클래스들이 동일한 이름의 오퍼레이션을 서비스하도록 하는 것'이라고 한다.

이러한 다형성은 실제의 코드에서는 '하나의 클래스 내부에 같은 이름의 오퍼레이션을 여럿 정의하거나, 상위 클래스의 오퍼레이션을 하위 클래스에서 다시 정의함(Overriding)'으로써 구현한다.

예를 들어보자!

상위클래스인 Object클래스에 run을 하위 클래스인 Car 에서도 run 을 정의한다.

이렇게 상위 클래스에 있고 상속받았으나 하위 클래스에서 다시 정의하는 것을 메소드 오버라이딩(Method Overriding)이라고 하며, 메소드 오버라이딩이 곧 다형성이다.

그리고 동일한 이름의 오퍼레이션이 여러개 정의되어 있는데 단지, 매개변수의 타입에 따라 서로 구분될 수 있다. 이렇게 클래스 내부에 동일한 이름의 오퍼레이션을 여럿 정의하는 것이 바로 메소드 오버로딩(Method Overloading)이라고 하는 다형성이다.

즉 ! 다형성 = 메소드 오버라이딩&오버로딩


출처 자료 :

https://beerntv.wordpress.com/2017/01/18/0118-추상화-캡슐화-은닉/

profile
개발 및 취준 일지

0개의 댓글