📌 공부 계기

객체 지향 프로그래밍을 한다면! 이를 지키기 위한 5가지 원칙에 대해 알 필요가 있기에 공부! 일단은 가장 기본적인 사항만 먼저 정리!

 

📍SOLID란?

객체 지향의 5대 원칙으로 각 원칙의 첫 머릿글자를 따서 SOLID라고 합니다.

S : SRP : Single Responsibility Principle : 단일 책임 원칙

O : OCP : Open-Colosed Principle : 개발-패쇄 원칙

L : LSP : Liskov Substitution Principle : 리스코프 치환 원칙

I : ISP : Interface Segregation Principle : 인터페이스 분리 원칙

D : DIP : Dependency Inversion Principle : 의존성 역전 원칙

 

📍SRP : Single Responsibility Principle : 단일 책임 원칙

- 한 클래스는 단 한가지의 책임(변경 이유)를 가져야한다.

여기서 변경을 위한 이유 책임이라 하며, 변경의 이유가 여러가지가 생겼다면 한가지 이상의 책임을 맡고 있는 것이다. 

- 이는 응집도와 관련이 있으며, 응집도는 하나의 클래스가 하나의 추상적인 개념을 나타내며, 그 클래스의 목적과 의미가 한 줄로 기술 할 수 있어야 한다.

 

📍OCP : Open-Colosed Principle : 개발-패쇄 원칙

- 확장에는 열려있어야하고 변경(코드 수정)에는 닫혀있어야 한다.

이는 시스템을 확장하기는 쉬워야 하는데 변경으로 인해 시스템에 너무 큰 영향을 줘선 안된다는 목표를 가지고 설계해야한다. 

- 코드를 수정하려면 상속해서 수정?

 

📍LSP : Liskov Substitution Principle : 리스코프 치환 원칙

- 상위 타입의 객체를 하위 타입의 객체로 치환했다고 하더라도 상위 타입으로 동작하던 기존 프로그램은 정상적으로 동작해야하는 원칙이다.

 

📍ISP : Interface Segregation Principle : 인터페이스 분리 원칙

-  클라이언트가 사용하지 않는 메소드에 의존하지 않아야한다는 원칙이다.

 

📍DIP : Dependency Inversion Principle : 의존성 역전 원칙

- 상위 수준의 모듈은 하위 모듈에 의존해서는 안되며, 둘 모두 추상화에 의존해야 한다. 

- 추상화가 구체적인 사항에 의존해서는 안되며 구체적인 사항이 추상화에 의존해야 한다. 


➕ 공부자료 

 

SOLID 원칙

객체지향 5대 원칙

johngrib.github.io

 

 

테스트 코드

기능을 개발한 후 의도대로 정확하게 작동하는 지 검증하는 코드.

 

 

장점:

  • 예상 동작과 실제 동작을 비교하여 빠르고 정확한 테스트가 가능해 초기 개발의 디버깅이 쉬워진다.
  • 애플리케이션이 확장되거나 구조가 변경되더라도 올바르게 작동하는 지 확인 가능하다.
  • 잘 만든 테스트 케이스는 API 기능을 쉽게 파악할 수 있게 해 그 자체로 애플리케이션에 대한 문서로 사용 가능하다.
  • 테스트의 자동화가 가능하다.

 

단점:

  • 테스트 코드까지 작성해야해 개발 시간이 길어진다.
  • 어플리케이션의 변경 사항을 테스트 코드에도 적용해야하기 때문에 이에 대한 유지보수 부담이 증가한다.

 

종류:

  • 단위 테스트(Unit Test)

- 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트를 말하며, 일반적으로 실무에서 테스트 코드라 함은 단위 테스트를 의미한다.

- 프로그램을 작은 단위로 쪼개 어디서 문제가 발생했는지 정확하게 동작하는지 빠르게 확인 가능해 디버깅 시간 단축할 수 있다.

- 리펙토링을 하여도 작은 기능 혹은 메소드 단위이기에 빠르게 문제 여부를 파악하여 안정성을 확보할 수 있다. 

