본문 바로가기
Language/Java

객체지향(OOP)의 특징

by 김짜이상 2022. 4. 17.

OOP란? 

OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍. 즉, C언어 같은 절차 지향적인 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다.

OOP는 객체를 기준으로 코드를 나누어 구현한다. 자바의 경우 그 구성 부분 단위가 클래스이다. 자세히 말하자면 클래스는 설계도고 직접 일을 하는 구현체는 인스턴스다. (객체와 인스턴스는 또 자세히 말하면 다른 의미로 사용되기도 하기 때문에 여기서는 이렇게 말하겠다.)

요약하자면

  • OOP는 객체의 관점에서 프로그래밍 하는 것을 의미한다.
  • C언어는 절차 지향 프로그래밍인데, 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.
  • OOP는 절차지향에 비해서 사람의 사고방식과 더 가깝다.
  • OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.
  • 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍하는 것을 말한다.

자바 프로그래밍하면 객체지향프로그래밍 OOP(Object-Oriented Programming)이라 해도 무방하다.

OOP의 특징

1. 캡슐화 (Encapsulation)

캡슐화란

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미한다.
  • 따라서 클래스를 우리가 만들 떄 훗날 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야 할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야 한다.

정보은닉

그리고 캡슐화를 하는 중요한 목적은 바로 정보은닉이다. 유저 정보를 가지고 있는 User라는 객체에서 유저의 정보가 public으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있다. 그렇기 때문에 private로 해서 데이터를 보호해서 접근을 제한해야 한다.

이렇게 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적이다.(setter도 아무 생각 없이 만들면 안 된다.)

2.추상화(Absatraction)

추상화란

목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념

개념설명

세상에 있는 것을 본떠 클래스를 만들고 그 클래스의 상태와 행동을 부여한 객체를 만든다.

그러나 세상에 모든 것을 다 클래스에 담고 객체를 만드는것은 불가능하다. 그래서 추상적으로 생각해 일단 큰 틀의 클래스를 구현하고 거기에 최소 이러한 공통적인 요소나 필수 적인 요소는 들어갔으면 하는 바람에서 만든 것이 추상클래스이다.

 

3.다형성(Polymorphism)

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 준다. 즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다(같은 동작이지만 다른 결과물이 나올 때 다형이라고 생각하면 된다.).
이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와준다.

개념설명

예를 들면, 고양이 클래스에는 울음이라는 속성이 정의되어 있다고 하면,
사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속받는다 하면, 사자 클래스에도 "울음"이라는 속성이 자동으로 추가된다.
이것을 상속이라고 한다.

그런데 고양이와 사자의 울음소리는 다르다. 같은 "울음" 속성임에도 실제 울음소리는 다르죠.

이런 것이 다형성이라고 말할 수 있다.

 

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

  • 상속이란 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념이다.
  • 기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.
자바에선 상속은 단일 상속밖에 지원이 안되며, C++에선 다중 상속이 지원된다. 이 때문에 말이 많아 원래 자바 쪽에서는 다중상속이 객체지향적인 관점에서 크게 유효하지 않다고 생각하지만, 다중 상속이 필요할 순 있다고 인정하여 대비책으로 인터페이스를 다중 상속(구현) 할 수 있게 해서 임시적인 다중 상속에 대한 활로는 뚫어 줬다.
그러나 인터페이스의 존재 이유가 다중 상속을 지원하기 위함이다라고 생각하면 안 된다.

개념정리

실제 세계에서 부모로부터 여러 가지를 상속을 받는데, OOP에서도 가능하다. OOP에서 이를 부모 클래스, 자식 클래스라고 표현한다.

예를 들어, 고양이 클래스와 강아지 클래스가 있다고 했을 때, 고양이와 강아지는 모두 포유류에 해당한다.
포유류는 여러 속성들이 정의되어 있는데 고양이와 강아지는 포유류의 이런 속성들을 갖고 있다.
하지만 아주 많은 속성이 다르기 때문에 좀 더 디테일하게 고양이, 강아지로 종을 나눈 것이다.

즉. 포유류라는 클래스는 고양이와 강아지 클래스에 속성들을 물려준다. 이것을 상속이라고 하고, 포유류와 고양이 포유류와 강아지 클래스는 상속 관계에 있다고 한다.

상속이 필요한 이유

상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
코드의 중복이 많아지면 개발 단계에서도 피곤하지만, 유지 보수에서도 많은 비용이 들게 된다.
그래서 개발을 할 때 코드의 중복은 반드시 피해야 한다.

OOP에서는 상속을 통해 코드의 중복 문제를 일부 해결할 수 있다.
포유류 클래스에 여러 속성들을 정의해 놓고 포유류에 해당하는 종, 예를 들면 강아지 클래스가 필요한 경우 포유류 클래스와 상속 관계를 맺는다.
상속 관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.
이것이 상속이 필요한 이유이다.

 


출처 : https://velog.io/@hkoo9329/OOPObject-Oriented-Programming-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%EB%9E%80

반응형

'Language > Java' 카테고리의 다른 글

상속(extends) vs 구현(implements)  (0) 2022.04.17
Interface vs Abstract Class  (0) 2022.04.17
Java 프로그램 실행 과정 (JVM 동작 원리)  (0) 2022.04.17
GC 동작 원리  (0) 2022.04.17
객체 지향 설계 5가지 원칙 (SOLID)  (0) 2021.12.26