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

+ Recent posts