[Concepts] 절차지향언어와 객체지향언어의 프로그래밍[Concepts] 절차지향언어와 객체지향언어의 프로그래밍

Posted at 2019. 12. 18. 19:15 | Posted in Computer Concepts
반응형




출처 : IT CookBook, 컴퓨터 사이언스




■ 프로그램 개발 과정



① 사용자 요구사항 분석

 -. 사용자의 필요나 문제가 무엇인지 파악하고 이해하기 위한 단계이다.


② 프로그램 설계

 -. 실제 코딩을 할 때 사용할 논리를 프로그래머가 대략적으로 그려내는 단계로 알고리즘 설계라고 한다.

 -. 알고리즘(Algorithm)이란 문제를 푸는 방법에 대하여 순서를 정하는 것이다.


③ 코딩 및 컴파일

 -. 프로그래밍 언어로 실제 프로그램을 작성하는 과정을 코딩이라고 한다.

 -. 코딩이 끝나면 고급 언어로 작성된 명령문을 기계어로 바꾸는데 이를 컴파일이라고 한다.


④ 디버깅 및 테스트

 -. 디버깅이란 오류를 찾아 제거하는 과정이다.

 -. 모든 오류 점검을 마치면 시험용 데이터를 입력해 테스트한 후 프로그램 개발을 완료한다.










■ 절차 지향 언어의 프로그래밍




1990년대 이전에 나온 대부분의 프로그래밍 언어는 절차 지향 언어이다.


대표적인 예로 파스칼, 코볼, 포트란, 베이직, C언어 등이 있다.


절차 지향 언어의 개념과 특징을 살펴보자.




#01. 절차 지향 언어의 개념



"냉장고에 소고기를 넣는다"는 내용이 다음 그림의 A와 같은 순서로 이루어진다고 가정하자.


이것을 프로그램으로 작성하면 B와 같다.


이와 같은 절차 지향 언어(Procedure Oriented Language)란 프로그램 코드를 순서대로 작성하여 실행하는 언어이다.


   A. 냉장고에 소고기를 넣는 과정

 

   B. 냉장고에 소고기를 넣는 프로그램


     ① 냉장고 문을 연다.

     ② 소고기를 넣는다.

     ③ 냉장고 문을 닫는다.


 

     ① Open 냉장고

     ② Insert 소고기

     ③ Close 냉장고




#02. 구조적 프로그래밍의 이해



절차지향 언어는 명령을 실행하는 순서가 자주 바뀌거나 복잡해지면 운영 및 유지 비용이 많이 든다.


이러한 문제를 해결하기 위해 등장한 개념이 구조적 프로그래밍(Structured Programming)이다.


구조적 프로그래밍은 말 그대로 명령어 실행 순서가 뒤바뀌거나 제어 구조가 복잡해지지 않도록 몇가지 규칙에 따라 프로그램을


체계적으로 관리할 수 있다.



   





위 그림에서 A는 무분별한 goto문과 무한 루프의 사용으로 체계성을 잃어 버린 나쁜 프로그램의 예이다.


프로그램을 이해하기도 어렵거니와 수정하더라도 여러 부분을 고쳐야 하는 문제가 있다.


B는 순차 구조, 선택 구조, 반복 구조를 사용하여 프로그램을 모듈화 시킨 좋은 프로그램의 예이다.


명령문의 처리가 블록으로 모듈화 되어 이해가 쉽고 수정도 수월하다.




#03. 구조적 프로그래밍의 특징


 ① 프로그램을 읽고 이해하기 쉽다.

 ② 프로그램의 개발 및 유지 보수의 효율성이 높다.

 ③ 프로그래밍 규칙이 제공된다.

 ④ 프로그래밍에 대한 신뢰성이 높다.

 ⑤ 프로그래밍에 소요되는 시간과 노력이 감소된다.




#04. 구조적 프로그래밍을 하기 위해 지켜야 할 기준


 ① 프로그램을 구성하는 각 요소를 작은 규모로 조직화 한다.

 ② 단일 입 · 출구(Single Entry, Single Exit) 형태로 작성한다.

 ③ 가능하면 goto문을 쓰지 않는다.

 ④ 순차 구조, 선택 구조, 반복 구조만 쓴다.









■ 객체 지향 언어의 프로그래밍




객체 지향 언어(Object Oriented Language)는 객체 단위로 데이터와 기능을 하나로 묶어 쓰는 언어이다.


1990년대에 본격적으로 등장했고 대표적인 언어로 비주얼 베이직, C++, 자바 등이 있다.




#01. 절차 지향 언어와 객체 지향 언어의 차이점



절차 지향 언어는 변하는 현실세계와 사용자의 요구에 유연하게 대처하지 못한다.


예를 들어 홍길동이라는 사람을 데이터, 그의 행동을 기능이라고 가정해 보자.


홍길동은 밥을 먹은 후 운동하길 원하는데, 절차 지향 언어로 운동을 한 후 밥을 먹게끔 프로그래밍해 놓으면


순서를 바꾸기 위해 프로그램을 수정해야 한다.


그러나 객체 지향 언어로 밥을 먹는 것과 운동을 하는 것을 분리해 놓으면 프로그램을 수정할 필요가 없다.


이처럼 객체 지향 언어는 원하는 기능과 데이터를 따로 정의한 후 필요할 때마다 묶어 사용하기 때문에


프로그램의 운영 및 유지가 쉽다.








