바인딩
변수, 함수, 메서드 등 프로그램의 요소들을 특정 값이나 메모리 위치와 연결하여 더이상 변경할 수 없는 상태가 되는 것
동적 바인딩(Dynamic binding)
- 실행 이후에 값이 확정
- 런타임에 호출될 함수가 결정
- 함수가 가상함수이거나 다형성에서 사용
- OOP에서 부모 클래스를 자식 클래스 메서드를 통해 호출할때 동적바인딩 발생
런타임
프로그램이 실행되는 시점으로 컴파일 된 분석과 변환된 코드가 실행 되는 상태
- 사용자에 의해 프로그램이 실행되거나 구동될때 발생
- 컴파일 시점에 잡히지 않는 런타임 오류가 발생 가능
메모리 관리, 입출력, 네트워크 통신 등의 오류는 실행 중에 확인 가능
- 문법이 잘못됐다는 오류가 아닌 실행하니 문제가 있다를 확인 하는 것
배열 길이가 3이지만 4번쨰 인덱스를 찾는다면 컴파일에서는 오류 없지만 런타임에서는 오류
ex) 플러터에 에셋에서 이미지를 가져올때 이미지 이름이 달라 보여지지 못하고 오류 화면이 보이는것이 런타임 오류(다트는 정적타입 언어지만 객체지향 언어로 런타임 시점에서 객체의 타입에 따라 동적바인딩을 지원)
정적 바인딩(Static binding)
- 실행 이전에 값이 확정
- 컴파일 타임에 변수나 함수가 고정적으로 특정 값이나 메모리 위치에 연결 되는 방식
- 프로그램이 실행되기 전에 미리 결정되기에 컴파일러가 직접 처리
- 함수는 기본적으로 정적 바인딩
- 빠르고 효율적이지만 유연성이 떨어짐
- 실행중에는 바인딩 된 값이나 메모리를 변경 할 수 없음
컴파일 타임(Compile Time)
코드가 기계어로 변환되는 시점으로
코드가 실행되는 것이 아닌 코드 분석과 기계어로 변환하는 단계
- 코드가 작성된 후 실행이 되기 전 빌드(compile) 과정에서 컴파일러가 소스를 분석하고 변환
- 구문 오류나 타입 오류같은 에러를 탐지
- 컴파일러는 코드를 한번 다 번역하고 기계어로 변환해 프로그램이 실행되도록 준비
- 컴파일러가 코드 최적화를 수행해 성능 향상
데이터 바인딩(Data Binding)
- UI 개발에 많이 사용되며 UI요소와 데이터 모델을 자동으로 연결
- 데이터가 변경되면 UI도 변경되는 구조
- 스위프트에서 양방향 바인딩 되거나 리액트에서 단방향 바인딩을 생각하면 됨
- 코드의 유지보수에 용이하지만 복잡한 로직을 쓰면 디버깅이 어려움
이벤트 바인딩
- UI에 이벤트와 이벤트 헨들러 함수를 연결하는 작업
ex) onClick 이벤트에 실행될 이벤트 함수를 넣는 것
언어의 타입
동적 타입
- 자바스크립트, 파이썬, 루비 등이 동적타입언어
- 런타임에 타입이 결정되어 변수를 선언할 때 타입을 명시하지 않음
- 자바스크립트가 예시로 변수에 할당된 값에 따라 변수 타입이 결정됨
- 변수의 타입이 유연하게 변경
- 유연하다는 장점이 있지만 런타임에만 오류가 확인이 가능하여 디버깅어려움
let x = "aaa"; // 'x'는 문자 타입으로 결정
x = 111 ; // 'x'는 숫자 타입으로 변경
console.log(x); // 출력: 333
정적 타입
- 변수가 선언될 때 타입이 미리 결정되는 언어
- 타입이 컴파일 시점에 결정되기에 타입 안정성을 위해 정적타입 시스템을 사용
- 자바도 정적 타입 언어지만 정적 바인딩이 아닌 동적 바인딩을 사용하는 언어다
- 타입스크립트
스위프트도 기본 정적 언어인데 데이터 타입 추론 기능에 의해 컴파일러가 변수와 상수타입을 결정하기에 동적 바인딩 언어처럼 보일수 있다
객체지향 언어들이 정적 타입이지만 동적 바인딩을 사용하여 다형성을 구현하는 언어 경우들이 있다,