컴퓨터 공학 개론 : 프로그래밍 언어와 소프트웨어 공학

지바·2022년 6월 3일
0

컴퓨터 공학 개론

목록 보기
3/3
post-thumbnail

1. 프로그래밍 언어

1-1. 역사적 고찰

1세대 언어 '기계어'

2세대 언어 '어셈블리 언어' : 기계 명령을 표기하기 위한 기호 체계로, 기호 표현을 기계어 명령으로 변환해주는 어셈블러(assembler)라는 프로그램을 개발하여 사용할 수 있습니다. (기계 명령과 어셈블리 명령 사이에는 일대일 대응관계가 존재하며, 본질적으로 기계 종속적입니다.)

3세대 언어 '프로그래밍 언어' : 이들은 보다 큰 단위의 명령을 표현할 수 있는 고급 수준의 프리미티브를 가지고 있으며, 특정 컴퓨터의 특성에 의존하지 않는 기계독립적이라는 점에서 이전 세대의 언어들과 차별화 되죠. 컴파일러라고 불리는 프로그램에 의해 기계어로 변환되며 각 프리미티브는 여러개의 기계어 명령에 대응됩니다.

  • 요약하자면, 이전에는 '사람이 컴퓨터 특성에 맞추어야하는 환경에서 문제를 해결'한 반면에 현재는 '컴퓨터가 사람의 특성에 맞추어진 환경에서 문제를 해결'합니다.

1-2. 언어의 구현 : 번역 과정

  • 소스 프로그램 : 원래 형태의 프로그램
  • 목적 프로그램 : 번역된 버전
  • 번역 과정 세가지

1. 어휘 분석기 : 소스 프로그램에서 하나의 개체, 즉 토큰(token)을 표현하는 기호열을 인식하는 과정입니다. ( 개별 문자가 아니라 단어별로!)
2. 구문 분석기 : 토큰들을 문장으로 묶으며, 구문 다이어그램을 통해 구문 분석 트리를 생성합니다.
3. 코드 생성기 : 구문 분석기가 인식한 문장을 구현하기 위해 기계어 명령을 생성하는 단계입니다.

1-3. 객체지향 프로그래밍

  • intro) 객체지향 패러다임에서는 객체(object)라는 프로그램 단위를 개발하게 됩니다.

1. 클래스와 객체

  • 객체(object) : 데이터와 프로시저를 포함하는 능동적 프로그램 단위입니다.
    • 객체의 구성 요소?

    1. 인스턴스 변수 (instance variable) : 객체 안에 들어있는 변수로 객체 내부의 정보를 저장합니다.
    2. 메서드 (method) : 객체 안의 함수(프로시저)
    3. 생성자 (constructor) : 객체가 처음 생성될 때 객체의 초기화에 사용되는 특별한 메서드입니다.

  • 클래스(class) : 객체지향 프로그램에서 객체들을 위한 틀(template)

2. 상속(inheritance)

  • 기존의 객체들과 비슷하지만, 약간 다른 특성을 갖는 객체들에 대한 기술을 쉽게 할 수 있도록 하기 위해 객체 지향 언어들은 상속이라고 불리는 기법을 통해 새로운 클래스가 이미 정의 되어 있는 클래스를 사용하여 정의할 수 있게 합니다.

3. 다형성(polymorphism)

  • 객체마다 메세지를 자신에 맞게 달리 해석하는 것으로, 이러한 메세지를 다형적이라고 합니다. 즉 메서드 호출이 적용 개체에 따라 달리 해석되는 것이죠.

4. 캡슐화(encapsulation)

  • 객페의 내부 속성에 대한 접근을 제한하는 것을 가리킵니다. 객체의 어떤 속성이 캡슐화되어 있다고 하는 것은 그 속성을 오직 객체 자체에서만 접근할 수 있다는 것입니다. 이러한 속성을 전용(private) 속성이라고 합니다. 반면에 외부에서 접근이 가능한 속성은 공용(piblic) 속성이라고 합니다.

1-4. 병행활동 프로그래밍

1. 병렬(parallel) 또는 병행(concurrent) 처리

  • 여러 프로세스의 동시 실행을 말합니다.
  • 각 활성화에 한 개씩 여러개의 CPU 코어가 필요하죠.
  • CPU가 하나밖에 없을 경우 시분할 방식(여러개의 활성화가 단일 프로세서의 시간을 나누어 쓰는 것) 같이 사용합니다.

2.모니터(monitor)

  • 자신에 대한 접근 제어 능력을 갖춘 데이터 항목입니다.

    모니터가 왜 있을까? 에 대해 알기 위해서는 '상호 배제(Mutual Exclusion)'라는 단어에 대해서 먼저 알아야합니다. 상호 배제란 한 번에 한 프로세스만이 데이터에 접근하는 것인데요.

    공유 데이터에 접근하는 각 프로그램의 단위는 상호 배제를 지킬 수 있도록 적절히 설계되어야 하는데, 이 때 한 부분이라도 잘못 설계되면 전체에 문제가 생깁니다.

    따라서 데이터 항목 자제가 자신에 대한 접근 제어 능력을 가지는게 더 나은 해결책으로 주장이 되었고,이러한 능력을 가진 항목이 바로 '모니터' 입니다.