위 그림은 절차 지향 언어와 객체 지향 언어의 차이점을 나타낸 것이다.


절차 지향 언어는 데이터와 기능이 별도로 관리되는 언어로 프로그램은 기능을 호출하여 데이터에 접근하고 일을 처리한다.


객체 지향 언어로 기능과 데이터로 묶어 캡슐화시킨 후 메시지를 전달하여 일을 처리한다.




 Class 소고기 {


       소고기 속성( 무게, 부위, 원산지, 가격 );

       소고기(  );


 }


 Class 냉장고 {


       냉장고 속성( 용량, 전력소모량, 제조사, 색상, 가격 );

       냉장고(  );

       Open(  );

       Insert( 소고기 );

       Close(  );

 }





위 코드는 절차 지향 언어를 객체 지향 언어로 프로그래밍 한 것이다.


객체 지향 언어는 절차 지향 언어와 달리 정해진 순서 없이 단지 해당하는 작업만 수행한다.





#02. 객체 지향 언어의 주요 개념




객체 지향 언어가 공통적으로 가지는 요소와 특징에 대해 구체적으로 살펴보자.




01) 클래스와 객체



클래스(Class)란 다른 사물과 구분되는 속성을 가진 객체가 모여 일반화된 범주로 묶인 것이다.


즉, 객체에 대한 일반화된 틀(Template)을 제공한다.


예를 들어 자동차 클래스가 있다면 이 클래스는 내 자동차, A씨의 자동차, B씨의 자동차, C씨의 자동차 등의 객체로 구성될 수 있다.



객체(Object)는 속성(Attribute)는 기능(Function)을 갖는다.


속성은 각 객체가 가진 고유한 특징이고, 기능은 행동패턴을 말한다.


객체는 바로 이 속성과 기능을 함께 캡슐화 한다.


예를들어 "홍길동 차"라는 객체는 색깔, 차종, 크기, 모양, 최고 속도 등의 속성을 가지고,


전진과 후진, 정지, 가속과 감속 등의 기능을 한다.


이러한 속성과 기능은 패키지로 묶여 관리된다.





02) 상속




클래스는 필요한 경우 더 세분해서 각각의 특성별로 관리할 수 있는데 이것을 하위 클래스라고 한다.


하위 클래스는 상위 클래스가 가지는 속성과 기능을 모두 이어받을 수 있다.


이를 상속이라고 한다.



상속(Inheritance)은 객체 지향 언어에서 주로 사용되는 재사용 수단으로 다형성과 밀접한 관계가 있다.


하위 클래스는 상속을 통해 상위 클래스의 속성과 기능을 그대로 재사용할 수 있다.


다음 그림처럼 개와 고양이는 모두  포유동물의 공통 속성을 물려받으므로


공통 속성 부분은 따로 코딩할 필요 없이 포유동물의 속성을 그대로 가져다 쓸 수 있다.



















03) 메시지



메시지(Message)란 객체 간에 전달되는 명령 단위이다.


객체는 자발적으로 행위를 수행하지 않으므로 객체가 특정 기능을 수행하게 하려면 메시지가 전달되어야  한다.


자동차를 움직이려면 운전자가 가속 페달을 밟아 직진하라고 신호를 줘야 하는 것과 같은 맥락이다.


메시지가 다듬어져서 프로그램화되면 메소드로 진화한다.


다음 그림의 객체 간 메시지 교환 과정은 수강 신청을 예로 들어 나타낸 것이다.








사각형은 객체를 의미하며 번호와 표시된 화살표는 객체간의 메시지 송수신을 의미한다.





04) 추상화



추상화(abstraction)란 어떤 객체가 상대하는 다른 객체에 대해 꼭 필요한 부분만 드러내고 나머지 세부적인 사항은 감추는 것이다.


추상환느 객체 지향 프로그래밍에서 매우 중요한 개념으로 이를 얼마난 잘 구현하는냐에 따라 시스템의 품질이 결정된다.


아래 림은 추상화의 개념을 고객센터를 예로 들어 나타낸 것이다.








한 고객이 D사의 노트북을 사용하다 고장이 났다고 가정하자.


일단 고객은 D사의 고객센터로 연락해 수리를 맡길 것이다.


하지만 고객이 직접 수리하는 엔지니어를 상대해야 하는 경우라면 어떤 일이 생길까?


고객은 여러번의 통화를 거쳐 엔지니어를 찾을 것이다.


하지만 엔지니어가 다른 부서로 옮겨 갔거나  연락이 닿지 않는 다면 여러 가지 번거로운 상황을 만날 수 있다.


이 예에서 전자가 추상화한 경우이고 후자가 추상화하지 못한 경우이다.


추상화를 해둔 경우라면 고객은 고객서비스센터의 대표 전화번호 하나만 알면 된다.





05) 캡슐화


객체를 정의한다는 말은 객체가 가진 속성, 기능 다른 객체와의 관계를 정의하는 것이다.


캡슐화(Encapsulation)란 속성과 기능을 하나로 묶되, 추상화하여 객체의 세부 내용을 사용자가 보지 못하도록 은폐하는 것이다.


예를 들어 사용자에게 자동차 엔진(객체)을 설명할 때 세부 동작 원리를 설명하지 않고 어떤 기능을 하는지 정도만 알려주는 것이다.



