본문 바로가기

개발/프로그래머스 데브코스

프로그래머스 데브코스 50일차 with. TS 웹 풀스택

📚요약

지난 시간에 이어서 기본 원리를 마무리하겠습니다.

 

📖프로그래밍의 기본 원리

📄함수 포인터

기존 포인터 변수가 변수의 주소값을 저장해서 사용했던 것과 같이 함수의 주소를 받아서 사용하는 것이 함수 포인터입니다. 

int Plus(int a, int b) {
  return a+b;
}

int main() {
  int a = 20;
  int b = 10;
  
  int (*fPtr)(int pa, int pb);
  
  fPtr = Plus;
  
  int result = fPtr(a,b);
  
  printf("결과값 : %d", result); // 결과값 : 30
  return 0;
}

위 코드 예시를 보면 함수 포인터를 사용해서 함수를 사용하는 것을 볼 수 있습니다. 함수 포인터를 사용하면 프로그램의 유연한 확장성을 제공해 줄 수 있습니다.

함수 포인터를 잘 보면 일급객체인 JS의 함수와 비슷하게 사용할 수 있다는 것을 알 수 있습니다.

 

📄구조체

하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 데이터 타입을 정의하는 것입니다. 기존에 없던 데이터 타입을 만들어서 데이터를 구분할 수 있는 새로운 기준을 만들어 내는 일입니다. 새로운 기준을 만들어내면 연관된 변수들을 하나의 타입으로 관리하기에 유용합니다.

 

📄공용체

구조체와 유사하게 새로운 데이터 타입을 정의하는 일입니다. 하지만 구조체와의 차이점은 변수들이 메모리 공간을 공유한다는 점이 큰 차이점입니다.

 

📄열거형(enum)

enumeration의 약자로 데이터들을 열거한 집합입니다. 구조체와 공용체와 다른 점은 비슷한 데이터를 묶어서 사용하지만 연속인적인 데이터라는 점에서 차이가 있습니다. 요일을 예로 들 수 있습니다. 또한 열거형 멤버를 정수형 상수로 취급한다는 차이점이 있습니다.

 

📄동적 메모리 할당

직접적으로 코드로 구현해 주어야 하는 건 아니지만, new 연산자를 통해 객체를 생성해 줄 때 사용되는 개념입니다. 메모리 구조에서 나왔던 힙 영역을 런타임 시에 필요한 만큼 사용하게 해주는 방법입니다.

가비지 컬렉터가 있는 경우에는 메모리 해제를 해줄 필요는 없지만, 없는 경우 메모리 누수 문제를 막기 위해서 항상 사용이 끝난 메모리 공간은 해제할 필요가 있습니다.

 

📄객체 지향

객체란 사물을 나타내는 추상적인 개념입니다. 함수 단위로 기능하던 구조적 프로그래밍은 순차적으로 폭포수와 같이 동작해야 했습니다. 그렇기에 중간에 문제가 생기면 처음부터 다시 해야 했기에 설계가 무척이나 중요했습니다. 하지만 개발을 진행하다 보면 수정이 많이 일어날 수밖에 없기 때문에 불편함이 있었습니다. 그래서 객체 단위로 기능해 비교적 유연하게 수정하고 동작할 수 있는 객체 지향 방식이 나오게 되었습니다.

 

📑추상화

추상이란 대상에서 특징만 뽑아낸 것을 의미합니다. 예를 들어 사람, 개, 나무 등이 추상이라고 할 수 있는데 철수, 진돗개, 은행나무보다 좀 더 일반적인 개념을 얘기하는 것입니다.

 

📑캡슐화

알약을 떠올리면 편합니다. 케이스로 내부 가루를 덮어서 실제 가루를 볼 수 없도록 만들어져 있습니다. 이처럼 캡슐화란 외부에서 내부를 볼 수 없게 한다 즉, 은닉한다는 의미입니다. 하지만 외부와 완전히 차단해 버린다면 의미도 같이 사라져 버리게 됩니다. 그렇기에 외부에서 접근할 수 있도록 해주는 것도 중요합니다.

 

📑상속성

