Java Buzzwords



자바 전문 용어에 대한 내용 없이는 자바를 완벽히 알 수 없습니다.

비록 자바의 발명이 하게 된 근본적인 힘이 휴대성과 보완성이지만, 다른 요인들도 중요한 역할을 했습니다.


주요 중요 사항 들은 아래와 같습니다. 


Simple 

ㄴ 자바는 간결하고, 배우기와 사용하기를 쉽게 만들어 주는 결합력있는 특성들의 집합을 가지고 있습니다.


Secure 

 ㄴ 자바는 인터넷 어플리케이션을 만들 수 있는 안전한 수단을 제공합니다.


Portable

 ㄴ 자바 프로그램은 자바 런타임 시스템이 있는 모든 환경에서 실행 할 수 있습니다.


Object-oriented 

 ㄴ 자바는 현대, 객체 지향 프로그래밍의 철학을 나타냅니다. 


Robust

 ㄴ 자바는 엄격한 입력과 런타임 확인을 수행하여, 에러가 없는 프로그래밍을 장려합니다.


Multithreaded

 ㄴ 자바는 다중 실행 프로그래밍을 위해 통합된 지원을 제공한다. 


Architecture-neutral 

 ㄴ 자바는 특별한 기계나, 운영 시스템 아키텍쳐에 묶여있지 않습니다.


Interpreted

 ㄴ 자바는 바이트 코드를 사용하는 것을 통해 교차 플랫폼 코드를 지원합니다.


High performance 

 ㄴ 자바 바이트 코드는 빠른 실행을 위해 훌륭하게 최적화되어 있습니다.


Distributed

 ㄴ 자바는 인터넷의 분산된 환경을 고려하여 설계되었습니다.


Dynamic

 ㄴ 자바 프로그램은 에러 검사에 사용되는 상당량의 런타임 타입의 정보를 보유하며, 실행도중 객체로 접근을 허용합니다.




Object-Oriented programming



자바의 중심에는 객체 지향 프로그래밍이 있습니다.

자바로부터 갈라놓을 수 없는 방법론으로, 모든 자바 프로그램은 적어도 어느정도는 객체 지향입니다.


이는 객체 지향이 자바에게 중요하기 때문이죠.

간단한 자바 프로그램을 만들기 전에, 객체 지향의 기초적 원리를 이해하는 것이 개발에 도움이 됩니다.


프로그래밍 방법론은 컴퓨터의 발명때부터, 프로그램의 복잡성이 커져가는 것에 적응하기 위해 드라마틱하게 변해왔습니다.

예를 들어, 컴퓨터가 처음 발명되었을 때는 컴퓨터의 프론트 패널을 사용하여, 바이너리 명령 머신에 토글키로 켰다, 껏다 하는 것으로 프로그래밍이 끝났습니다. 

프로그램에는 수 백의 명령어가 있었지만, 이런 처리방식으로 작업했습니다.


프로그램이 발전하면서 더 크고 점점 복잡해져 가는 프로그램을 다룰 수 있도록, 기계어의 상징적인 표현을 사용하는 어셈블리 언어가 개발 되었습니다. 이후 프로그램이 지속적으로 발전하면서, 복잡함을 다룰 수 있는, 더 많은 틀을 제공하는 고 레벨의 언어가 프로그래머에게 소개 되었습니다.


처음 소개된 언어는 포트란(FORTRAN) 이였습니다. 포트란은 무척 인상적인 첫 걸음이였지만, 권장하는 언어는 아닙니다. 


1960년 구조화된 프로그래밍이 태어났습니다. 그리고 C나 Pascal 과 같은 언어에 의해서 장려되었죠.

구조화된 언어의 사용은 적당히 복잡한 프로그램을 상당히 쉽게 작성할 수 있도록 만들어 주었습니다.

이 언어들은 독립된 서브루틴, 지역변수, 풍부한 제어구조 그리고 GOTO문에 대한 신뢰의 부족으로 특징지어 집니다.


하지만 구조화된 언어가 강력한 틀이라도, 프로젝트가 너무 커지면 한계에 도달했습니다.


이 때 중요한 것은 프로그래밍의 발전에서,

