2.객체지향 언어 특징

객체지향 언어(Object Orientied Language) 특징

1. 캡슐화

짧게 정리하면 데이터(정보)와 데이터를 다루는 방법(메소드)를 결합시켜 묶는 것.

이는 더욱 깊게 들어가면 코드를 재수정 없이 재활용 하는 방법이라고 설명 할 수 있다.

프로그램 코드를 재활용 하려고 하는데 기능(함수/프로시저 : 메소드)이 분산되어 있고 특성(변수 : 데이터)이 분산 되어 있는 프로그램 코드는 재활용을 하기 매우 힘들다. 이 때문에 관련 기능과 특성을 한곳으로 모으고 분류할 필요성이 있다.

  • 클래스 & 인스턴스

객체 지향에서는 이렇게 계층적으로 분류한 기능과 특성의 모음을 클래스(Class)라는 캡슐(capsule)에 분류된 집단 별로 각각 집어 넣는다. 이러한 클래스를 실체화(Instance) 하면 객체(Object)를 만들수 있다.

붕어빵 틀 = 클래스

붕어빵 = 객체(인스턴스)

2. 상속

사실 클래스 이전의 프로그래밍 기법에선 코드 재활용이 불가능하지는 않았다. 예전에도 라이브러리 등을 통해서 남이 짜놓은 코드를 그대로 가져올 수 있었다.

  • '라이브러리'의 문제점

라이브러리는 코드의 재활용에 지대한 영향을 미쳤지만 치명적인 단점이 있었다. 라이브러리의 기능을 약간 바꾸어야 할 경우 라이브러리의 소스를 변경해야 했고 이 때문에 전혀 다른 라이브러리가 되어 버린다는 것이다. 이것은 라이브러리 버전에 따라 그 라이브러리를 사용하는 프로그램이 동작을 안할수도 있다는 것이고 불필요한 코드의 수정작업을 해야 한다는 것이다.

  • '상속'의 도입

객체 지향 프로그램에서는 이 문제를 해결하기 위해 "상속"을 도입 했다."포용성"으로 이전의 라이브러리보다 더 논리적이고 체계적으로 기능과 데이터를 계층적으로 분류해서 사용의 편의성을 도모하면서, 상속을 사용해 부모 클래스의 특성과 기능을 그대로 이어받고 기능의 일부분을 변경해야 할 경우 상속 받은 자식 클래스에서 그 기능만을 다시 정의하여 수정하게 하였다. 이러한 작업을 "덮어쓰기(재정의 : Override)"라고 한다.

 

3. 다형성

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다. 위에서 설명한 오버라이딩 이외에, 변수에 따라 함수의 기능이 달라지는 오버로딩도 여기에 해당한다.

  • 연산자 오버로딩

C++, C# 등에서는 기본 연산자를 오버로딩해서 기본 연산자가 해당 클래스에 맞는 역할을 수행하게 하는 것도 가능하다. JAVA 등에서는 연산자의 오버로딩이 불가능하다. 펄 6나 스몰토크, F# 등, 연산자의 신규 정의가 가능한 언어도 있다.

 

 

 

'Java' 카테고리의 다른 글

싱글톤 (Singleton)  (0) 2020.08.19
1. Java란  (0) 2018.07.26
2. 변수자료형연산자  (0) 2017.03.16
1. 기본 입출력  (0) 2017.03.16
1.Java란

JAVA

자바(Java)를 짧게 설명하자면 우리 제임스 고슬링 형님께서 가전 제품내에 동작하는 프로그램을 만드는 용도로 개발하신 객체지향언어 이다.

 

객체 지향 프로그래밍(Object Oriented Programming), OOP

프로그램 을 어떻게 설계해야 하는지에 대한 일종의 개념이자 방법론

 

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체들의 상호작용으로 서술하는 방식

 

기존 절차적 프로그래밍에서는 메소드를 기계, 데이터를 원료로 생각해서 데이터가 메소드 사이를 통과하면서 차츰 순서대로 가공돼 나가는 방식으로 이해한다면 객체 지향 프로그래밍에서는 데이터를 중심으로 메소드가 데이터에 접근해서 수정한다는 개념이다. 즉 원료가 움직이냐 기계(함수, 메소드)가 움직이냐의 차이.

 

절차적 프로그래밍 vs 객체 지향 프로그래밍

 절차 지향 언어객체 지향 언어
장점1. 완성된 코드의 실행처리 속도가 빠르다.
2. 초기 프로그래밍 언어로 컴퓨터의 구조와 비슷해 속도가 빠르다.
1. 코드 재사용 용이
2. 코딩이 간단
3. 유지보수가 쉽다.
4. 대형 프로젝트에 좋다.
단점1. 유지보수가 어렵다.
2. 분석이 어렵다.
3. 대형 프로젝트에 부적합
1.처리속도가 상대적으로 느림
2.객체가 많으면 용량이 커질 수 있다.
3.설계 시 많은 시간이 투자 된다.
4. 설계 실패 시 처음부터 다시 시작

출처 : http://hunit.tistory.com/151

그럼 같은 객체 지향 언어인 c++ 과 차이점이 뭘까?

c++은 c언어의 로우 레벨의 시스템 프로그래밍의 강점 + 객체 지향 언어의 하이 레벨 기능들을 포함

Java는 포인터라는 강력한 무기를 포기하는 대신, 객체 지향(oop)에 집중하여 언어적 완성도를 높임

 

C++ vs JAVA 비교

1.상속