캡슐화는 제3자가 객체 내부 데이터와 기능을 변조하는 것을 막아주므로 프로그램의 재사용성과 유지 보수성을 향상시킨다.


이러한 이유로 개발자는 캡슐화해서 생기는 불편을 충분히 감내할 만 하다고 여긴다.





06) 다형성


상속에서 언급했던 상위 클래스를 일반화된 클래스라고 하고 하위 클래스를 특정화된 클래스라고 한다.


일반화된 클래스는 어떤 특정화된 클래스 객체를 지칭할 수 있기 때문에 같은 동작을 하지만 다른 성질을 가질 수 있다.


이런 성질을 다형성(Polymorphism)이라 한다.






포유 동물은 일반화된 클래스이고 강아지와 고양이는 구체적인 개념을 가진 틍정화된 클래스이다.


강아지 클래스인 바둑이와 고양이 클래스인 나비는 모두 포유동물 클래스에 속한다.


두 경우 포유동물의 공통 속성인 "동물 소리를 낸다"라는 기능을 한다.


하지만 바둑이는 "멍멍"이라고 소리를 내고 나비는 "야옹"이라고 소리를 낸다.


즉 포유동물 객체가 가진 "동물은 소리를 낸다."라는 기능은 하나라도 어느 객체가 지정되느냐에 따라 그 객체가 내는 소리가 다르다.


이것이 바로 다형성이다. 객체 지향 언어에서 다형성을 이용하면 프로그램의 유연성과 재사용성이 높아진다.





※ 객체 지향 언어로 프로그래밍을하면 유지 보수성이 무조건 좋다?



객체 지향 언어를 사용한다고 해서 절차 지향 언어을 사용할 때보다 무조건 유지보수성이 좋아지는 것은 아니다.


오히려 절차 지향 언어보다 더 복잡해지기도 하고 유지 보수성을 훼손시키기도 한다.


즉 무늬만 객체 지향 프로그래밍이 아닌


객체 지향 언어의 특성이 반영된 설계를 바탕으로 제대로 구현된 프로그램이어야 비로소 효율성도 높아지고 유지 보수도 편해진다.


제대로 된 객체 지향 프로그램을 만들려면 객체 지향 언어의 본질적 개념부터 확실히 이해해야 한다.










반응형
//

[Concepts] 프로그래밍 언어의 실행 과정[Concepts] 프로그래밍 언어의 실행 과정

Posted at 2019. 7. 2. 21:49 | Posted in Computer Concepts
반응형




출처 : IT CookBook, 컴퓨터 사이언스






■ 사용자 요구사항 분석과 프로그램 설계




간단한 프로글매이면 분석 없이 바로 코딩을 하기도 하지만, 복잡하거나 규모가 큰 프로그램을 개발할 때는 사용자의 요구사항을 분석한 후 설계한다.




#01. 사용자 요구사항 분석


사용자가 무엇을 원하는지 파악하고 프로그램을 통해 해결할 문제가 무엇인지 확인하는 단계이다. 프로그램의 출력물에 어떤 내용을 포함시켜야 하고, 이를 위해 입력할 내용은 무엇인지, 폼은 어떻게 구성해야 하는지 등을 설계한다. 사용자와 시스템 사이의 인터페이스 방식은 어떻게 할지, 데이터 구조 및 처리 절차에 대한 기본 틀은 어떻게 할지 등을 분석해야 대략적인 설계를 한다. 이 과정이 모두 끝났다면 프로그램 설계를 시작한다.





#02. 프로그램 설계


실제 코딩을 시작할 때 사용할 논리를 프로그래머가 대략 그려내는 단계로 보통 알고리즘 설계라고 한다. 알고리즘(algorithm)의 사전적 의미는 반복 동작을 포함하여 정해진 단계 내에서 형식적이고 수학적으로 표현된 문제를 푸는 절차이다. 즉 어떠한 결과가 나오도록 차례를 설계하는 것을 알고리즘 설계라고 한다.



알고리즘은 다음과 같은 다섯 가지 주요한 특성이 있다.







※ 알고리즘의 5가지 특성



① 알고리즘 명령을 수행하면 유한한 횟수를 거친 후 종료해야 한다.


② 알고리즘의 각 단계와 명령은 명확하게 정의되어야 한다.


③ 알고리즘은 데이터 입력이 0 또는 그 이상이어야 한다.

    여기서 입력은 알고리즘이 시작되기 전에 알고리즘에 주어진 또는 알고리즘 수행 중에 동작으로 주어진 수량을 말한다.


④ 알고리즘은 한가지 이상의 결과를 출력한다.


⑤ 알고리즘은 효과적이어야 한다.
    이는 알고리즘의 모든 연산이 종이와 연필을 이용해 유한한 시간 내에 정확히 수행할 수 있을 정도로 단순해야 함을 의미한다.







이상을 정리하면, 알고리즘은 항상 어떠한 결과(답) 나오도록 만들어진 단계의 모양이다. 여기에서 중요한 것은 인간의 뇌 속에 지식으로 가지고 있는 '문제를 푸는 방법'을 어떻게 문자나 기호 등을 이용해 시각적으로 표현하느냐이다.



문제 푸는 방법을 알고리즘으로 쉽게 표현하기 위해 순서도나 의사 코드 등을 사용한다. 순서도는 제어 흐름을 그림으로 표현한 것이고, 의사 코드는 프로그램과 비슷한 문자로 표현한 것이다. 두 방법 모두 프로그램 실행에 대한 명확한 문법 구조가 아닌 프로그램 전체 구조와 제어 흐름만 나타낸다.


