[5분 지식] 소프트웨어 공학 – 객체지향, 좋은 공학 설계 중요성, 필요성

오늘은 소프트웨어 공학에서 객체지향, 좋은 공학 설계 중요성, 필요성에 대해서 알아보고자 합니다.
개발자라면 오늘의 주제에 대해서 누구나 고민해봤을 것이기 때문에 확실하게 정리하는 시간이 필요하다 생각했기에
많은 분들께 도움이 되었으면 좋겠습니다.

0. 오늘의 목표

학습 목표는 소프트웨어 공학이 무엇인지 느낌만 오더라도 목표를 달성한 것으로 하겠습니다.
개인적으로는 공부란 누구의 지식을 그대로 외우는 것이 아니라 이해하고,

“내 것으로 나만의 구조로 다시 한 번 만들어 내는 것”

이라 생각하기 때문입니다.

1. 소프트웨어 공학이란?

소프트웨어 공학

소프트웨어 공학은 프로그램의 개발, 운영, 유지보수 등을 체계적이고 전문적으로 접근하는 공학 분야입니다.(위키에는 조금 더 복잡하게 적혀있습니다.)
착각하기 쉬운 점은 소프트웨어 개발이 단순하게 코드를 짜는 것으로 아시는 분이 많지만
‘제품을 만들고 프로그램을 만드는 프로젝트 전 과정’을 아우르는 분야라고 생각하시면 됩니다.

설계에서 사용하는 UseCase, DFD 등, 개발에 사용하는 객체지향, 디자인 패턴, 테스트에 사용하는 화이트/블랙 박스 테스팅, 유지보수까지 전문적으로 접근하는 분야

1.1. 소프트웨어 공학의 목표

저는 개발자의 본질에 대해서 설명하는 것이 더 이해가 쉽다고 생각하기에,
왜 개발자가 필요한가에 대해 간단히 소개하겠습니다.

"개발자는 사람을 위한 직업"

개발자는 사람을 위해 서비스를 제공하거나 기술을 만들어 냅니다.
기술을 통해서 사람은 빠르게 배우고, 발전하며 산업을 성장시킵니다.

그런데 만약 지금은 1년에 몇 번씩 출시되는 핸드폰이, 자동차가, 키보드를 만드는데 3년이 걸린다면요?

기능 하나를 추가하기 위해서 제품을 처음부터 다시 설계해야 한다면요?
제품의 가격은 기하급수적으로 올라가고 핸드폰 하나에 3천만 원씩 하게될 겁니다.

빠르게 눈치채신 분들은 이해하셨겠지만 개발 시간 단축과 재사용성, 확장성에 대한 이야기였습니다.

이처럼 소프트웨어 공학의 목표는 아래 4가지가 됩니다.

– 제품의 품질 향상
– 생산 비용 절감
– 개발 시간 단축
– 개발 표준화

결국 제품과 서비스를 만드는 것에 있어서 빠르고 저렴하고 질 좋은 제품을 고객에게 제공하기 위한 것이죠.

1.2. 객체지향은 왜 필요한가?

객체지향에 대해서 조금이라도 공부해보셨다면 위 4가지 장점을 보고 바로 떠올리실 겁니다.

“아!! 객체지향을 하면 소프트웨어를 보다 유연하고, 유지보수가 용이하며, 확장 가능하게 만들수 있겠구나!”

객체지향은 객체를 통한 캡슐화, 다형성, 상속성을 통해 소프트웨어 내에서
코드의 품질을 향상하고 개발 시간을 단축합니다.

이 방식은 복잡한 소프트웨어 시스템에서도 모듈성과 재사용 가능성을 극대화하여
여러명의 개발자가 협업하더라도 개발자가 보다 효과적으로 코드를 관리하고,
오류를 줄이며, 개발 시간을 단축할 수 있게 돕습니다.

객체지향의 간단한 장점은
캡슐화: 객체는 특정 기능을 수행하는 데이터와 메서드(함수)를 하나로 묶어 관리합니다. 이는 내부 구현을 숨기고 사용자에게는 간단한 인터페이스만을 제공하여 복잡성을 감소시키는 데 도움을 줍니다.

상속성: 객체지향 프로그래밍에서 클래스는 다른 클래스의 특성을 상속 받을 수 있습니다. 이를 통해 공통의 기능을 가진 클래스를 재사용하여 새로운 클래스를 만들 수 있으며, 이는 개발 시간과 비용을 줄이고, 소프트웨어의 유지보수를 용이하게 합니다.

다형성: 다형성은 메서드나 객체가 다양한 방식으로 동작할 수 있게 하는 기능입니다. 이는 동일한 인터페이스나 메서드 호출에 대해 서로 다른 클래스의 객체들이 다른 행동을 할 수 있게 해, 더 유연하고 확장 가능한 코드를 작성할 수 있도록 돕습니다.

2. 소프트웨어 공학 설계의 중요성