프로그래머가 점차 보다 큰 복합성을 다룰 수 있도록, 기술과 툴이 만들어 졌다는 것이죠. 

각 단계에서, 새로운 접근을 통해 이전 방법의 가장 좋은 요소를 취했고, 앞으로 나아갔습니다.

그리고 많은 프로젝트를 통해 구조화된 접근이 더이상 영향력이 없다는 점에 도달했습니다.


객채 지향은 프로그래머가 이러한 장벽을 허물 수 있도록 돕기 위해 만들어졌습니다. 

많은 구조화된 프로그래밍의 좋은 아이디어를 얻었고, 새로운 개념을 만들었습니다.


결과는 프로그래밍 체계의 다른 방법 이였죠.

가장 일반적인 의미에서, 프로그래밍은 아래의 2가지 방법으로 구성될 수 있습니다. 

1. 주변 코드 (발생)

2. 주변 데이터 (영향)

구조화 프로그래밍 기술 하의 프로그램은 일반적으로 주변 코드로 구성됩니다.

이 접근은 "코드가 데이터에 영향을 미친다"로 간주 될 수 있습니다.


객체 지향 프로그래밍은 다른 방식으로 주변에 작용합니다.

객체 지향은 "데이터가 코드로의 접근을 제어한다" 가 되는 중요 원리를 가지고, 주변 데이터에서 구성되죠. 

객체 지향 언어에서 여러분은 데이터와 데이터에 작용하는 루틴을 정의할 수 있습니다.

그러므로 데이터 타입은 어떤 종류의 작업이 해당 데이터에 적용될 지 정확히 정의합니다. 


객체 지향 프로그래밍의 원리를 지지 하기 위해, 자바를 포함한 모든 객체 지향 언어들은 3가지 공통적인 특성을 가집니다.

바로, 캡슐화, 다형성, 상속 이죠.

 



Polymorphism (다형성)


다형성(그리스 어원으로 "많은 형태"라는 의미)은 하나의 인터페이스가, 전반적인 클래스의 동작에 접속할 수 있게 하는 특성입니다. 특정한 동작은 정밀한 상황 특성에 의해 일어납니다. 


간단한 다형성의 예로 자동차의 스티어링 휠을 들 수 있습니다. 

스티어링 휠 (즉, 인터페이스)은 사용되는 어떤 타입이던지 동일합니다. 

말하자면 수동 스티어링, 파워 스티어링, 랙앤 피니언 스티어링이든 동일한 동작을 수행합니다. 

그렇기 때문에 작동하는 법을 한 번 배워 놓기만 하면, 어느 유형의 자동차에서도 사용할 수 있습니다.


프로그래밍에도 동일한 원리가 적용될 수 있습니다. 

스택을 예를 들면, 사용자는 3가지 다른 타입의 스택을 필요로 하는 프로그램을 가질 수 있습니다.

하나는 정수 값을 사용하고, 하나는 부동 소수점값, 하나는 문자 값입니다.

이 경우 데이터가 다르게 저장되더라도, 각각의 스택을 실현하는 알고리즘은 동일합니다. 


여기서 객체지향 언어가 아니라면, 

사용자는 각각 다른 이름을 사용하는 집합을 가진, 3가지 다른 스택 루틴 집합을 만들 필요가 있습니다. 

하지만 자바에서는 다형성 덕분에, 3가지 특정한 상황에서 동작하는 하나의 일반적인 스택루틴을 만들 수 있죠.

스티어링 처럼, 한 번 스택을 사용하는 법을 알아 놓으면, 어디에나 적용할 수 있습니다.


일반적으로 다형성의 개념은 "하나의 인터페이스, 다양한 방법들" (one interface, multiple methods) 로 표현됩니다.

다형성을 통해 포괄적인 설계가 가능하고, 복잡성을 줄이는데 도움을 얻을 수 있습니다.

이 내용은 손으로 쓸 필요가 없습니다. 단지 이 내용을 기억하고, 활용 할 줄 알면 됩니다.



Inheritance (상속)


상속은 어떤 한 객체가 다른 객체로 부터 특성을 취하는 과정을 말합니다. 

또한 계층적 분류의 개념을 지원하기 때문에 중요합니다. 

