10/25

자햐·2024년 10월 23일

교육

목록 보기
43/51

함수 포인터

자바스크립트에서 함수를 변수에 대입하는 경우가 있는데, 이게 함수포인터의 원리를 이용한 것

예시 : int (*fptr)(int pa, int pb) = Plus;

왜 함수 포인터를 사용하나?

  • 메모리의 크기 및 위치가 결정되는 시점은 컴파일 타임 또는 런타임 시점
  • 컴파일 타임 시점에 결정은 정적 바인딩, 런타임 시점의 결정은 동적 바인딩 되었다고 함
  • vscode의 extension들은 플러그인 방식으로 동작
  • 새로운 기능 추가하면 매번 다시 컴파일 해야하는 불편함 존재, 플러그인 사용하면 그럴필요가 없다.
  • 함수포인터는 동적바인딩의 밑단이 되는 개념
  • 함수 포인터로 플러그인 사용이 가능하다는 얘기

구조체

구조체 : 하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 데이터 타입을 정의하는 것

사용하는 이유 : 연관된 변수를 묶어서 하나로 관리하면 데이터 관리에 유용

공용체, enum

공용체도 사용자 정의 자료형이다.
구조체와의 차이점은 메모리 공간을 공유한다는 점이다.

공용체 개념은 타입스크립트에서도 사용됨

열거형

  • 열거형은 enumeration의 약자로 enum(이넘)이라고 읽는다.
  • 데이터들을 열거한 집합이다.
  • 컴파일러는 열거형 멤버들을 정수형 상수로 취급한다.
  • 일반적으로 멤버들은 연속적 성격을 가진다.

예시 :

동적 메모리 할당

메모리 영역

  • 메모리는 크게 코드, 스택, 힙, 데이터 총 4가지 영역으로 구분한다
  • 코드 영역 : 실행할 명령어들이 순서대로 쌓인다. CPU가 이 영역에서 명령어들을 하나씩 가져다 처리한다.
  • 스택 영역 : 지역변수 및 매개변수 저장 (FILO)
  • 힙 영역 : 프로그래머가 직접 할당(컴파일 시가 아닌 실행 시 사용자로부터 할당 메모리를 입력 받음 - 동적 메모리) (FIFO)
  • 데이터 영역 : 전역변수, static 변수 저장(프로그램 종료 시 소멸)

객체 지향 프로그래밍 방식

왜 객체 지향 철학 알아야하나?

  • 타입스크립트와 리액트 기반에서 필요
  • 자바스크립트 - 객체 기반 언어이다

객체 지향이란
-> 객체 : 영문으로 object, '사물'을 나타내는 추상적인 개념
-> 지향 : 영문으로 oriented, '~를 향한다'는 의미

? -> 세상의 모든 사물을 프로그래밍화 시키겠다(?)

구조적 프로그래밍과 객체 지향 프로그래밍 비교

  • 구조적 프로그래밍 방식 - 순차적, 하향식, 폭포수 방식, 기능적인 기본 단위는 함수.
  • 객체 지향 프로그래밍 방식 - 기능 단위 : 객체, 대표적 예시 : 이벤트 기반의 모든 윈도우 프로그램

추상화

  • 관념의 세계

캡슐화

  • 은닉
  • 캡슐화한다는 것은 외부에서 그 내부를 볼 수 없게 한다는 것
  • 마냥 숨기기만 한다면 데이터는 무용지물
  • 외부로부터 데이터를 조작할 인터페이스가 필요

캡슐화 (클래스 : 캡슐의 일종?이라고 볼 수 있다)
<클래스 = 데이터 + 메소드>

클래스의 기본

클래스 : 사용자 정의 데이터타입

  • 데이터와 메소드를 사용자인 내가 새로 정의한 데이터타입이기 때문에 클래스를 추상적인 데이터타입이라고 함
  • 구조체와 유사
  • 멤버 변수 + 멤버 함수로 구성됨

클래스의 구성

  • 사물의 특성을 정리하여 필드와 메소드로 표현하는 과정이 추상화.
  • 추상화된 결과를 하나의 클래스에 포함시키고 스스로 보호하는 것을 캡슐화.