소프트웨어 설계는 당연히 가장 공을 들여야하는 부분 중 하나입니다.
잘 만들어진 설계는 전체적인 개발 기간을 줄이고 필요없는 비용을 절감하며

궁극적으로 안정적인 소프트웨어 개발을 가능하게 합니다.

저는 학부 때부터 설계에 대한 중요성을 늘 강조했던 사람 중 한명으로
사실 코드 개발은 초등학생도 배우기만 한다면 할 수 있다고 생각했습니다.(실제로 요즘은 AI가 많이 하죠…)

하지만 설계는 핵심인력이 하는 것이고 대체 불가능한 업무라고 생각했기 때문입니다.(이것도 요즘은 AI가 많이 하지만..)

아직도 그렇게 생각하는 이유는 무엇이든 할 때는 계획이 가장 중요한 것은 변할 수 없는 진리이기 때문입니다.

설계의 과정에서 필요한 목표는 크게 5가지정도로 잡을 수 있습니다.

– 프로젝트의 명확한 요구명세
명확한 요구 명세는 프로젝트의 범위를 정의하고, 모든 팀원과 이해관계자가 동일한 목표와 기대를 가질 수 있도록 합니다.
요구 사항을 수집, 분석, 문서화하고, 이를 기반으로 기능적 및 비기능적 명세를 작성해서 최종 결과물이 무엇인지 확실히 알 필요가 있습니다.

– 재사용성과 확장성
재사용성은 기존에 개발된 컴포넌트를 새로운 시스템, 혹은 다른 기능에서 재활용할 수 있도록 설계하는 것을 의미합니다.
이를 통해 개발 시간과 비용을 절감하며, 일관된 품질을 유지할 수 있습니다.
확장성은 소프트웨어가 변경 또는 기능 추가를 위해 전체적인 프로그램을 수정하지 않도록 효과적으로 대응할 수 있는 능력을 가리킵니다.

– 리스크 관리
소프트웨어 설계 과정에 리스크 관리를 통합하는 것은 프로젝트 리스크를 미리 식별하고, 평가하며, 완화하기 위함입니다.
이는 개발 단계에서 잠재적인 문제를 예측하고 대비할 수 있게 하여, 비용 초과, 일정 지연, 기술 실패 등의 위험을 줄입니다.
리스크 관리는 지속적인 과정으로, 프로젝트의 모든 단계에서 주기적으로 검토하고 조정합니다.

– 테스트 및 유지보수성
테스트 가능한 설계는 개발 과정에서 결함을 조기에 발견하고 수정할 수 있도록 돕습니다.(요즘은 필수죠)
테스트 계획은 설계 초기에 통합되어 기준을 잡아야하며, 코드가 명확하고 접근 가능해야 테스트가 용이합니다.
유지보수성은 소프트웨어가 변경, 수정, 업데이트될 수 있는 용이성을 의미합니다.
좋은 설계는 차후 수정이 간단하고 빠르게 이루어질 수 있도록 합니다.

– 협업 구축
회사차원에서 소프트웨어 설계는 항상 여러 개발자와 팀이 참여하는 복잡한 과정입니다.
효과적인 협업 구축을 위해 설계 문서는 명확하고 이해하기 쉬워야 하며, 모든 팀원이 접근할 수 있어야 합니다.(그래야 하나의 목표를 향해 함께 갈 수 있습니다.)
협업 도구와 프로세스는 팀 내외의 커뮤니케이션을 촉진하고, 일관된 목표를 향해 나아갈 수 있도록 도와야 합니다.

목표만 보더라도 왜 꼭 해야하는 것인지 아시겠죠?

3. 마무리

오늘 우리는 소프트웨어 공학의 정의, 그 중요성과 필요성에 대해 깊이 있게 살펴보았습니다.
물론 개인적인 의견을 말씀드린 것이고 글의 전체적인 가독성은 가비지콜렉터가 수집해버린것 같지만
그래도 내용이 적으면 이해할 수 없다고 생각했습니다..

이 내용을 이해하는 것은 개발자로서 기본이라고 생각하기 때문에 중요하다는점 거듭 강조드립니다.
앞으로도 계속해서 공부하고, 배운 것을 실제로 적용하며, 지속적으로 발전해 나가기 위해 계속해서 공부해보시죠!!

아래 링크는 제가 작성했던 다른 내용으로 AI를 활용하는 방법에 대해서 적은 글입니다.
심심하실때 한 번씩 봐주시면 감사하겠습니다ㅎㅎ

이 게시글이 얼마나 유용했습니까?

평점을 매겨주세요!

평균 별점 0 / 5. 투표 수 : 0

가장 먼저, 게시물을 평가 해보세요.

2 thoughts on “[5분 지식] 소프트웨어 공학 – 객체지향, 좋은 공학 설계 중요성, 필요성”

Leave a Comment

우클릭이 불가능 합니다.