2. 소프트웨어 공학

  • 소프트웨어 생명 주기는 '개발, 사용, 유지보수(계속 진행)'

2-1. 소프트웨어 생명주기의 개발 단계

1. 요구사항 분석
2. 설계
3. 구현
4. 테스트

2-2. 소프트웨어 공학 방법론

초창기에는 '요구사항 분석, 설계, 구현, 테스트' 순차적으로 수행할 것을 주장하였으나, 이러한 방식은 개발 과정에서 변화를 허용한다면 너무 많은 위험을 따르게 되었습니다. 따라서 소프트웨어 엔지니어들은 구현이 시작되기 전에 설계가 완료되어야 한다고 주장했고, 이렇게 개발된 것이 폭포수 모델입니다.

폭포수 모델 : 개발 과정이 한 방향으로만 이루어지는 것.

최근에 와서 "자유분방한" 시행착오 과정 사이의 모순을 극복하는 방향으로 발전하고 있고, 이에 해당되는 것이 '점진적 모델' 입니다.

점진적 모델 : 프로토타이핑(prototyping) 이라는 소프트웨어 개발 방식을 이용하는데, 프로토타입(prototype) 이라는 제안 시스템의 미완성 버전을 구축하고 평가합니다. 그리고 진화적 프로토타이핑 과정에 의해 완성된 최종 시스템으로 발전해 나갑니다.

vs 반복형 모델 : 최종 설계를 구현하면서 프로토타입을 버리는 폐기형 프로토타이핑 방식을 활용합니다.

공개소스 개발 : 점진형 및 반복형 방식의 비정형적 변형의 하나로 컴퓨터 전문가들 사이에 잘 알려져있는 방식입니다. 오늘날 무료 소프트웨어의 많은 수가 이 방식으로 개발됩니다. ex) 리눅스 운영체제

기민성 방법 : 폭포수 모델과 가장 많은 차이가 나는 방법이죠. 대표적인 예시로 XP(eXtreme Programing)이 있습니다. 이 모델은 10여명 이내의 개발자로 이루어진 팀이 자유롭게 생각을 나누고 서로를 돕는 방식으로 개발합니다.

기민성 방법의 가장 중요한 키워드는 '유연성' 이며, 프로그래머들과 관리자들이 전체 소프트웨어 개발 업무 중 각자 자신이 맡은 일을 독립적으로 수행하는 폭포수 모델과는 대조적입니다.

2-3. 모듈화

: 관리하기 쉬운 소프트웨어를 만드는 방법!

모듈 간의 결합도

  • 제어 결합 : 함수 호출의 경우에서처럼 한 모듈이 다른 모듈에게 실행 제어를 넘길 때 발생.
  • 데이터 결합 : 모듈 사이의 데이터 공유를 뜻합니다. 두 모듈이 동일한 데이터 항목을 사용할 경우 한 모듈의 변경은 다른 모듈에도 영향을 미칠 수 있습니다.

모듈의 응집도

  • 논리적 응집도 : 약한 형태의 응집도로, 이것을 모듈 내부의 요소들은 논리적으로 비슷한 활동을 수행한다는 것에서 도출된 것입니다.
  • 기능적 응집도 : 강한 형태의 응집도로, 한 모듈 안의 모든 부분은 한가지 수행에 초점을 맞추어야 함을 의미합니다.

3. 소프트웨어의 품질 보증

3-1. 유리박스 테스트

  • 소프트웨어를 테스트 하는 사람이 소프트웨어의 내부 구조를 잘 알고 있을 경우 사용합니다.

    ex1. 파레토(Pareto) 원리 : 특정 부분에 집중하여 문제를 찾는 것! 소프트웨어 상의 오류는 모여서 나타나는 경향이 있다는 걸 활용합니다.

    ex2. 기초 경로 테스트(basis path testing) : 소프트웨어 안의 모든 명령이 적어도 한 번씩은 실행되도록 보장하는 테스트 데이터 집합을 개발 하는 것입니다.

3-2. 블랙박스 테스트

  • 유리박스 테스트와 대조되며, 소프트웨어 내부 구성에 대한 지식에 의존하지 않는 테스트입니다. 즉 사용자의 관점에서 수행되고, 여기선 소프트웨어가 어떻게 작업을 수행하는지 대해 관여하지 않으며, 정확성과 시간을 기준으로 평가합니다.
    ex) 경계값 분석, 중복성 테스트, 베타 테스트
profile
컴퓨터에 관심이 많은

0개의 댓글