순서도나 의사 코드로 표현되는 프로그램 제어 흐름 유형에는 순차 구조, 선택 구조, 반복 구조가 있다.




※ 프로그램 제어 어 흐름의 유형







:: 순차 구조 ::

:: 선택 구조 ::

:: 반복 구조 ::





◎ 순차 구조 ( Sequence Structure )


순차 구조는 프로그램 코드를 순서대로 실행한다.



◎ 선택 구조 ( Selection Stucture )


선택 구조는 프로그램이 다음에 무엇을 해야 할지 결정하는 분기 구조이다.

조건문(Conditional Stucture)으로 부르기도 한다.

보통 if - then문, case 문, else 또는 else if 문을 포함한 if - then 문을 사용한다.



◎ 반복 구조 ( Repetition Stucture )


반복 구조는 조건이 만족되지 않을 때까지 계속 반복한다.

루프 구조(loop structure)로 부르기도 한다.

프로그래밍 언어마다 반복 구조를 표현하는 방법이 있는데,

for 문, while 문, do - while 문 을 공통으로 사용한다.





① for 문






 어떤 과정을 특정 횟수만큼 반복한다. 조건식이 참이면 문장을 실행한 뒤 증가 연산을 하고 다시 조건식을 검사한다.

 조건식이 거짓이면 문장을 실행하지 않고 for문을 종료한다.



② while 문





 조건식을 만족하는지 여부를 확인한다.

 조건식이 참이면 문장을 실행하고 거짓이면 while 문을 종료한다.

 즉 while 문은 조건식이 거짓이 되지 않는 한 계속 실행된다.





③ do - while 문




 조건식을 먼저 검사하는 while 문과 달리 일단 문장을 한 번 실행 한 후 조건식이 만족하는지 여부를 확인한다.

 조건식이 참이면 문장을 실행하고 거짓이면 do - while 문을 종료한다.











■ 코딩 및 컴파일




프로그래밍 언어로 프로그램을 작성하는 것을 코딩(Coding)이라고 한다. 코딩을 할 때는 개발할 프로그램의 특성에 맞는 프로그래밍 언어를 선택하여 작성해야 한다. 코딩이 끝나면 고급언어로 작성된 명령문을 기계어로 바꾸는 컴파일(Compile) 단계에 들어간다. 컴파일은 프로그래밍 언어의 성격에 따라 컴파일러 compiler를 이용한 방식과 인터프리터(Interpreter)를 이요한 방식이 있고 두 방식을 혼합한 하이브리드 hybrid 방식이 있다.





#01. 컴파일러를 이용한 방식


프로그램 전체를 한 번에 기계어로 번역하는 방식을 C언어를 비롯하여 코볼, 포트란, 파스칼 등에서 사용된다. 다음 그림은 컴파일러를 이용한 방식으로 프로그램을 실행하는 과정이다. 컴파일러는 고급 언어로 작성된 원시 코드를 기계어인 목적 코드로 번역한다. 목적 코드는 로더에 의해 메모리에 옮겨져 실행(Execution)되어 결과 값을 출력한다.


컴파일러는 한번 목적 코드로 번역하고 나면 실행할 때마다 번역할 필요가 없으므로 프로그램 전체의 실행 시간을 줄일 수 있다. 하지만 원시 코드 일부만 수정되어도 프로그램 전체를 다시 번역해야 하므로 번거로울 수 있다.









#02. 인터프리터를 이용한 방식


프로그램을 한 행씩 읽어 번역과 실행을 동시에 하는 방식으로 베이직 등에서 사용된다. 원시 코드가 수정될 때마다 프로그램 전체를 번역할 필요가 없으므로 간단한 구조의 프로그램은 편리하나 반복문이나 계속 호출되는 서브 프로그램처럼 많은 횟수로 처리되는 프로그램은 실행 시간이 길어져 비효율 적이다.











#03. 하이브리드 방식



컴파일러 인터프리터를 함께 이용하는 방식으로 리스프(LISP), 스노볼4(SNOBOL4), API, 프롤로그(Prolog), 자바(JAVA)등에서 사용된다. 이 방식은 컴파일러가 원시 코드를 목적 코드로 번역하는 것이 아니라 적당한 중간 코드로 번역한다. 중간 코드는 인터프리에 의해 입력 자료와 함께 실행된다.
















반응형
//

[Concepts] 프로그래밍 언어의 개요[Concepts] 프로그래밍 언어의 개요

Posted at 2019. 6. 26. 20:21 | Posted in Computer Concepts
반응형




출처 : IT CookBook, 컴퓨터 사이언스






 프로그래밍 언어의 개념



컴퓨터를 움직이게 하려면 명령을 내려야 한다.

프로그래밍 언어는 인간이 컴퓨터와 의사소통할 수 있도록 컴퓨터에 내리는 명령으로 프로그램을 처리하도록 기술한 언어를 말한다.


프로그램은 인스트럭션(Instruction)이라는 명령어로 쓰여 있고, 컴퓨터는 인스트럭션을 논리적 순서(문제를 푸는 방법)에 따라 수행한다. 하지만 2장에서 살펴본 것처럼 컴퓨터는 0이나 1로 된 2진수 형태의 기계어만 처리할 수 있으므로 인스트럭션 역시 기계어로 쓰여 있어 인간이 이해하기 힘들다. 이 문제를 해결하기 위해 인간도 쓰기 쉽고 컴퓨터도 기계어로 해석 할 수 있는 프로그래밍 언어(Programming Language)를 개발하여 사용하게 되었다.