- 테스트에 대한 시간과 비용을 절약 할 수 있다.

 

- 좋고 깨끗한 테스트 코드가 따르는 FIRST 규칙

① Fast : 테스트는 빠르게 동작하며 자주 돌릴 수 있어야 한다.

② Independent : 각각의 테스트는 독립적이며 서로 의존하면 안된다.

③ Repeatable : 어느 환경에서도 반복 가능해야 한다.

④ Self-Validation :  테스트는 bool값으로 결과를 출력해 자체 검증이 되어야 한다.

⑤ Timely : 실제 코드를 구현하기 직전에 구현해야 한다.

 

 

  • 통합 테스트

- 단위 테스트가 끝나고 각 모듈을 결합하면서 하는 테스트

- 개발자가 변경할 수 없는 부분(외부 라이브러리)까지 묶어 검증이 가능하며 단위 테스트때 발견이 어려웠던 버그를 찾을 수 있다.

- 더 많은 코드를 테스트 하기 때문에 단위 테스트보다 어디서 문제가 발생했는지 확인하는 게 어렵다. 

 

- 종류 :

1. 빅뱅 접근법: 시스템을 구성하는 모듈을 각각 따로 구현하고 전체 시스템을 한번에 테스트 하는 방식. 단시간 테스트를 수행할 수 있다는 장점이 있지만, 결함의 격리가 어렵다. 실제 모듈로 진행

 

2. 점증적 접근법: 

① 상향식 : 최하위 모듈부터 합쳐가며 차례대로 최상위 모듈까지 테스트 하는 방식. 결함 격리가 쉽고, 드라이버(Driver)로 테스트를 진행한다.

② 하향식 : 최상위 모듈부터 합쳐가며 차례대로 최하위 모듈까지 테스트 하는 방식, 결함 격리가 쉽고, 스텁(Stub)으로 테스트를 진행한다..

 

3. 샌드위치 접근법

- 상향식과 하향식의 장점을 이용한 방식으로 대규모 프로젝트에서 사용하며, 병렬 테스트가 가능해 시간이 절약된다. 스텁과 드라이버의 필요성이 높으며 시간을 절약하는 대신 비용이 많이 들어간다.

 

* Driver : 완성된 모듈 혹은 컴포넌트를 "임시로 호출"하는 소프트웨어 컴포넌트 혹 테스트 툴. 더미 제어자.

* Stub : 아직 완성되지 않은 모듈 혹은 컴포넌트를 대체하도록 구현한 "임시 모듈 혹은 컴포넌트". 더미 모듈.

 

 

  • E2E(End To End) 테스트

- Endpoint 간의 테스스라 하여 서비스를 사용하는 사용자 입장이 되어 진행하는 테스트. 실제 사용자의 실행 환경과 유사한 환경에서 진행.

- 사용자 관점의 테스트가 가능하며 직접 사용자에게 노출되는 부분을 점검할 수 있다.  

- 다양한 애플리케이션의 의존관계가 정확이 작동하는지 확인할 수 있다.

 

 

 

 

테스트 코드 작성 시 장단점과 테스트 종류 별 특징

장점예상 동작과 실제 동작을 비교하여 빠르고 정확한 테스트가 가능하기 때문에 초기 개발의 디버깅이 쉬워집니다.어플리케이션이 변경(기능 확장 또는 리팩터링 등)되더라도 올바르게 작동

velog.io

 

 

테스트코드 종류 및 장단점

장점빠르고 정확한 테스트 가능 (예상 동작 VS 실제 동작)테스트 자동화 가능배포 절차 시 테스트 코드가 수행되어 동작 검증리팩토링 후 기존 동작에 대한 보증수표!!!단점개발 시간이 오래 걸

velog.io

 

 

#테스트 코드를 어떻게 만들어야 할까에 관련해 참고할 링크들

 

테스트 코드는 어떻게 만들까

