[JAVA] JAVA는 어떤 것일까?

Van·2023년 5월 18일
0

Goal

  • JAVA의 컨셉을 간략하게 알아보자
  • OOP를 간략하게 설명할 수 있다
  • JAVA의 OOP를 알아보자

Introduction

JAVA를 공부하면서 JAVA가 가지고 컨셉이나 해결하고자 하는 점이 어떤 부분인지 그리고 철학 등을 알고 싶어져서 한번 알아보려고 합니다. 이전에 JavaScript를 배우면서 어떤 글에서 보았던 문장인데 '언어나 프레임워크를 그냥 배우려고 하지 말고 분명한 목적과 컨셉 그리고 해결하고자 하는 문제를 먼저 알고 배워야 한다' 이 문구가 저에게 큰 깨달음을 주었습니다. 이때부터 저는 언어나 프레임워크, 라이브러리 등을 배울때 컨셉이나 해결하려는 목적 등을 알려고 노력합니다.


JAVA?

자바(JAVA)는 썬 마이크로시스템지의 제임스 고슬링과 다른 연구원들이 개발한 객체 지향적 프로그래밍언어입니다. 1991년 그린 프로젝트(Green Project)라는 이름으로 시작해 1995년에 발표했다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발되었지만 현재는 웹 어플리케이션 분야에서 가장 많이 사용하는 언어 중 하나가 되었습니다. 제임스 고슬링이 언어를 개발했을 당시 주요 목표는 "한 번 작성하고 어디에서나 실행" 할 수 있도록 하는 것이었습니다.

초기의 자바의 개발자들은 유닉스 기반의 배경을 가지고 있었기 때문에 문법적인 특성은 C언어와 비슷하다.

자바를 다른 컴파일언어와 구분 짓는 가장 큰 특징은 컴파일된 코드가 플랫폼 독립적이라는 점입니다. 자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환환하고 바이트코드를 실행하기 위해서는 JVM(Java Virtual Machine)이라는 특수한 가상 머신이 필요한데, 이 가상 머신은 자바 바이트코드를 어느 플랫폼에서나 동일한 형태로 실행시키게 됩니다. 때문에 자바로 개발된 프로그램은 CPU나 운영 체제의 종류에 관계없이 JVM를 설치할 수 있는 시스템에서는 어디서나 실행할 수 있으며, 이러한 플랫폼의 독립성 때문에 큰 인기를 가지는 언어가 되었습니다.


JAVA의 철학

자바 언어는 5가지의 핵심 목표를 가지고 있다.

Simple, Object Oriented, and Familiar

  • JAVA의 기본 개념은 쉽게 파악되고 처음 개발을 시작하는 개발자도 높은 생산성을 발휘할 수 있다.
  • 복잡한 네트워크 기반 환경에서 프로그래밍 시스템은 객체 지향 개념을 사용해야 한다. JAVA는 사용하기 쉽고 효율적은 객체 기반 개발 플랫폼을 제공한다.
  • C++의 복잡성을 제거하고 객체 지향 언어의 특징만을 가져왔기 때문에 C++에 익숙한 개발자는 쉽게 적응할 수 있다.

간단하고 객체지향적이며 친근해야한다.
많은 개발자들은 필요에 따라 하나의 언어만 지속적으로 사용할 수도 있고 때에 따라서는 한번에 2가지 이상의 언어를 동시에 사용해야 하는 경우가 자주 있다. 이러한 경우에도 개발자의 생산성을 높이기 위해서 이러한 목표를 가지고 있다.

Robust and Secure

  • JAVA는 매우 신뢰할 수 있는 소프트웨어를 만들기 위해 설계되었다. 컴파일 타임 체킹, 런타임 체킹를 제공해 개발자가 신뢰할 수 있는 프로그래밍을 하도록 안내한다.
  • 네트워크 환경에서 Java 프로그래밍 언어로 작성된 어플리케이션은 백그라운드에서 바이러스를 만들거나 파일 시스템을 침입하려는 악성 코드에 의한 침입으로부터 보호된다.

자바 언어의 큰 장점중에 하나로 많은 대기업들이 자바를 선호하는 이유이기도 하다. 다른 스크립트 언어는 이러한 컴파일 과정이 없기 때문에 사전에 이러한 에러를 미리 체킹하기 어렵지만 자바는 컴파일링을 통하여 바이트코드로 변환하기 때문에 신뢰성이 높다.

Architecture Neutral and Portable

  • JAVA는 다양한 네트워크 환경에 도입되는 어플리케이션을 배포할 수 있도록 설계되었다.
  • JAVA 컴파일러는 다양한 하드웨어와 소프트웨어에 배포될 수 있도록 중립적인 포맷을 지닌 바이트 코드를 생성한다.
  • JVM은 컴파일러가 생성한 바이트 코드를 해석해 기계어로 바꾸어 실행한다.
  • JVM이 인터프리터가 되어서 같은 바이트코드를 가지고 여러 CPU에서 실행이 가능해진다.

자바는 플랫폼에 대한 독립성을 가지고 있다. 지금도 그렇지만 초기에는 운영 체제에 따라서 각각 다른 언어로 프로그램을 만들어야 한다. 때문에 자바는 초기부터 한번 작성하면 그 어떠한 곳에서도 실행이 가능한 것을 가장 큰 목표로 세웠기 때문에 JVM이라는 특수한 가상 머신을 통하여 코드를 실행하기 때문에 플랫폼에 대한 독립성을 가지게 되었다.

High Performance

  • JAVA 플랫폼은 인터프리터가 런타임 환경을 확인할 필요 없이 최대 속도로 실행할 수 있는 방식을 채택해 실행 속도가 빠르다.
  • 가비지 컬렉터는 자동으로 실행되기 때문에 필요할 때 메모리 정리를 자동으로 해준다.