■ 저급 언어와 고급 언어



프로그래밍 언어는 기계어와 유사한 저급 언어와 인간이 쓰는 자연 언어와 유사한 고급 언어로 나뉜다.




#01. 저급 언어


저급언어란 컴퓨터 내부 표현에 가까운 언어로 기계어와 어셈블리어로 나눌 수 있다.

기계어는 0과 1로 작성하고, 어셈블리어는 기계어를 인간이 이해하기 쉽도록 기호홀 표현하여 작성한다.



◎ 기계어 ( Machine Language) 


기계어는 0과 1로 된 2진수 형태의 언어이다.

인간이 이해하기 어려울 뿐만 아니라 하드웨어 주소 체계에 따라 배열이 달라져 컴퓨터 끼리 호환되지 않는 문제가 있어 지금은 거의 사용되지 않는다.



◎ 어셈블리어 ( Assembly Language )


어셈블리어는 기계어 명령을 알기 쉬운 기호로 표시하기 떄문에 기계어는 물론 사용하고자 하는 컴퓨터 내부 구성과도 관계가 깊다.

예를 들어 LDA A라는 어셈블리어 코드는 메모리 A번지에 있는 내용을 누산기 accumulator에 저장하라는 의미로, 기계어 010100000000100에 해당한다.

다음은 A ∨ B 수식을 ( A' ∧ B' )형태로 치환해 계사한 어셈블리어의 예이다.



  LDA A 

 // A번지에 있는 데이터 값을 로드한다.

  CMA

 // 위의 값을 보수( A' )로 바꾼다.

  STA TMP

 // 위의 값을 임시 저장소에 저장한다. 

  LDA B

 // B번지에 있는 데이터 값을 로드한다.

  CMA

 // 위의 값을 보수( B' )로 바꾼다.

  AND TMP

 // AND( A' ∧ B' ) 계산을 수행한다.

  CMA

 // 계산 결과를 보수화하여 ( A ∨ B ) 결과 값을 얻는다.



어셈블리어는 기계어에 비해 간편하게 쓸 수 있지만 기계어인 0과 1의 집합을 문자나 기호로 바꾼 것에 불과하므로 하드웨어 구조에 익수한 사람이 아니면 쓰기 어렵다.

그럼에도 불구하고 주기억 장치, 레지스터, 마으코르포르세서, 입출력 포트 같은 컴퓨터의 하드웨어 장치를 직접 제어할 때는 매우 유용하다.




#02. 고급언어



사용자의 요구 수준이 높아지고 컴퓨터 기술이 발달하면서 다양한 고급 언어가 개발되었다.

고급 언어는 하드웨어의 기술적 요소를 구체적으로 몰라도 쉽게 작성하고 수정할 수 있다.


고급언어의 특징은 다음과 같다.


일상 언어에서 사용하는 표현을 그대로 가져다 쓸 수 있다.

예를 들어 +는 덧셈, -뺄셈으로 상요한느 등 일반적으로 사용하는 단어나 표현을 그대로 쓴다.


기계어나 어셈블리어를 쓰려면 기억장치에 데이터를 읽거나 쓸 때 기억 장소의 주소를 정확히 알아야 한다.

이에 비해 고급 언어는 번지 대신 변수 이름으로 기억 장소에 접근하므로 사용자가 기억 장소의 주소를 일일이 기억할 필요가 없다.


명령어 하나로 다수의 동작을 지시한다.

예를 들어 X = Y + Z × W 명령어는 Z와 W를 먼저 곱하고 그 결과를 Y에 더해 X에 대입하라는 뜻이다.

이처럼 하나의 명령어로 다수의 연산을 실행한다.


다음 그림은 고급 언어로 작성한 프로그램을 실행하는 과정이다. 프로그래머는 먼저 고급 언어와 같은 프로그래밍 언어를 이용해 원시 코드를 작성한다. 그 다음 번역기(컴파일러)가 원시 코드를 목적 코드로 번역한다. 여기서 목적 코드는 긱어로 된 프로그램으로 컴퓨터가 바로 실행할 수 있는 상태의 프로그램 코드이다. 목적 코드는 메모리로 옮겨져 실행되고 결과물을 계산해 낸다.




※ 프로그램 작성과 실행과정





종류에 따라 다르지만 고급 언어는 다음과 같은 형식적인 규칙이 있다. 이를 프로그래밍 언어의 문법 구조(Syntax)라 한다.


어떤 구조와 순서가 있다.

특별한 기호를 사용한다.

언어에 따라서는 마침표( . )나 세미콜론( ; ) 등을 사용한다.


대표적인 고급 언어로는 C언어를 비롯해 포트란(FORTRAN), 코볼(COBOL), 파스칼(PASCAL), C++, 자바(JAVA), 스몰토크(SMALLTALK) 등이 있다.





#03. 프로그래밍 언어의 발전


나라마다 사용하는 언어가 다르듯 프로그래밍 언어도 수백 종 이상이 개발되어 사용되고 있다. 언제 개발되었고 어떻게 발전되어 왔는지 살펴보자.



① 1950년대 언어