c++는 다중 상속 지원, Java는 다중 상속 지원x

다중 상속을 할 때, 다이아몬드 문제가 발생하는데, c++은 이를 회피할 수 있는 기능을 제공(virtual)

 

다이아몬드 문제

다중 상속을 하면 일어나는 문제가 있는데 그것은 다이아몬드 문제가 발생한다.

만약 A가 print()라는 메소드가 있다고 가정하자. 그럼 B와 C도 print() 라는 메소드를 보유하고 있을 것이다..

이 때 D의 인스턴스를 만들고, print() 메소드를 사용 할 경우, 모호(ambiguous)가 발생하며 메소드를 수행하지 못할 것이다.

이는 B가 상속받은 A의 메소드인지 , C가 상속받은 A의 메소드의 것을 사용하는지 모호하기 때문이다.

그래서 virtual키워드를 통해 A의 print() 메소드를 명시해 주어 모호하지 않게 해주는 것이다.

 

1.2 friend 키워드

c++은 friend 키워드 지원, Java는 지원 x

예를 들어 A클래스가 B클래스를 friend키워드를 통해 명시하면, A가 private로 데이터 또는 메소드를 접근제어자로 명시해도 B는 접근이 가능하다.

 

1.3 Interface

Java는 다중 상속이 없는대신, Interface를 통해 흉내낼 수 있다. 또 한 Interface는 상속이 아닌 구현이기 때문에

모든 추상 메소드를 구현 해야만 하기 때문에 다이아몬드 문제가 발생하지 않는다.

 

참고로, Interface는 상수와 추상 메소드로만 이루어짐.

 

2. 메모리 처리

앞서 JVM에 대해 소개했듯, JAVA와 C++의 메모리 처리(이런 '용어'를 써도 되는지 모르겠다.)에도 차이가 있는데...

첫째로, JAVA는 객체를 메모리의 Heap영역에만 할당할 수 있으나, C++의 경우 Heap과 Stack영역 모두에 할당이 가능하다. C++에서 new 키워드를 통해 객체를 생성하면 Heap영역에 객체가 할당되고, 일반적인 변수 선언 방식을 택하면 Stack영역에 할당이 된다. JAVA에서는 일반적인 변수 선언 방식으로 객체를 생성할 수 없다. (http://preamtree.tistory.com/28 [스크랩자료]Heap과 Stack의 비교)

둘째로, JAVA는 메모리(Heap 영역) 해제가 자동으로 이루어지지만, C++은 프로그래머가 수동으로 해야한다. JAVA에서는 Garbage Collector가 미사용 객체 등의 자원을 자동으로 해제하며, 프로그래머는 수동으로 GC를 조작할 수 없다. C++에서는 Destructor(소멸자)를 통해 메모리 해제가 가능하다.

 

3. 문법 및 기능

첫째로, C++에서는 연산자오버로딩을 지원하지만, JAVA는 그렇지 않다. 연산자 오버로딩은 단어 그대로 연산자를 재정의 하여 활용한다는 것인데, '객체'간 연산에 활용할 수 있다. (이를테면, *연산을 재정의하여 객체와 객체를 * 연산처리 할 수 있다.) JAVA는 만들어질 때부터 이러한 연산자 오버로딩을 지원하지 않는 방향으로 개발되었다고 한다.

 

둘째로, JAVA는 익명클래스(Anonymous Class)를 지원하지만, C++의 경우 그렇지 않다. 익명클래스는 JAVA에서 지원하는 기능인데, 말 그대로 이름이 없는 클래스이다. 인터페이스의 메소드 중 하나만 재정의하고 싶을 때 자주 사용되며, 클래스의 선언과 객체의 생성이 동시에 이루어지는 형태를 띄고 있다. JAVA는 익명클래스를 통해 '함수형 프로그래밍'의 형태를 어느 정도 흉내낼 수 있다.

셋째로, JAVA는 동적바인딩(Dynamic Binding)을 택하고 있지만, C++은 정적바인딩(Static Binding)을 택하고 있다. 하지만 C++이 정적바인딩만 지원하는 것은 아니고, virtual 키워드를 통해 동적바인딩을 지원한다.

※ 요약

  1. C++은 연산자오버로딩 지원, JAVA는 지원하지 않음.
  1. JAVA는 익명클래스 지원(함수형 프로그래밍을 어느정도 구현), C++은 지원하지 않음.
  1. JAVA는 동적바인딩, C++은 정적바인딩(virtual 키워드로 동적바인딩 가능)

 

기능c++Java
다중상속가능불가
Friend class가능불가
Interface불가가능
객체 생성stack, heapheap
Garbage Collection수동자동
연산자 오버로딩가능불가
익명클래스불가가능
바인딩 방식동적동적, 정적

출처:

http://preamtree.tistory.com/6

[Preamtree의 행복로그]

'Java' 카테고리의 다른 글

싱글톤 (Singleton)  (0) 2020.08.19
2. 객체지향 언어 특징  (0) 2018.07.26
2. 변수자료형연산자  (0) 2017.03.16
1. 기본 입출력  (0) 2017.03.16
Spring 한글 깨짐 현상

Spring 한글 깨짐 현상

 

'Spring' 카테고리의 다른 글

Spring 중복 로그인 (세션바인딩 리스너) 정리  (4) 2019.04.26
DI 설정 방법 - xml  (0) 2018.09.06
DI 설정 방법 - JAVA  (0) 2018.09.06
DI 설정 방법 - Java & xml 같이 사용  (0) 2018.09.06

+ Recent posts