상냥한 세상 :: Introduction of Java-1

본문으로 바로가기

Introduction of Java-1

category Computer Science/Java 2020. 5. 11. 07:10

Why Java?

오랫동안,꾸준히 인기를 끌어오고 유명세를 탄 자바라는 언어는 코드계의 짬높은 선배라 불릴 만큼 잘 구축되고 이용이 용이한 언어입니다. 또한 GitHub와 Stack Overflow의 활성화 정도를 통한 RedMonk 지표 를 보면, 자바는 2위에 자리하고 있습니다. 

이 포스팅은 그냥 이런게 있구나~정도로만 알아가시면 됩니다. 자세한 내용은 자바-객체지향편에서 다룰 예정입니다.



What is Java?

자바는 'Sun Microsystems'의 'James Gosling'과 다른 연구원들이 개발한 [객체 지향적 프로그래밍 언어]입니다. 
현재는 'Sun MicroSystems'가 'Oracle'에 합병되어 저작권은 'Oracle'로 이전되었습니다. (SCJP->OCJP)

절차 지향 vs객체지향

절차 지향(Procedural Programming)

->절차 지향 프로그래밍이란 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법입니다. 대표적인 절차 지향 언어에는 C언어가 있습니다. 이는 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체지향 언어를 사용하는 것에 비해 더 빨리 처리되어 시간적으로 유리합니다. 그러나 기술이 발전하고 소프트웨어와 하드웨어가 발전함에 따라 상황은 달라졌는데요. 옛날에는 하드웨어와 소프트웨어의 개발 속도 차이가 크지 않았습니다. 하지만 소프트웨어 언어의 발달과 컴파일러의 발달로 하드웨어가 소프트웨어의 발달을 따라오지 못하는 상황이 발생했습니다. 이는 객체지향 언어가 등장하게 되는 계기로 작용했습니다. 객체지향 프로그래밍은 개발하려는 것을 기능별로 묶어 모듈화를 함으로써 하드웨어가 같은 기능을 중복으로 연산하지 않도록 하고, 모듈을 재활용하기 때문에 하드웨어의 처리량을 획기적으로 줄여주었습니다.

장점

  • 컴퓨터의 처리구조와 유사해 실행 속도가 빠름

단점

  • 유지보수가 어려움(순서를 중요시해서 하나라도 흐트러지면 전체가 제기능 구실을 못할 수가 있습니다.=캡슐/모듈화도 힘듭니다)
  • 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
  • 디버깅이 어려움

객체지향(Object Oriented Programming)

 

객체지향의 정의를 살펴보면 객체지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법입니다. 객체지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각하게 됩니다. 이는 마치 컴퓨터 부품을 하나씩 사다가 컴퓨터를 조립하는 것과 같은 방법입니다. 객체 지향의 3대 특성은 다음과 같습니다.

 

1. 캡슐화

  • 캡슐화란 관련된 데이터와 알고리즘(코드)이 하나의 묶음으로 정리된 것으로써 개발자가 만들었으며, 관련된 코드와 데이터가 묶여있고 오류가 없어 사용이 편리합니다. 데이터를 감추고 외부 세계와의 상호작용은 메서드를 통하는 방법인데, 라이브러리로 만들어 업그레이드하면 쉽게 바꿀 수 있습니다.
    • 메서드: 메시지에 따라 실행시킬 프로시저로서 객체지향 언어에서 사용되는 것. 객체지향 언어에서는 메시지를 보내 메서드를 수행시킴으로써 통신(communication)을 수행

      쉽게 설명: 변수 또는 메서드, 내부 클래스에 private로 선언하며 어떤 클래스도 접근 또는 사용이 불가능합니다. 즉 누군가가 내 클래스를 이용하려거나 불법적으로 DB를 연동시키려 할 때 못하도록 하는 것입니다. 따라서 데이터의 무결성을 지킬 수 있습니다.(보안) 그래서 메서드로 변수/메서드 사용은 가능합니다만, 직접적으로는 불가능합니다. 

 

2. 상속

  • 상속은 이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 기법으로 위에서 말한 기존 코드를 재활용해서 사용하는 것을 의미합니다. 객체지향 방법의 큰 장점 중 하나입니다.

3. 다형성

  • 같은 모양의 코드가 다른 행위를 하는 것을 나타냅니다. 우리가 핸드폰에 있는 키패드로 다이얼을 누르기도 하고, 문자를 하기도 하며, 심지어 게임을 하는 것까지 가능한 것처럼 모양은 같은데 다른 기능을 수행하는 것은 핸드폰에서의 다형성의 한 예라고 할 수 있습니다.

    같은 맥락에서 Java에서 다형성을 사용하는 방법은 2가지가 있습니다. 



①Overriding.:슈퍼 클래스를 상속받은 서브클래스에서 슈퍼클래스의 (추상)메서드를 같은 이름,같은 반환값, 같은 인자로 메소드 내의 로직들을 새롭게 정의하는 것을 말합니다. 마치 키패드라는 모양을 가졌지만(슈퍼클래스의 메서드) 게임을 하고, (서브클래스 1) 문자를 보내는 것(서브클래스 2)처럼 말입니다. 