이전까지 기계어로 작성하던 프로그램을 1950년대 초에 처음으로 어셈블리어로 작성하였다.

어셈블리어는 기계어인 0과 1을 인간이 이해하기 쉬운 코드로 바꾸어 기계어보다 작성하기 쉬웠지만, 하드웨어 위주의 언어라는 제약이 따랐다.

그러던 중 과학 분야의 복잡한 계산을 수행하기 위해 포트란(FORTRAN, FORmula TRANslator)이 개발되었다.

포트란은 프로그래밍 언어가 발전하는데 새로운 이정표를 세웠다.



② 1960년대 언어


포트란을 발전시킨 과학기술용 고급 언어가 잇따라 개발되었고, 사무 처리용 고급 언어도 개발되었다.

대표적인 사무 처리용 언어가 코볼(COBOL, COmmon Business Oriented Language)이다.

코볼은 미국 국방성이 후원하여 컴퓨터 제품 간의 호환성 문제를 해결하기 위해 개발한 것으로, 수차례의 수정과 보완을 거쳐 사무 처리용 언어로 확고히 자리를 잡았다.

포트란 같은 과학기술용 언어는 프로그램을 수학적 푝법을 사용하여 작성하는데 반해, 코볼은 영어에 가까운 구문을 사용하기 때문에 작성하기도 편하고 이해하기 쉽다는 장점이 있다.

1960년대 포트란과 코볼의 장점을 살린 하이브리드 형태인 PL/I(Programming Language One)이 등장해 관심을 크게 끌었지만, 오늘날에는 코볼에 비해 사용 빈도가 낮은 편이다.



③ 1970년대 언어


하드웨어 가격이 떨어지고 소프트웨어가 복잡해지면서 프로그래밍 언어 역시 소프트웨어 중심으로 비중이 옮겨가기 시작했다.

소프트웨어의 복잡성과 관리가 중요한 쟁점으로 떠오르면서 더 강력하고 새로운 개념의 언어가 필요해졌다.

이렇게 개발된 언어가 C언어와 파스칼(PASCAL)이다.


C언어는 원래 시스템 소프트웨어를 개발하는 언어였지만 다양한 종류의 컴퓨터에 이식할 수 있다는 점 때문에 현재까지도 여러 분야에 두루 사용되고 있다. 실제로 수많은 워드프로세서, 스프레드시트, 그래픽 프로그램, 게임 등이 C언어로 제작되었다.

유닉스 운영체제가 등장하면서 C언어의 인기가 날로 높아졌는데 이것은 비트 연산과 같은 저급 언어 기능을 갖추고 있어 빠르고 효율적이기 때문이다.

물론 이후 등장한 언어에 비해 배우기가 어렵고 보고서 작성이나 데이터 파일 조작이 많은 업무에는 부적합하다는 단점이 있다.


파스칼은 프랑스 수학자인 파스칼(Pascal)의 이름에서 따온 언어로, 1969년에 스위스 취리히 공과대학의 니클라우스 위스(Niklaus Wirth) 교수가 개발했다.

파스칼은 당시 유행한 구조적 프로그래밍에 적합한 언어이기도 했고, 쉽게 배울 수 있는 것은 물론 이공계 및 과학계 종사자가 주로 사용하는 그래픽 처리 기능 또한 뛰어나 많은 사람에게 주목을 받았다.

하지만 대화식 입출력이나 사무 처리 분야에 응용하기엔느 부족했고, C언어에 비해 사용자를 크게 늘리지 못하면서 1990년대 중반 이후에는 인기가 시들해졌다.



④ 1980년대 언어


본격적으로 컴퓨터 하드웨어 가격이 떨어지면서 개인용 컴퓨터와 중앙 컴퓨터가 연결된 단말 시스템을 이용한 분산 처리 개념이 확산되었다.

이러한 이유로 학생들과 컴퓨터 초보자들도 쉽게 배울 수 있는 교육용 언어가 필요해졌고 이때 등장한 언어가 베이직(BASIC)이다.

베이직은 쉽게 배울 수 있고 중앙 컴퓨터와 연결된 단말 시스템에서 처리하는 시분할 시스템(Time Sharing System)운영 에 적합한 기능을 가지고 있어 많은 인기를 끌었다.

다만 비교적인 측면이 있어 소프트웨어 규모가 커질 수록 관리하기 번잡해지고 운영이나 유지가 많이 어렵다는 단점이 있었다.

이후 이러한 단점을 개선한 퀵 베이직(Quick Basic)과 비주얼 베이직(Visual Basic) 등이 등장했고 지금까지도 널리 사용되고 있다.



⑤ 1990년대 언어


객체 지향 언어가 본격적으로 등장했다.

특히 GUI(Graphical User Interface) 환경의 프로그래밍을 위한 여러 클래스의 라이브러리가 등장하면서 객체 지향 언어의 장점이 크게 부각되었다.

이러한 추세에 맞춰 C++, 자바(JAVA), 비주얼 베이직(Visual Basic)등의 객체 지향 언어가 등장했다.

이들 언어은 기존의 객체 개념을 업그레이드하고 GUI 개념을 강화하는 방향으로 더욱 발전해 나갔다.


비주얼 베이직은 베이직과 퀵 베이직을 개선하여 객체 지향 개념을 보강한 언어이다.

GUI 기능을 내세워 사용자가 쉽게 사용할 수 있어 지금까지 많이 활용된다.