예를 들어 나무라는 클래스를 만들었습니다. 그다음으로 은행나무를 만드려고 하는데 나무 클래스에 만들어둔 잎, 기둥, 뿌리, 열매라는 정보를 또 작성하면 클래스를 만들 때마다 중복이 발생하게 됩니다. 중복을 줄일 수 있는 방법이 상속입니다. 완성된 클래스의 정보를 받아서 다른 클래스에서 필드와 메서드를 사용할 수 있게 해주는 것이 상속성입니다.

상속성을 좀 더 크게 본다면 클래스뿐만 아니라 프로젝트에서도 볼 수 있습니다. 큰 프로젝트에서 작은 프로젝트에서 사용했던 내용을 가져와서 기능을 추가해서 사용하는 것도 상속이라고 볼 수 있습니다. 따라서 잘 활용한다면 개발에 필요한 시간과 노력을 줄여줄 수 있습니다.

🍯tip! 부모 클래스 자료형의 변수는 자식 객체를 할당할 수 있습니다. 하지만 반대로 자식 클래스 자료형의 변수는 부모 객체를 할당할 수 없습니다.

 

📑다형성

  • 오버로딩(overloading) : 이름이 같은 함수라도 매개변수의 타입이나 개수가 달라지는 경우를 의미합니다.
  • 오버라이딩(overriding) : 상속을 받았는데 동일한 이름의 함수를 다른 기능으로 사용하고 싶을 때 자식 클래스에서 부모 메서드의 이름을 그대로 사용하고 기능만 바꿔서 사용하는 것을 말합니다.

📄클래스

구조체와 비슷하게 새로운 데이터 타입이지만, 개발자가 새로 정의한 데이터 타입이기 때문에 추상적인 데이터 타입이라고 합니다. 멤버 변수(property, field)와 멤버 함수(method)로 구성됩니다.

만들고자 하는 사물의 특징을 필드와 메서드로 표현하고(= 추상화) 그 결과를 하나의 클래스에 포함시켜 은닉(= 캡슐화)합니다.

class 이름 {
  public 생성자() {}
  접근지정자 자료형 변수명
  접근지정자 반환자료형 함수명() {}
}

 

📑접근 지정자

  • public : 누구나 접근 가능하다.
  • protected : 상속 관계에서 자식 클래스만 접근 가능하다.
  • internal
  • protected internal
  • private : 클래스 내부에서만 접근 가능하다.

클래스는 new 연산자를 사용해 객체를 생성해서 사용합니다.

 

📑생성자(constructor)

변수를 선언하고 초기화하는 것처럼 클래스를 초기화하기 위해서 클래스 내부에 작성되는 메서드가 생성자입니다. 클래스 내부에 만들어 놓으면 클래스 생성 시 자동으로 호출되는 메서드입니다.

 

📄인터페이스

클래스와 비슷하지만 메서드의 목록만 가지고 있고 실제로 구현되어 있지 않은 사용자 정의 타입입니다. 인터페이스를 사용하는 이유는 표준을 정하는 역할을 합니다. 예를 들어 자동차가 있다면 인터페이스로 내비게이션 기능, 운전 기능, 에어컨 기능 등 기능을 명세하는 것입니다. 여러 기능을 명세하기 위해서 언어에 따라 다중 상속이 가능한 경우도 있습니다.

실제 구현은 인터페이스를 상속받은 클래스에서 구현합니다.

접근지정자 interface 이름 {
  접근지정자 반환자료형 함수명()
}
🍯tip! 메모리 관리를 하다 보면 중간중간 사용되지 않는 공간이 발생하는 단편화 현상이 생기는데 이를 해결하기 위한 컴팩션이라는 기능이 있다.

 

📄람다식

람다식은 익명 메서드를 더 간단한 방법으로 나타낸 식입니다. JS에서 사용되는 화살표 함수의 원조 느낌입니다. 

🍯tip! 익명 메서드를 사용하게 되면 코드가 간결해지고, 별도로 함수를 생성하지 않아 오버헤드를 줄일 수 있다. 하지만 그만큼 복잡하고 중요한 내용을 익명 메서드로 사용하지 않는다.

 

다음 시간에 계속...

 

출처 & 참고

이창현 강사님의 강의

일급 함수, 그 정의로 충분할까?, 잇창명, 2024.06.14