[JAVA] JAVA 의 특징
저번 포스트에서는 JAVA 설치와 환경 변수 설정하는 것에 대해서 알아보았습니다. 이제 진짜 JAVA 코딩에 대해 알아보기 전에 JAVA 의 핵심적인 특징에 대해서 알아보도록 하고 실제 코드 관련 포스트를 다루도록 하겠습니다.
1. 객체 지향적이다 (Object-oriented)
우선 객체 지향이라는 개념에 대해서 알아보도록 하겠습니다.
객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나입니다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체
들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있습니다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경을 쉽게할 수 있기 때문에 대규모 소프트웨어 개발에 많이 사용됩니다. 또한 객체 지향의 개념을 익히게 된다면 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있습니다.
이를 예를 들어 쉽게 설명을 하자면, 자동차를 만들고자 할 때 자동차의 기본적인 요소들을 포함한 설계도면을 미리 만들어 둡니다 이후에 설명을 다시 할거지만 객체 지향 프로그래밍에서는 이것을 Class 라고 합니다. 그리고 자동차를 만들고자 할 때 이 설계도면을 가져와서 만들게 되는데 이 설계도면을 가져와 만든 것을 객체(Object) 라고 합니다. 그리고 이러한 객체에는 기존 설계도에는 없는 새로운 기능들을 우리가 직접 추가를 할 수도 있고, 미리 제작한 설계도가 있기 때문에 언제든 새로운 자동차를 만들고자 할 때 새로운 객체를 불러와 작업을 할 수 있다는 장점 때문에 객체 지향 프로그래밍은 혁신을 불러왔다고 볼 수 있습니다. 좀 더 자세한 내용은 객체 지향에 대한 여러 특징들을 설명을 하면서 진행하도록 하겠습니다.
객체 지향 프로그래밍의 특징
객체 지향 프로그래밍의 특징은 기본적으로 자료 추상화, 상속, 다형 개념, 동적 바인딩 등이 있으며 추가적으로 다중 상속 등의 특징이 존재합니다.
자료 추상화
자료 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것입니다. 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 합니다. 추상 자료형은 자료형의 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있습니다. 객체 지향 프로그래밍에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드(함수) 라고 합니다.
상속
상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능입니다. 상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 합니다. 상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화 할 수 있습니다.
상속과 관련해 상속의 장점에 대해서 좀 전에 예시를 들었던 자동차 만들기로 설명을 드리자면, 독일의 BMW 사는 자사의 차를 만들 때 기본적인 자동차 도면을 이용해서 오브젝트를 만들고, 그 오브젝트에 자사의 특징인 키드니 그릴을 주입해주는 작업을 했었습니다. 하지만 이 작업은 BMW 사에서 자동차를 만들 때 매번 새로 생성한 오브젝트에 키드니 그릴을 주입하는 작업을 해주어야 하는데 매번 이 작업을 수작업으로 해주기도 번고롭고, 또 이 키드니 그릴을 넣어주지 않는 실수 하나 때문에 BMW 사의 특징인 키드니 그릴이 들어가지 않은 불량품 생산의 비중도 높았습니다. 하지만 이 기본적인 자동차 도면이 전 세계적으로 공개가 되었고, BMW 사는 이 기본적인 자동차 도면을 상속받아 자사의 특징인 키드니 그릴이 들어간 도면을 새로 만들게 되었고 매번 자동차를 만들 때 마다 오브젝트에 키드니 그릴을 주입해주던 때와 달리 BMW 에서 만든 도면을 사용해 자동차를 만들면 기본적인 자동차의 특징은 그대로 유지하면서 자사의 특징도 별 다른 주입 없이 단 한 번만 구현을 할 수 있게 되었습니다. 제가 임의로 만든 이 예제에서와 같이 상속은 부모 클래스의 특징은 그대로 유지하면서 내가 추가하고자 하는 새로운 특징들을 단 한 번만의 작업으로 넣어주거나 빼줄 수 있어 효율적으로 코딩을 할 수 있게 합니다.
다형성
다형성이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미합니다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있습니다.
동적 바인딩
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화되지 않는 정적 바인딩과 대비되는 개념입니다. 동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현합니다.
객체 지향 프로그래밍의 장점
소프트웨어 공학의 관점에서 볼때 소프트웨어의 질을 향상하기 위해 강한 응집력과 약한 응집력을 지향해야 하는데, 객체 지향 프로그래밍의 경우 하나의 문제 해결을 위한 데이터를 클래스에 모아 놓은 데이터형을 사용함으로써 응집력을 강화하고 클래스간에 독립적인 디자인을 함으로써 결합력을 약하게 합니다.
객체 지향 언어인 JAVA 는 숫자 (int, float, long 등) 나 논릿값(true, false)을 제외하면 거의 모두 객체로 구성됩니다. JAVA 는 Object 클래스에서 모든 클래스를 파생합니다.
JAVA 에서는 int, float, long, boolean 등을 원시 자료형이라고 합니다.
2. 안정적이다
자바는 포인터 연산을 지원하지 않습니다. 이는 잘못된 주소를 가리킬 가능성을 사전에 없앤 것이라 포인터를 쓰는 언어보다 더 안정적입니다. 그리고 JAVA 는 모든 메모리 접근을 JAVA 시스템이 관리하고 제한하며, 또한 예외 처리까지 하므로 시스템이 붕괴될 우려가 적습니다. 예를 들어 JAVA 는 리로스 관리(gabage collection)를 하는데 사용이 끝난 리소스를 시스템이 메모리에서 삭제하는 방식을 채태학고 있어 프로그래머가 메모리 유출을 걱정할 필요가 없습니다.
3. 플랫폼이 독립적이다
JAVA 의 실행 파일은 이진 코드(클래스)이므로 자바 런타임을 설치한 시스템에서는 어디서나 실행할 수 있습니다. 즉 자바로 작성한 프로그램이라면 운영체제와 상관없이 어디서든 실행할 수 있다는 뜻입니다. 왜냐하면 자바 프로그램은 가상머신으로 실행되기 때문입니다. 처음에는 이 방식이 느리고 부담스러웠지만 하드웨어의 눈부신 발전과 여러 기술이 개발되면서 이러한 단점은 대부분 사라졌습니다.
4. 멀티 스레드를 지원합니다
멀티 스레드를 지원하면 프로그램 단위가 같은 스레드를 통시에 수행할 수 있습니다. JAVA 는 멀티 프로세서 하드웨어를 지원하도록 설계되었으므로 멀티 CPU 시스템에서 효율이 높습니다.
5. 동적이다
JAVA 인터페이스를 이용하면 모듈을 갱신할 때 다른 모듈까지 모두 갱신할 필요가 없습니다. 인터페이스가 인스턴스 변수와 도구의 실행문을 배제한 채 객체 간의 상호 작용을 정의하기 때문입니다.
Comments