Blog For Me

[자바] 객체지향(oop) 특징 4가지 본문

언어/자바

[자바] 객체지향(oop) 특징 4가지

PureStack 2022. 2. 13. 23:07
OOP의 4가지 특징

1. 캡슐화(Encapsulation)
2. 상속(Inheritance)
3. 다형성(Polymorphism)
4. 추상화(Abstraction)

1. 캡슐화

  • 캡슐화는 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 가장 본질적인 특징이다.
  • 외부의 잘못된 접근으로 값이 변하는 것을 방지하기 위해 클래스 내의 변수나 함수를 감추거나 드러내는 은닉성을 지니고 있다.
  • 객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분만 공개 노출한다.
  • 캡슐화는 public, private, protected와 같은 접근 지정자 키워드를 이용하여 실현한다.

예를 들어, 사람이라는 클래스가 있고 그 안에 뇌, 장기, 혈관, 뼈 등의 변수들이 있다고 가정해 보자. 이때, 이러한 사람의 변수들이 캡슐화 되어 있지 않고 전부 외부로 노출된다는 것은 생각만 해도 끔찍하다. 그래서 이러한 중요 부위들을 보호하고 위해 피부와 근육으로 캡슐화하고 있다. 그리고 은행 계좌의 잔고와 같은 예민한 정보들을 private으로 선언해서 외부에서의 접근을 원천 차단하여 getter/setter와 같은 간접적인 방식으로만 접근 가능하도록 하는 것 또한 캡슐화의 일종이라 볼 수 있다.

2. 상속

  • 상속은 상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지는 관계이다.
  • Java의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extends) 하는 개념이다. 여기서 부모 클래스를 슈퍼 클래스(super class) 라 하고, 자식 클래스를 서브 클래스(sub class) 라 한다.
  • 상속은 슈퍼 클래스의 변수와 함수를 물려받아 코드를 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄일 수 있다.

class Human {
    String gender;
    String country;

    void eat() { ... }
    void sleep() { ... }
}

class Kim extends Human {
    String name;
    int age;

    void work() { ... }
    void talk() { ... }
}


Human 클래스를 물려받은 Kim 클래스를 작성한 사례이다. Human 클래스는 gender, country 변수와 eat(), sleep() 함수의 4개 속성으로 구성된다. 여기서 Kim 클래스는 Human 클래스를 물려받기 때문에, Huamn 클래스 4개 속성에 name, age, work(), talk()등 Kim 클래스에서 추가로 작성한 속성을 모두 가진다.

3. 다형성

  • 다형성은 같은 이름의 함수가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 의미한다.
  • 코드의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와주는 개념이다.
  • 같은 동작이지만, 상이한 결과물을 나타내는 특성이라 볼 수 있다.
  • 오버로딩(Overloading) : 하나의 클래스 내에서 이름이 같지만 서로 다르게 동작하는 함수를 여러 개 만드는 개념이다. 오버로딩이 가능하게 하기 위해서 함수의 이름은 같지만 매개변수 개수나 리턴 타입이 다르면 오버로딩이 적용된다.
  • 오버라이딩(Overriding) : 부모 클래스에 구현된 함수를, 자식 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 개념이다.

예를 들어, 사람은 누구나 말할 수 있지만 소통 언어가 다르다. 이를 테면, 한국인은 한국어, 미국인은 영어, 일본인은 일본어, 중국인은 중국어를 사용하는 것처럼 사람이 말을 해도 국적에 따라 사용하는 언어는 상이하다. 이처럼 말하는 동작이 어느 집단에 속해 있는지에 따라 다르다는 것은 다형성의 사례를 보여주는 것이라 볼 수 있다.

4. 추상화

  • 추상화는 복잡한 자료, 모듈, 시스템으로부터 핵심적인 개념 또는 기능을 추려내는 것이다.
  • 추상 클래스는 서브 클래스에서 필요로 하는 대부분 기능을 구현하여 두고, 서브 클래스가 상속받아 활용 가능하도록 하되, 서브 클래스에서 구현할 수 밖에 없는 기능만을 추상 함수로 선언하여, 서브 클래스에서 구현하도록 하는 목적으로 사용한다.
  • 클래스들의 중요하고 공통된 기능들을 추출하여 슈퍼 클래스로 선정한다.

예를 들어, 스마트폰에는 아이폰, 갤럭시, 샤오미, 비보, 오포 등과 같은 여러 브랜드가 있고, 아이폰 내에서도 아이폰 13, 아이폰 12 프로, 아이폰 12 프로 맥스와 같은 여러 기기들이 존재한다. 이들을 모두 클래스화하고 변수, 함수들을 개별적으로 모두 만드는 것은 비효율적이다. 그래서 스마트폰들의 공통적인 요소나 특징을 추출하는 추상화 과정을 거치는 것이 효율적이다. 예를 들어, 스마트폰에는 배터리, 카메라 렌즈, 액정 등의 부품들을 지니고 있고, 전원 켜기, 전화 걸기, 문자 메시지 보내기, 어플 다운받기 등의 공통적인 기능, 즉 어떤 스마트폰이라도 필수적으로 요구되는 함수들이 추출된다. 이러한 과정을 추상화 과정이라 하고, 추상적으로 추출한 개념들을 클래스로 만든 것이 추상 클래스이다.


이상으로 객체지향의 4가지 특성에 대해 정리해 보았다.

'언어 > 자바' 카테고리의 다른 글

[자바]객체지향 프로그래밍  (0) 2022.01.17
Comments