C언어와 비슷하지만 가장 크게 다른 부분이 바로 이 가비지 컬렉터라고 생각한다. C언어는 매번 변수를 할당하고 그 변수의 필요성이 끝나게 되면 개발자가 직접 메모리를 해제를 해야 한다. 그러나 자바는 이러한 부분을 가비지 컬렉터라고 하는 특수한 모델을 적용하여 개발자의 편의성을 제공한다. (물론 장점만 있는 것은 아니다.)

Interpreted, Threaded, and Dynamic

  • JAVA 인터프리터는 인터프리터 및 런타임 시스템이 존재하는 환경에서는 모두 자바 바이트 코드를 실행 할 수 있다.
  • JAVA 기술은 멀티스레딩 기능을 통해 여러개의 스레드를 동시에 사용하는 어플리케이션을 구축할 수 있도록 도와준다.
  • JAVA 컴파일러는 컴파일 시 정적 체킹를 제공하지만, 언어와 런타임 시스템은 링크 단계에서 동적 체킹을 제공한다.

JAVA는 멀티쓰레딩 기능을 지원하고 있으며 이에 대한 특화된 여러 라이브러리도 있기 때문에 높은 수준의 어플리케이션을 구축 할 수 있다. 또한 많은 양의 클래스를 만들더라도 컴파일 되는 시점에만 정적 체킹을 하지만 어플리케이션을 실행하는 링크 단계에서는 동적으로 실행하게 된다.


객체 지향 프로그래밍

object-oriented programming (OOP)

JAVA는 객체 지향 프로그래밍(OOP)을 위하여 태어난 언어이다. 처음부터 OOP를 위하여 설계된 언어이기 때문에 객체 지향 프로그래밍을 잘 이해하고 있어야 한다.

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다.

객체지향 프로그래밍이라는 용어는 시대가 지나면서 많은 사람들에 의해 사용되고 변형 되면서 명확하게 그 의미를 정의하기 어렵다. 따라서 JAVA가 제시하는 OOP를 알아보자


JAVA의 OOP

객체(object)

  • 객체는 상태와 행동을 지니고 있는 소프트웨어 프로그래밍 모델이다.
  • 객체의 행동은 메소드에 의해 정의된다.
  • 객체의 메소드는 다른 객체가 인스턴스 변수에 접근하거나 변경에 접근하거나 변경할 수 있는 유일한 수단이다.

JAVA의 객체지향 프로그래밍

객체 지향 프로그래밍은 4가지 개념을 지원해야 한다.

캡슐화

변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(bundling)이다.
대개 프로그래밍 언어에서 이 번들링은 클래스를 통해 구현된다.
해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다.

정보 은닉

프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다.
내부의 구현은 감추고 모뉼 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념이다.

자바에서는 접근 제한자를 통하여 접근 제한을 한다.

  • public : 클래스의 외부에서 사용 가능하도록 노출시키는 것이다.
  • protected : 다른 클래스에게는 노출되지 않지만, 상속받은 자식 클래스에게는 노출되는 것이다.
  • private : 클래스의 내부에서만 사용되며 외부로 노출되지 않는다.

보통 캡슐화와 정보 은닉을 묶어서 생각하는 경우가 많은데, 정보 은닉은 캡슐화로부터 파생된 보조 개념이지 "캡슐화 = 정보 은닉"은 아니다.

상속

상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다. 기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 '오버라이딩(overriding)'이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해 준다.

다형성

하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 의미한다.

  • 서브 타입 다형성(subtype polymorphism)
    기초 클래스 또는 어떠한 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조변수 등이 하위 클래스의 객체를 참조하도록 하는 것이다. 이 때 하위 클래스는 상위 클래스의 메소드 위에 자신의 메소드를 덮어쓰는 메소드 오버라이딩을 수행하며, 상위 클래스의 참조변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라서 호출되는 메소드가 달라진다.

  • 매개 변수 다형성(parametric polymorphism)
    타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능이다. 타입 매개변수를 정의한 클래스 혹은 메소드는 사용할 때 매개변수에 타입을 지정하게 되며, 컴파일 시 지정한 타입에 따라 해석된다.

    • 제네릭(generic)
      지정한 타입 매개변수에 해당하는 타입만을 사용하겠다고 약속하는 방식이다. 타입 매개변수가 특정 객체를 상속할 경우 상속하는 객체의 함수는 호출할 수 있지만 그렇지 않을 경우 타입 매개변수로 지정된 객체의 맴버에는 접근할 수 없다.
  • 임시 다형성(ad hoc polymorphism)

    • 함수 오버로딩(function overloading)
      함수 오버로딩을 통해 동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작하도록 할 수 있다. 함수 오버로딩을 너무 많이 사용하면 전체적인 코드의 유지보수가 어려워지므로, 템플릿 또는 제네릭으로 대체하는 것이 일반적이다.
  • 강제 다형성(coercion polymorphism)

    • 묵시적 형 변환(implicit type coercion)
      'double a = 30;'이라는 식이 실행되면 int형 값 30은 double로 묵시적 형 변환이 이루어진다. double은 int보다 크기가 큰 자료형이므로, 이러한 형 변환을 자료형 승급(type promotion)이라고 한다.
    • 명시적 형 변환(explicit type coercion)
      'double a = (double) 30;'이라는 식은 위와 동일한 결과를 내지만, (double)을 통해 int형 값 30이 double형으로 변환됨을 명시적으로 표현하였다.

참조

JAVA의 철학과 객체지향언어

나무위키-Java

profile
그럭저럭 어렵지 않게 Smile!

0개의 댓글