클래스의 선언 형식

  • 클래스 선언 시 class 키워드 쓰고, 그 뒤에 클래스 이름을 붙임
  • 클래스의 요소로는 생성자, 멤버 변수, 메소드 등으로 구성함

접근 지정자
public : 어디서나 접근 가능
protected : 상속 관계에 있을 때 상속 받은 자식 클래스에서 접근 가능. 그 외에는 접근 불가
private : 외부에서 접근 불가, 내 클래스 내부에서만 접근 가능
internal
protected internal

  • 중요한 내용

생성자

생성자의 개념

  • 모든 변수는 선언이 되면 값이 초기화되어야 함
  • 객체도 본질적으로 변수이므로 선언되면 초기화해야 한다.
  • 객체 생성 시 초기화 전용 메소드를 제공하는데 바로 생성자(constructor)이다
  • 객체 생성 시 자동으로 호출되는 메소드

상속성

  • 이미 완성된 클래스를 다른 클래스에 상속할 수 있다
  • 부모 클래스로부터 상속을 받을 때 클래스 이름 끝에 콜론(:), 자바, 자바스크립트의 경우 extends를 붙인 후 부모클래스의 이름을 뒤에 작성함

  • 중복 피하기 용도

오버로딩

다형성

  • 함수의 이름은 같더라도 전달인자의 타입이나 개수에 따라 구분된다.

  • 객체지향에서는 대표적으로 오버로딩(overloading)과 오버라이딩(overriding) 기법이 있다.

  • 오버로딩(overloading)

  1. 사전적 의미는 '과적하다' 라는 의미
  2. 겉모습은 똑같지만 내용이 다른 경우
  3. 이름이 같은 함수일지라도 전달인자 타입이나 개수가 다른 경우

오버라이딩

  • 오버라이딩(overriding)
  1. 무언가에 올라타서 기존의 것을 덮어 버린다는 개념
  2. 상속의 개념이 기반이 됨

예시 : 부모클래스에서 상속받은 메서드를 자식클래스에서 수정하는 경우
부모클래스에서 virtual이라고 붙여줌

<중요 예시 - dog = new Jindo(); <- 이 부분>

인터페이스

인터페이스란

  • 인터페이스란 메소드의 목록만을 가지고 있는 명세(specification), 사용자 정의 타입이다.
  • 메소드의 목록만 선언하고 구현은 하지 않는다.
  • 독립적으로 사용 불가, 자식클래스에서 상속받아서 오버라이딩 해줘야함

인터페이스를 사용하는 이유

  • 인터페이스는 본체가 정의되지 않는 추상메소드만 갖는다.
  • 인터페이스의 목적은 기존의 기능을 추가하거나 수정의 개념보다는 동일한 개념의 기능을 새롭게 구현하는 기능이다.
  • 공동작업 시 표준을 정하는 역할

클래스를 상속하는 이유 : 기능의 확장에 목적을 둔다
인터페이스를 상속하는 이유 : 기능의 목록을 만들고 나열하여 구상하는 것에 목적을 둔다.

플랫폼 기반의 객체 지향 언어는 가비지 컬렉터가 메모리를 자동 관리한다.

  • 단편화 현상, 컴팩션

람다

람다를 통한 화살표 함수의 이해

익명 메소드

  • 메소드를 미리 정의하지 않고 사용할 때 정의한다.
  • 익명 메소드를 사용하면 코드가 간결해진다.
  • 익명 메소드는 별도의 메소드를 만들지 않으므로 코딩 오버헤드를 줄일 수 있다.
  • 익명 메소드는 내용 자체가 복잡하면 안된다.
  • 익명 메소드는 람다식에서 사용된다.

콜백함수에서 특정 이벤트가 발생할 시 사용되는 메서드이기 때문에 굳이 이름을 쓸 필요가 없다는 것.

람다식이란? (문법임)

  • 기존 익명 메소드를 더욱 간결하게 만든다.
  • 코드를 짧고 간결하게 표현하는 것이 목적!

콜백함수 기반 -> 함수포인터

람다식 표현

  • 델리게이트 본체를 람다식으로 표현함
  • 델리게이트와 인수의 개수 및 타입은 일치해야 함

profile
산업과 예술의 만남에 있는 예비 개발자..

0개의 댓글