⑥ 2000년대 이후 언어


2000년대에 접어들면서 사용자는 더욱 간편하고 쉬운 방법으르 프로그래밍하길 원했고 이미 개발된 프로그램을 쉽게 가져다 쓸 수 있는 소프트웨어가 나오길 기다렸다.

강화된 기능의 웹과 저렴해진 하드웨어는 이러한 사용자 요구를 만족시킬 방법을 찾아냈다.


먼저 파워빌더(PowerBuilder), 델파이(Delphi), 각종 쿼리(Query) 전용 언어 등 소위 4세대라 불리는 언어가 등장했다.

4세대 언어는 특정 상황에 맞춤식으로 사용할 수 있고, 종래의 고급 언어보다 사용하기가 쉽다.

또한 사용자에게 강화된 텍스트 환경이나 시각 환경을 제공한다.


객체 지향 프로그래밍 기법이 발전하면서 소프트웨어 모듈을 컴포넌트화하여 필요할 때마다 사용할 수 있도록 하는 소프트웨어 컴포넌트 기술도 빠르게 발전했다. 이 기술은 소프트웨어를 전자 부품처럼 통일된 인터페이스로 제작함으로써 소프트웨어(Software Factory)을 만들 수 있도록 도왔다.

소프트웨어 컴포너트는 차세대 소프트웨어 기술의 핵심 분야로 인식되면서 소프트웨어 생산성 향상을 위한 필 수 기술로 대두 되었다.


이 시기에는 객체 지향 기술과 웹이 결합하여 다양한 정보를 제공하는 기법이 발전했다.

XML(eXtensible Markup Language)과 VRML(Virutal Realiry Modeling Language) 등 각종 웹 프로그래밍 언어가 등장했다.

XML은 HTML의 한계를 극복할고 만든 언어로 다른 시스템 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고받을 수 있도록 한다.

VRML은 인터넷이나 로컬 시스템에서 3차원 개체나 세계를 표현하기 위한 파일 형식이다.

XML과 VRML은 기존 객체 지향 언어와 결합하여 인터넷에서 텍스트, 이미지, 애니메이션, 사운드 등을 비롯한 가상현실(Virtual Reality) 까지 구현할 수 있는 기술로 발전하고 있다.


최근에는 5세대 언어라 불리는 인공지능 기능을 이요해 자연 언어(Natural Language)로 직접 처리하는 기법에 대한 연구가 활발히 진행되고 있다.

음성인식 시스템이나 자동 번역 시스템 등도 이러한 기법의 일부라 할 수 있다.






※ 프로그램 작성과 실행과정









반응형
//

[Concept] DNS(Domain Name System) 이란?[Concept] DNS(Domain Name System) 이란?

Posted at 2019. 6. 20. 16:46 | Posted in Computer Concepts
반응형




참고 : https://support.google.com/a/answer/48090?hl=ko

참고 : https://aws.amazon.com/ko/route53/what-is-dns/





■ DNS(Domain Name System)의 기본사항




-. DNS는 도메인 이름 시스템을 의미하며, 기본적으로 웹에서 도멘인을 정리하고 확인하는 전화번호부와 같은 역할을 한다.

-. 스마트폰이나 노트북부터 대규모 소매 웹 사이트 콘텐츠를 서비스 하는 서버에 이르기까지 인터넷상의 모든 컴퓨터는

   숫자를 사용하여 서로를 찾고 통시하는데 이러한 숫자를 IP주소라고 한다.

-. 웹 브라우저를 열고 웹 사이트로 이동할 때는 긴 숫자를 기억해 입력할 필요없이 wickedmiso.com 같은 도메인 이름을 입력해 원하는 웹 사이트로 갈 수 있다.

-. "Acme Pizza"와 같은 이름이 전화번호부를 통해 전화번호로 변환되는 것처럼, "www.google.com"과 같은 웹 주소는 웹 주소는

  DNS를 통해 "74.125.19.147"과 같이 사이트(이 경우 Google 홈페이지)를 호스팅하는 컴퓨터의 실제 IP주소로 변환된다.





■ DNS SERVER의 역할









① 사용자가 웹 브라우저를 열어 주소 표시줄에 www.domain.com 을 입려가호 Enter키를 누른다.


② www.domain.com에 대한 요청은 일반적으로 케이블 인터넷 공급업체, DSL 광대역 공급업체 또는 기업 네트워크 같은 인터넷 서비스 제공업체()


③ ISP의 DNS 해석기는 www.domain.com에 대한 요청을 DNS 루트 이름 서버에 전달한다.


④ ISP의 DNS 해석기는 www.domain.com에 대한 요청을 이번에는 .com 도메인의 TLD 이름 서버 중 하나에 다시 전달한다.

 

⑤ ISP의 DNS 해석기는 DNS 네임 서버 하나를 선택해  www.domain.com에 대한 요청을 해당 이름 서버에 전달한다.


⑥ DNS 네임 서버는 domain.com 호스팅 영역에서 www.domain.com 레코드를 찾아 웹 서버의 IP 주소(예 : 120.0.0.1)에 연관된 값을 받고

   이 IP 주소를 DNS 해석기로 변환한다.


