꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

JAVA

객체 지향 언어란? (Object Oriented Language)

gold_dragon 2021. 6. 17. 00:14

1. 객체 지향 언어란 뭘까?

객체지향프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나입니다. 컴퓨터 프로그램의 명렁어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 '객체'들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있습니다. 이러한 객체 지향 프로그래밍에서 사용하는 언어를 객체 지향 언어라 합니다.

2. 객체가 뭔데?

객체 지향 프로그래밍을 구성하기 위해서는 '객체'가 필수적입니다. 실제 세상에서 사물의 개념을 프로그램에서 객체라고 볼 수 있습니다. 사람을 예로 들면, 사람 한 명이 있습니다.. 그리고 그 사람은 이름 혹은 나이, 주민등록번호 등의 정보를 갖고 있고, 걷거나 뛸 수 있습니다. 이 예에서 사람 한 명이 하나의 객체가 됩니다. 그리고 객체는 이름, 나이 혹은 주민등록번호와 같이 상태(state)를 갖고 있으며, 걷거나 뛰는 행위(behavior)를 할 수 있습니다.

 

사람 뿐만 아니라 자동차도 객체가 될 수 있으며, 시속 50km/h로 주행중인 상태 그리고 가속을 하는 행위를 갖을 수 있습니다. 이렇듯 모든 사물을 각각의 객체로 나눌 수 있고, 행위를 찾아 낼 수 있습니다.

 

객체 지향 언어 중 하나인 Java에서는 객체를 생성하기 위해 설계도 역할을 하는 class를 만듭니다.

public class Person {
  String name;
  int age;
  
  public Person() {
  }
  
  public void run() {
    // 생략
  }
}

그리고 다음과 같이 객체를 생성할 수 있습니다.

Person geumyong = new Person();
Person dragon = new Person();

이렇게 실제 사물을 나타내기 위한 것을 객체라고 하며, 인스턴스라고 부르기도 합니다.

3. 객체 지향 언어는 다음과 같은 특징을 갖습니다.

a. 캡슐화

캡슐화란 변수와 함수를 하나의 단위로 묶는 것을 의미합니다. Java에서 이러한 데이터 번들링은 class를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메서드에 쉽게 접근할 수 있습니다. 이러한 캡슐화를 통해 정보 은닉을 할 수 있습니다. 데이터와 코드의 형태를 외부로부터 알 수 없게 합니다. 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높입니다.

b. 상속

상위 클래스의 모든걸 하위 클래스가 모두 이어 받는 개념을 갖고 있습니다. 상속을 통해서 캡슐화를 유지하면서 클래스의 재사용을 가능토록 합니다.

c. 다형성

상속과 연관된 말로, 한 객체가 다른 여러 상태와 행위로 재구성될 수 있습니다. 오버로딩(overloading)와 오버라이딩(overriding)이 하나의 예입니다.

* 오버라이딩: 상위 클래스가 갖고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술

* 오버로딩: 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

4. 객체 지향 언어의 장점이 뭘까

a. 재사용성

상속을 통해서 프로그래밍 시 코드의 재사용을 높일 수 있습니다.

b. 생산성 향상

잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킵니다. ctrl + v 신공은 나중에 수정사항이 생겼을 때 일일히 찾아서 바꿔주어야 되지만, 클래스는 한 곳에서만 바꾸면 됩니다.

c. 자연적인 모델링

실세 세상의 사물들을 하나의 객체로 생각하며 프로그래밍이 이루어지기 때문에 클래스를 구현할 때 일상생활의 모습과 대비시키며 자연스럽게 구현할 수 있습니다.

d. 유지보수의 우수성

캡슐화로 인해 모듈끼리의 의존성이 떨어집니다. 그렇기에 프로그램 추가 및 수정와 같은 유지보수에 용이합니다.

5. 객체 지향 언어의 단점은?

a. 개발 속도가 느립니다.

상속과 같은 개념은 유지보수에 용이하지만, 그만큼 다중 상속이 되면 복잡해집니다. 이에 설계 단계에서 클래스끼리의 관계를 정확하게 이해할 필요가 있기 때문에 개발 속도가 늦어질 수 있습니다.

b. 실행 속도가 느립니다.

거의 대부분의 객체지향 언어에서 기능을 묶으면 함수 호출이 추가로 들어가거나 계산식 중간에 포인터 연산 등이 필요해집니다. 멤버 함수 같은 경우 어느 객체의 함수인지 지정해야 하기 때문에 추가 포인터 크기와 연산 비용이 들어갑니다. 때문에 절차적 프로그래밍보다 무겁습니다.

c. 코딩난이도가 상승합니다.

다중 상속은 개발자들에게 많은 고민거리입니다. 상속을 통해서 중복을 없앨 수 있지만, 그만큼 상위 클래스와 하위 클래스간의 관계를 인지하고 있어야 합니다.


※ 참조

- 위키백과 <객체 지향 프로그래밍>

- 나무위키 <객체 지향 프로그래밍>

- https://radait.tistory.com/4 객체지향언어란? [특징, 장점, 단점, 종류]

- https://private.tistory.com/25 오버로딩과 오버라이딩

- 이상민 <자바의 신 1>

 

'JAVA' 카테고리의 다른 글

객체 지향의 4대 특성  (0) 2021.10.03
객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2021.10.03
자바 프로그램 개발과 구동  (0) 2021.09.14
Java 변수  (0) 2021.09.10
클래스와 객체  (0) 2021.09.09