하마코

[CS] 개발자 필수 지식 - CI/CD, 오버라이딩/오버로딩, 추상화, 클래스/객체/인스턴스 본문

DEV/Computer Science

[CS] 개발자 필수 지식 - CI/CD, 오버라이딩/오버로딩, 추상화, 클래스/객체/인스턴스

hamaco.dev 2025. 4. 2. 08:00

안녕하세요! 하마코입니다. 😊

 

인프런에서 큰돌님의 CS 강의를 들으며 개발자들에게 필수 지식인 내용들을 정리해보려고 합니다!

아래 내용들은 학교 수업에서도 교수님들이 강조하시고, IT 동아리 면접 볼 때도 자주 나오는 기술 질문이라

더더욱 필수라고 생각하고 있어요!

 

오늘도 열심히 알아보겠습니다. 💪🏻

 

 


CI / CD 란?

개발자들이 코드를 짰다면 그 다음 해야할 일은 지속적으로 코드를 합치고 배포하는 것인데요!

이를 Continuous Integration (CI), Continuous Delivery & Deployment (CD) 라고 합니다.

직역하면 지속적인 통합, 지속적인 전달 & 배포 네요!

 

🧐 CI/CD가 왜 필요해요?

혼자가 아닌 수많은 개발자가 코드를 합치고 배포를 계속해서 수동으로 한다면 아래 상황이 발생할 수 있습니다.

- 테스트 환경과 배포 환경에서의 차이

- dev 서버에 배포했는데, 다른 환경에서는 안 되는 상황 발생

이런 상황을 막기 위해 지속적으로 코드를 합치고 배포할 수 있도록 만들어놔야 합니다.

 

🧐 CI/CD 파이프라인

코드 구축부터 배포까지 일련의 과정CI/CD 파이프라인이라고 하는데요.

파이프라인을 만들었을 때, 코드 배포까지 체계적으로 만드는 점과 테스트가 강제된다는 장점이 있습니다.

CI/CD 파이프라인은 총 3가지의 단계로 구성되어 있습니다.

 

1. Continuous Integration : 코드 빌드와 테스트

  • Code : 코드 작성 (ex. npm run dev)
  • Build : 소스 파일을 실행 가능한 소프트웨어 산출물로 변환하는 과정 (ex. npm run build)
  • Test : mocha 등을 이용하여 단위 테스트, 통합 테스트, 엔드투엔드 테스트 진행 
  • Merge : Git 등을 활용하여 머지, 충돌이 안 나는 것이 제일 좋기에 작은 단위로 이슈를 나누어 개발하는 것이 베스트

2. Continuous Delivery : 레포지토리에 릴리즈

main 브랜치에 올리는 것을 의미합니다.

 

3. Continuous Deployment : Production(실제 서비스) 배포

배포하는 것을 의미합니다. 저는 작은 서비스들만 운영해봐서 배포는 사용자를 위한 배포라고 생각했는데,

실제로 회사에서는 QA엔지니어나 관리자페이지를 위한 배포, 데이터웨어하우스로부터 데이터를 가공한 백엔드 개발자를 위한 배포 등이 포함된다고 해요!

 

파이프라인에 이용되는 툴은 Github Actions, Genkins, Circle CI를 많이 사용한다고 합니다!

 

클래스 vs 객체 vs 인스턴스

  클래스 Class 객체 Object 인스턴스 Instance
정의 객체를 만들어내기 위한 틀
만들어낼 객체의 속성과 메서드의 집합
클래스로부터 만들어지는 실체
클래스로 선언된 변수
객체가 메모리(힙)에 할당이 된 상태
런타임에 구동되는 객체 또는 '객체'
AWS 클라우드의 가상 서버
예시 붕어빵 틀 (팥, 밀가루 속성을 가진 집합)
(팥,밀가루 속성 값은 붕어빵마다 달라짐)
팥 100g / 밀가루 120g 객체
팥 120g / 밀가루 120g 객체
생성된 붕어빵 하나하나
내가 이해한 내용 class Person {} 속성, 메서드 정의 Person a; a = new Person();

 

static, 왜 사용해요?

static은 '정적' 변수를 선언할 때 주로 사용하는데요.

클래스 안에서 중복되는 속성, 메서드를 선언할 때 사용하면 좋습니다.

 

그 이유는, Person 객체마다 talk() 라는 메서드가 있으면 Person이 추가로 생길 때마다 메서드를 만들고 메모리를 할당해야 하는데,

Person 클래스에 talk() 메서드를 static으로 넣어두면 클래스당 하나만 선언돼서 중복을 막고 메모리를 효율적으로 사용할 수 있습니다.

또한, 객체의 특별한 메서드가 아니라 클래스의 메서드라는 명시성도 지니게 됩니다.

 