생각해보면, 대부분 지식은 관리가 가능하도록 계층적 분류를 통해 만들어 졌습니다. 


예를 들면, 빨간 맛있는 사과는 사과 분류의 한 부분이고, 이 사과는 또 다시 과일 클래스의 한 부분이며, 이것은 마지막으로 음식이라는 큰 클래스 아래에 있습니다. 음식 클래스는 확실한 특성을 보유하고 있죠. ( 식용가능, 영양분 충분 같은 것) 

그리고 또한 그 아래 클래스인 과일 클래스를 지원합니다. 


이런 특성에 덧 붙여서, 과일 클래스는 다른 음식으로 부터 구분가능한 특별한 문자를 가집니다 ( 쥬스, 달콤함 등..)

그리고 사과 클래스는 그러한 사과의 고유한 특성을 정의합니다. (열대지방이 아닌 나무에서 자라는 사과 처럼)


맛있는 빨간 사과는 차례로 전임 클래스의 모든 특성을 상속 받습니다. 

그리고, 사과를 사과로 만드는 이런 특성들을 정의합니다. 


상속을 사용하지 않는 다면, 각각의 객체는 모든 문자를 명시적으로 정의해야만 합니다.

하지만 상속을 사용함으로써, 객체는 오직 클래스 내에 있는 그들의 고유의 특성만 정의해 주면 됩니다. 

또한 그것들은 부모로부터 부모의 일반적인 특성을 상속받을 수 있죠.


그러므로 상속 메카니즘은 일반적 상황에서 한 객체가 특정한 인스턴스 갖도록 하는 것을 말합니다. 




Encapsulation (캡슐화)


캡슐화는 코드와 그것을 처리하는 데이터를 묶는 메커니즘으로, 외부의 간섭과 남용으로 부터 두 가지를 안전하게 보호합니다. 객체지향에서, 코드와 데이터는 자립적인 블랙박스를 만드는 것과 같은 방법으로 같이 묶일 수 있습니다.

박스 안에는 모든 필수적인 데이터와 코드가 있죠. 데이터와 코드가 이런식으로 같이 연결될 때 객체가 생성됩니다.

다시 말하면 객체는 캡슐을 지원하는 장치라고 볼 수 있습니다.


객체 내에서 코드, 데이터 혹은 둘 다 객체에 공개되거나 그렇지 않을 수 있습니다.

이 말을 풀어보면 첫번째로, 전용 코드 혹은 데이터는 오직 객체의 또 다른 부분에서만 이용가능하죠. 

즉, 객체 밖에서는 전용코드나 데이터에 접속 할 수 없습니다.

하지만 코드와 데이터가 공개되면, 코드나 데이터가 객체 내에서 정의 되었더라도, 외부의 프로그램의 다른 부분에서 접속 할 수 있습니다.


일반적으로 객체의 공개된 부분은 객체의 전용요소에 컨트롤된 인터페이스를 제공하는데 사용됩니다.


자바의 기초적인 캡슐화 단위는 클래스입니다.

클래스는 자바의 형태를 정의합니다. 명시한 데이터와 코드 둘 다 클래스에서 실행됩니다. 

자바는 객체를 만들기 위해 클래스를 명확하게 사용합니다. 객체는 클래스의 인스턴스입니다. 

결국 클래스는 본질적으로 객체를 어떻게 만드는 알려주는 종합적인 계획이죠.


코드와 클래스를 구성하는 데이터는 클래스의 멤버라고 합니다.

그리고 클래스에 의해 정의된 데이터는 멤버 변수나 인스턴트 변수로 지칭됩니다. 

데이터에서 동작하는 코드를 멤버 메소드나, 혹은 그냥 메소드라고 합니다. 서브루틴의 자바적 용어라고 볼 수 있죠.


만약 C/C++을 조금 알고 있다면, 자바 프로그래머가 메소드라 부르는 것을 아는데에 도움이 될 겁니다. 

C/C++ 프로그래머가 Function을 아는 것 처럼요. 








영어원문 Oracle - java a beginner's guide 

번역,의역 및 작성 : 초코 토끼

검수 : 개발 토끼

오역 및 오타의 지적은 겸손히 받겠습니다






+ Recent posts