②Overloading:하나의 클래스에서 같은 이름의 메서드들을 여러 개 가질 수 있게 합니다. 단, 메서드의 인자들은 달라야 합니다. (반환 타입은 같아도 되고 달라도 됩니다. 인자만 다르면 됩니다.) 인자들의 타입이나 개수가 다르면 메소드 이름이 같더라도 어떤 메서드를 호출할지 컴파일러가 알 수 있기 때문입니다. 굳이 오버 로딩을 사용하는 이유는, 유사한 일을 수행하면서 인자만 다른 메서드들에 각기 다른 이름을 주면 헷갈릴게 뻔하며, 사용하기 매우 불편하고 가독성도 떨어집니다. 마치 키패드에 문자용 키패드를 따로 만들고, 게임용 키패드를 따로 만드는 것처럼 비효율적인 것입니다. 우리가 핸드폰 키패드를 여러 개 사용하지 않고 하나의 키패드로 여러 개의 기능을 하지 않나요? 
문자를 보낼 때 키패드(이름)문자 전용의 기능을(문자 담당 메서드 인자를 내포) 담당하게 되고, 게임을 할 때 쓰는 키패드(이름)게임 전용의 기능(게임 전용 메서드 인자를 내포) 담당하게 되는 것처럼 말입니다.

 

장점

  • 코드의 재활용성이 높음
  • 코딩이 절차 지향보다 간편함
  • 디버깅이 쉬움

단점

  • 처리속도가 절차지향보다 느림
  • 설계에 많은 시간 소요가 들어감

절차 지향과 객체지향의 차이점

위 사진은 절차지향과 객체지향의 차이를 설명하는 단순화된 사례입니다. 이를 바탕으로 실제로 우리가 자판기 프로그램을 구현한다고 생각해 봅시다. 

 

먼저 왼쪽에 절차지향 방식을 보면, 차근차근 순서대로 아래로 물이 위에서 아래로 흐르듯 따라가는 전형적인 '절차식' 로직임은 틀림없습니다. 그렇다면 오른쪽에 객체지향 방식을 보면 절차 지향과는 다르게 뭔가 이상함을 느낄 수 있습니다. 단순히 절차 지향처럼 쉽게 생각하는 것이 아닌 마치 기능 하나하나를 다 떼어놔서 다시 합친듯한 느낌을 받을 수 있습니다. 즉 이는 개별적으로 참조되고 호출되는 변수들과 함수들을 '객체'라는 틀로 묶어서 사용했다는 것입니다. 
우리가 가장 궁금해하는 건 순서대로 진행되는 절차 지향과 뼈마디를 하나하나 떼어 나서 하나의 인체를 만들어 각자가 제 기능을 하게끔 만드는 객체지향 간의 무슨 차이가 있냐는 겁니다.

객체지향의 반대는 절차 지향, 절차 지향의 반대는 객체지향이 아닙니다. 절차 지향은 데이터를 중심으로 함수를 구현합니다.
이에 반해 객체 지향은 기능을 중심으로 메서드를 구현하게 됩니다.

우리는 위의 알고리즘을 보고 다음과 같은 한 가지 의문이 들 수 있습니다.

"아니 절차 지향과 같게 객체지향도 일련의 절차에 따라 구현되는 방식이 아닌가요?"

객체지향을 설명할 때는 항상 꼬리말처럼 절차 지향이라는 이름이 따라붙습니다. 그러다 보니 마치 객체지향 프로그래밍은 실행절차에 영향을 받지 않는 것 같은 착각을 하게 됩니다. 사실 객체와 절차의 각각을 설명할 때 다른 하나를 들먹이면서 비교 설명할 필요는 없습니다. 
객체란 기존의 방식인 변수 따로, 함수 따로의 분산적이고 통일성 없는 추상화 과정을 통합하여 표현 대상(문제 해결 대상)을 좀 더 모듈화 하기 쉽게 도와주는 도구에 불과합니다. 다시 말해 객체지향 프로그래밍은 객체의 디자인을 한 뒤에 이들의 데이터 플로우를 짜고 진행 시나리오를 설계해나가는 방식의 개발 방법론입니다. 절차 지향과 객체지향은 데이터 모델링을 먼저 하느냐, 플로우 차트를 먼저 짜느냐 하는 차이일 뿐 둘 다 정해진 알고리즘을 따라 순서대로 실행되는 건 매한가지입니다

절차 지향:프로그램의 순서와 흐름을 먼저 세우고, 필요한 자료구조와 함수들을 설계하는 방식.
객체지향:자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행 순서와 흐름을 짜는 방식.

 

좌측과 우측의 그림 비교를 통해 보다 손쉽게 비교 가능합니다.
위에는 단순히 정의식으로 설명했으니 이번에는 조금 더 이해를 돕기 위한 비유를 하나 들어봅시다. 

절차 지향:컴퓨터 게임을 하기 위해선 컴퓨터를 가지고만 있어서 되는 것이 아니라 데스크톱의 전원 버튼을 누른다->윈도에서 게임을 설치한다->게임 실행을 한다->게임 클라이언트 내부에서 로그인을 한다.->게임을 즐긴다 와 같은 순서를 따라야 합니다.

객체지향:컴퓨터 부품에는 제각각 기능이 있는CPU(개체), 저장매체(개체), RAM(개체) 등등이 있습니다. 이를데스크톱(클래스) 안에 넣고 실행시키면 데스크톱(클래스)은 전원 버튼(RUN) 이후 각각의 개체에서 필요한 기능들을 호출한 뒤 컴퓨터를 실행시키게 됩니다.