다만, static 변수를 선언할 경우 바로 메모리에 올라가는데 이 변수를 사용하지 않아도 메모리가 무조건 사용된다는 점이 단점입니다.

 

오버로딩 vs 오버라이딩

오버로딩(Overloading)이름이 같아도 매개변수 개수, 타입, 순서를 다르게 해서 여러개의 함수를 정의할 수 있는 것을 의미합니다.

프로그램의 유연성을 높이고 결과적으로 코드를 깔끔하게 하는 효과가 있으며 같은 클래스 내에서 사용합니다.

class Calculator { // 오버로딩 예시1
	void multiply(int a, int b) {
    	System.out.println(a*b);
    }
    void multiply(int a, int b, int c) {
    	System.out.println(a*b*c);
    }
}
class Person { // 오버로딩 예시2
	void pay(String a, int b) {
    	System.out.println(a+"가"+b+"계산");
    }
    void pay(int a, String b) {
    	System.out.println(b+"가"+a+"계산");
    }
}

 

오버라이딩(Overriding)상위클래스가 갖고 있는 메서드를 하위 클래스가 재정의하는 것을 의미합니다.

상속 관계 클래스에서 사용되며 static, final로 선언한 메서드는 오버라이딩이 불가능합니다.

interface Animal {
	public void bark(); // 인터페이스에는 간단하게만 정의
}
class Dog implements Animal {
	@Override
    public void bark() { // 오버라이딩
    	System.out.println("멍멍");
    }
}

 

추상화란?

추상화란 복잡한 데이터, 구조, 시스템 등으로부터 핵심만을 가려내 덜 자세하게 만드는 것을 의미합니다.

다르게 말하면 세부사항, 절차 등을 감추고 인터페이스 등을 만드는 것으로 복잡도를 낮추는 방법을 말합니다.

 

추상화에는 두 가지 종류가 있는데요. 데이터 추상화와 프로세스 추상화입니다.

데이터 추상화는 데이터들의 공통점을 모으고 차이점은 버리는 과정입니다.

예를 들어, 고양이 / 강아지 / 원숭이 등의 객체들의 공통적인 특징을 묶어 동물 이라는 카테고리로 카테고리화합니다.

abstract class Animal { // "동물"로 추상화
	public abstract void animalSound(); // 모든 동물은 소리를 내니까 소리를 내는 함수로 추상화
}

class Dog extends Animal {
	public void animalSound() {
    	System.out.println("왈왈~");
    }
}

 

프로세스 추상화는 내부 프로세스를 숨기는 것을 말합니다.

예를 들어, MySQL DB가 어떻게 데이터를 저장하는지는 모르지만 INSERT, UPSERT 등의 쿼리로 데이터를 저장할 수 있습니다.

 

컴파일러 언어 vs 인터프리터 언어

컴파일러, 인터프리터는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 과정에 관여하는 프로그램입니다.

 

컴파일러소스 코드 전체를 읽어 한 번에 기계어로 변환합니다. 그리고 변환 과정을 거친 후 생성된 기계어 코드를 실행합니다.

컴파일 과정은 시간이 걸리지만, 변환된 코드는 직접 실행되므로 실행 시간은 빨라요!

  • 예시) C, C++, Go, Rust 

인터프리터소스 코드를 한 줄씩 읽어가며 바로 기계어로 변환하고 실행하는데요.

컴파일 단계가 없어서 초기 시작은 빠르지만, 전체 코드 실행 시간은 컴파일러를 사용할 때보다 느릴 수 있습니다.

  • 예시) Python

여기서 추가로, JIT 컴파일러가 있는데요.

JIT 컴파일러(Just-In-Time)인터프리터와 컴파일러의 중간 형태라고 볼 수 있어요! 특징은 아래와 같습니다.

  • 실행 시점에 프로그램 코드를 분석하여, 어떤 부분이 가주 자주 실행되는지(hot spot)를 파악
  • 실행 전 코드를 분석하지 않음
  • 자주 실행되는 코드(hot spot)만을 선별적으로 프로그램 실행 중에 실시간으로 기계어로 변환됨
  • 컴파일 과정에서 다양한 최적화 기법을 적용
  • 컴파일된 기계어 코드를 실행하고, 프로그램이 계속 실행되면서 새로운 핫스팟이 발견되면 해당 부분도 JIT 컴파일로 최적화
  • 예시) JVM(자바가상머신), V8(node.js 엔진)

 


 

오늘은 개발자의 필수 지식들에 대해 알아봤습니다!

도움이 되셨다면 좋아요, 댓글 남겨주세요!

 

긴 글 읽어주셔서 감사합니다. :)

HAMACO