⑦ ISP의 DNS 해석기는 마침내 사용자에게 필요한 IP주소를 확보하게 된다. 해석기는 이 값을 웹 브라워로 반환한다.

   또한, DNS 해석기는 다음에 누군가가 example.com을 탐색할 때 좀 더 빠르게 응답할 수 있도록 사용자가 지정하는 일정 기간동안

   domain.com의 IP주소를 캐싱(저장)한다.(자세한 내용은 TTL(Time to Live)을 참조)


⑧ 웹 브라우저는 DNS 해석기로 부터 얻은 IP 주소로 www.domain.com에 대한 요청을 전송한다.

    여기서 콘텐츠가 있는 곳으로, 예를 들어 웹 사이트 엔드포인트로 구성된 웹 서버이다.


⑨ 120.0.0.1에 있는 웹 서버 또는 그 밖의 리소스 www.domain.com의 웹 페이지를 웹 브라우저로 반환하고, 웹 브라워는 이 페이지를 표시한다.










■ DNS의 종류





# MX 레코드(Mail Exchanger Record)


-. 메일 교환(MX) 레코드는 도메인 이메일을 도메인의 사용자 계정을 호스팅하는 서버로 전송한다.




# TXT 레코드(Text Record)


-. TXT 레코드는 도메인 외부 소스에 다양한 목적으로 사용될 수 있는 텍스트 정보를 제공하는 DNS 레코드이다.

-. 레코드 값은 사람이나 컴퓨터가 읽을 수 있는 텍스트가 될 수 있다.




# CNAME 레코드(Canonical Name Record)


-. CNAME 레코드 즉 정규 이름 레코드는 다른 페이지에 정규 도메인 이름앞에 별칭 이름을 지어 연결한다.

-. 예를들어 www.wickedmiso.com을 wickedmiso.com 혹은 blog.wickedmiso.com 으로 연결할 수 있다.




# A 레코드(Address Mapping Records)


-. A 레코드는 주소 레코드 혹은 호스트 레코드라고 한다.

-. 도메인 서비스를 호스팅하는 컴퓨터의 실제 IP주소에 도메인을 연결한다.




# NS 레코드(Name Server Records)


-. 네임 서버 레코드는 도메인에 대해 어떤 서버가 DNS 정보를 전달할지 결정한다.

-. 일반적으로 도메인에 기본 및 보조 네임서버 레코드가 있다.




# TTL(Time To Live)


-. TTL은 다음 레코드 변경사항이 적용될 때까지 걸리는 시간(초)을 결정하는 DNS 레코드 값이다.

-. MX레코드, CNAME 레코드 등 도메인의 각 DNS 레코드에는 TTL 값이 포함된다.

-. 레코드의 현재 TTL은 변경사항이 적용될 때까지 걸리는 시간을 결정한다.

  예를 들어 TTL값이 86,400초인데 레코드는 변경사항은 적용될 때까지 24시간이 소요된다.



※ 레코드 설정을 단축하는 방법

  · 레코드의 TTL을 변경하면 향후 변경사항이 적용되는 시간에 영향을 준다.

  · 인터넷사의 서버가 레코드의 업데이트 사항을 매시간 확인하도록 TTL값을 3600으로 설정하는 것이 좋다.

  · 단축된 TTL은 이전 기간이 만료된 후에만 효력을 발생한다.

  · 이렇게 하면 향후 레코드를 업데이트할  경우 변경사항이 적용될 때까지 한시간이 소요된다.

  · 변경사항을 신속하게 되돌릴 필요에 대비하는 등 다음 변경사항이 더욱 빠르게 적용되도록

    TTL을 300초(5분)와 같이 더 짧게 설정할 수도 있다.

  · MX레코드가 올바르게 구성되면 TTL값을 86400으로 설정하는 것이 좋다. 이렇게 하면 인터넷상의

   서버에서 24시간 마다 확인하여 MX 레코드를 업데이트 하게 된다.





# URL(Uniform Resource Locator)


-. URL은 인터넷 리소스의 웹 주소로, 특정 웹 사이트를 방문하기 위해 브라우저에 입력하는 주소이다.








■ DNS 구성 예시



-. DNS 설정시 실제 도메인 이름이 아닌 @기호를 사용하여 도메인 이름을 표시한다.



※ Google Cloud 서비스와 함께 사용된ㄴ 도메인의 샘플 DNS 설정

이름 / 호스트 / 별칭 

레코드 유형

우선순위

예) 값 / 응답 / 목적지

공백 또는 @

A

NA

 216.239.32.21

공백 또는 @

A

NA

 216.239.32.21

공백 또는 @

A

NA

 216.239.32.21

공백 또는 @

A

NA

 216.239.32.21

공백 또는 @

MX

1

 ASPMX.L.GOOGLE.COM.

공백 또는 @

MX

5

 ALT1.ASPMX.L.GOOGLE.COM.

공백 또는 @

MX

5

 ATL2.ASPMX.L.GOOGLE.COM.

공백 또는 @

MX

10

 ASPMX2.GOOGLEMAIL.COM.

공백 또는 @

MX

10

 ASPMX3.GOOGLEEMAIL.COM.

공백 또는 @

CNAME

NA

 ghs.googlehostedcom.

공백 또는 @

TXT

NA

 google-site

 verification=6tTalLzrBXBO4Gy9700TAbpg2QTKzGYEuZ_Ls69jle8

공백 또는 @

TXT

NA

 v=spf1 include:_spf.google.com ~all

www

CNAME

NA

 ghs.googlehosted.com.









반응형
//