신입으로 입사하신 분들이 테스트 코드를 어떻게 만들어야 하는지를 종종 물어보셔서, 공유도 하고 내 머리 속에 정리도 할 겸 이 글을 써본다. 이 글은 유닛 테스트 코드를 많이 만들어보신 분

cottonblue.tistory.com

 

 

스프링부트 테스트

스프링 부트 Unit Test 및 Integration Test | 테스트코드를 작성하는 일은 정말 중요하다. 하지만, 필자에게 아직도 너무 어려운 일이 바로 테스트 코드를 작성하는 일이다. TDD 를 잘하는 개발자는 필

brunch.co.kr

 

 

Call by value (값에 의한 호출)

 

  • 함수가 호출 될 때,  메모리 공간 안에 함수를 위한 별도의 임시공간이 생기는 데 이를 스택 프레임(Stack Frame)이라고 한다. 해당 공간은 함수가 종료되면 사라진다. (공통점)
  • 이 호출 방식은 함수 호출시 전달되는 인자 값을 복사 하여 함수의 매개변수로 전달 (그 값 주소가 전달되는게 아님)
  • 복사된 매개변수는 함수 안에서 로컬 변수로 사용되며 이 변화는 외부 변수에 영향을 미치지 못한다.
  • 복사하여 처리하기 때문에 기본 값이 보존되어 안전하다. 다만 복사하는 만큼 메모리 사용량이 늘어난다.

 

 

Call by Reference (참조에 의한 호출)

 

  • 함수가 호출 될 때,  메모리 공간 안에 함수를 위한 별도의 임시공간이 생기는 데 이를 스택 프레임(Stack Frame)이라고 한다. 해당 공간은 함수가 종료되면 사라진다. (공통점)
  • 이 호출 방식은 함수 호출시 전달되는 변수의 레퍼런스를 전달하기 때문에 함수 안에서 매개변수 값이 변경되면 전달된 인자의 원본 값도 함께 변경된다. 
  • 복사하지 않고 직접 참조하기 때문에 빠르다. 하지만 원래 값은 보존하지 못한다.  

 

 

 

 

강의노트 12. 함수 호출방식(call-by-value, call-by-reference, call-by-assignment) · 초보몽키의 개발공부로그

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

wayhome25.github.io

 

Java 의 Call by Value, Call by Reference

Overview Java 에서 메서드를 호출 시 파라미터를 전달하는 방법에 대해 알아봅니다. 순서는 다음과 같이 진행합니다. Call by Value, Call by Reference 차이 Java 에서의 파라미터 전달 방법 JVM 메모리에 변

bcp0109.tistory.com

 

 

  • 자바 경우, 함수에 전달되는 인자의 데이터 타입(기본타입형, 참조자료형)에 따라서 메서드도 호출 방식이 달라진다.
    • 기본 자료형 (primitive type) : call by value로 동작
    • 참조 자료형 (reference type) : call by reference로 동작

발표를 준비하면서 이런 부분도 있었는데 아래 글보고 자바는 call by reference가 없다는 게 맞다는 생각이 들었다.

결국 참조 자료형도 주소값을 복사하여 새로운 변수로 사용하는 거라...

 

 

[Java] Java는 Call by reference가 없다

Call by Value와 Call By Reference가 뭘까? 프로그래밍을 하다 보면 꼭 알고 넘어가야 하는 개념이 있습니다. 바로 Call By Value, Reference입니다. 어떤 언어를 공부하든 나오는 개념이기도 합니다. Call by value

deveric.tistory.com

 

'Computer Science > Basic' 카테고리의 다른 글

SOLID 원칙  (0) 2023.02.22
테스트 코드 란?  (0) 2022.12.10
컴퓨터 과학 CS - C 기초  (2) 2022.10.23
콘솔(Console), 터미널(Terminal), 쉘(Shell), 프롬프트(Prompt)  (0) 2022.10.23
컴퓨터 과학 CS - 스크래치  (0) 2022.10.20

 

 

부스트코스 - 모두를 위한 컴퓨터 과학 (CS50 2019) / 2. C언어 / 1) C 기초

https://www.boostcourse.org/cs112/lecture/119004?isDesc=false 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

 

 

C 언어란?

오래되고 전통적인 순수 텍스트 기반의 언어. 1972년 켐 톤슨과 데니스 리치가 유닉스 운영체제를 만들기 위해 고안한 프로그래밍 언어. 켄 톰슨이 BCPL언어를 고쳐 B언어를 개발했고 이를 데니스 리치가 개선하면서 C언어가 탄생하게 되었다.

 

 

https://dojang.io/mod/page/view.php?id=753 

 

C 언어 코딩 도장: 1.4 C 언어란?

C 언어는 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 유닉스 운영체제를 만들기 위해 고안한 프로그래밍 언어입니다. 그런데 A 언어도 아니고 왜 C 언어일까요? 처음에 켄 톰슨은 BCP

dojang.io

 

 

앞서 스크래치를 이용하여 그래픽으로 프로그래밍을 해봤다면 이제는 스크래치 블록을 텍스트로서 이해해보자

 

 

 

  • 짧은 코드 안의 C 언어 규칙
C언어)

#include <stdio.h>

int main(void){ 
    printf("hello, world"); 
}
  #include <stdio.h>   stdio.h 라는 이름의 파일 찾아 printf 함수에 접근할 수 있도록 한다.
 int main(void){ }   시작을 의미
 "hello, world";  hello, world 라고 말해라
 텍스트는 쌍따옴표 " "로 감싸야 하고, 명령어는 세미콜론 ; 으로 마무리해야 한다.

 

 

 C 언어 클라우드 툴을 사용해 프로그램을 작성해보자

https://sandbox.cs50.io/

 

CS50 Sandbox

Temporary programming environments for students and teachers.

sandbox.cs50.io

+ 터미널 정의 ( https://littlezero48.tistory.com/65 )

 

 

위와 같이 코드를 만들어 hello.c로 저장했지만 이 코드들은 컴퓨터가 이해하지 못한다.

따라서 0과 1의 컴퓨터의 언어 즉, 머신코드로 바꾸는 중간단계가 필요함.

 

이런 번역을 수행하는 알고리즘 혹 소프트웨어를 우리는 컴파일러 라고 한다.

 

아래 터미널에서 clang이라는 명령어를 쳐보자

clang은 코드를 컴파일하는 프로그램의 이름으로 clang 뒤에 해석해서 실행하고자 하는 파일을 같이 써서 명령해주면

a.out 이라는 새 파일이 생성된다. 이 파일안에는 hello.c의 코드를 머신코드로 해석한 내용이 들어가 있다.

 

명령어 ./a.out을 쳐보자 

 

이 명령어는 . 와 /와 a.out으로 구성된 명령어로 .는 현재 폴더라는 의미이고 /는 .과 a.out을 구분하는 역할이며 a.out은 파일명으로 현재 폴더의 a.out을 실행하라는 의미이다. 명령어를 실행해보면 hello, world를 말하라는 코드내용을 충실하게 실행하여 터미널 창에 보여준다

하지만 hello, world 뒤에 불필요한 무언가가 보인다.

뒤의 $(달러사인)은 프롬프트로 다음 명령어를 받길 기다리는 표시, 커서이다 

+ 프롬프트 정의 ( https://littlezero48.tistory.com/65 )

 

스크래치와 달리 명령 그자체만 실행하는 불친절한 C는 커서를 다음 줄로 바로 옮겨주는 명령은 받은 적이 없기에 그대로 실행한 것이다.

컴퓨터는  Enter의 의미를 이해하기 어렵다 

따라서 새로운 줄로 바꾸기 위해서는 약속된 특별한 문자의 명령어가 필요한데 바로 \n (백슬래쉬 n) 이다.

 

코드를 고쳤으나 여전히 고쳐지지 않았다. 왜일까?

왜냐하면 우리가 실행한 a.out은 여전히 전 상태의 것 그대로로 우리가 변경한 코드를 다시 컴파일하지 않았기 때문이다. 

다시 컴파일하고 실행해 본다면 바로 적용된 것을 확인할 수 있다 

 

+ 컴파일되는 파일을 다른 이름으로 여러개 저장할 수 있을까?

clang이라는 명령어를 쓸때 꼭 clang 파일, 프로그램이름 만 쓰는 것이 아니다 

명령행 인자(Command line argument)라 하는 것을 추가하여 명령할 수 있다.

 

-o 명령행 인자를 통해 원하는 이름을 설정하여 실행해보자 이와같이 생성된걸 확인 할 수 있다.

 

* ls 명령어 : list. 현재 폴더나 디렉토리에 있는 파일 리스트를 보여주는 명령어로 아래처럼 현재 위치의 파일을 보여준다.

뒤에 붙은 *(애스터리스크) 의미는 실행 가능한 것을 의미한다.

 

* rm 명령어: remove. 파일을 삭제할때 쓰는 명령어. rm에 삭제를 원하는 파일명과 함께 쳐주면 해당 파일을 지울건지 다시한번 묻는다. y (또는 yes)로 확인해주고 다시 ls로 파일을 확인하면 a.out이 사라져 있는 것을 볼 수 있다.

 

* mkdir : 디렉토리 생성

* rmdir : 디렉토리 삭제

 

 

Console이란?

로컬 장치(호스트)에 붙어있어 직접 명령어를 작성할 수 있는 입출력 장치. 물리적 터미널로 볼 수 있다.

 

터미널(Termianl)이란?

로컬 뿐만 아니라 원격 접속이 가능한 콘솔이 터미널이다.

쉘을 실행하기 위한 포장 프로그램으로 윈도우의 cmd, 맥의 terminal 등이 바로 그것이다.

 

쉘,셀 (Shell)이란? 

운영체제의 커널과 사용자 사이의 다리 역할. 명령어 해석기(CLI, Command Line Interpreter)

터미널 안에서 사용자로부터 명령을 받으면 그 명령을 해석하고 프로그램을 실행해 주는 프로그램이다.

 

프롬프트(Prompt)란?

사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시를 의미한다. 보통은 $, %, # 등으로 표시된다.

 

 

 

참고 사이트 :

https://blog.naver.com/asianchairshot/221383363419

 

터미널, 콘솔, 쉘의 차이점

맥 OS 환경에서 개발을 하며 접하게 됐던 터미널. 처음에는 터미널과 쉘이 다른 것이라는 것도 모르며 각...

blog.naver.com

https://make-some-wave.tistory.com/entry/%ED%84%B0%EB%AF%B8%EB%84%90-%EC%85%B8-%EC%BD%98%EC%86%94

 

터미널(Terminal), 셸(Shell), 콘솔(Console)

터미널은 사용자가 컴퓨터와 소통할 수 있도록 중간 역할(interface)을 한다. 윈도우의 'cmd', 맥의 '터미널'이라는 기본 제공 어플리케이션이 그 예다. 터미널을 본격적으로 사용하기 전에 터미널은

make-some-wave.tistory.com

https://badstorage.tistory.com/22

 

[개념 정리] 콘솔vs터미널vs쉘의 차이

콘솔 - 하드웨어 (물리적으로 직접 호스트에 붙어있는 장치) 터미널 - 소프트웨어 (호스트와 통신하는 소프트웨어) 쉘 - 유저와 커널사이를 이어주는 명령어 해석기 콘솔 터미널 - 콘솔을 이용하

badstorage.tistory.com

 

'Computer Science > Basic' 카테고리의 다른 글

Call by Value vs Call by Reference  (0) 2022.12.09
컴퓨터 과학 CS - C 기초  (2) 2022.10.23
컴퓨터 과학 CS - 스크래치  (0) 2022.10.20
컴퓨터 과학 CS - 알고리즘  (0) 2022.10.20
컴퓨터 과학 CS - 정보의 표현  (2) 2022.10.20

+ Recent posts