[Static Vs Dynamic] Series
Static은 정적이며 Dynamic은 동적이라는 의미를 담고 있습니다.
또한 자바에서는 Static이라는 키워드를 자주 볼 수 있습니다.
Ex)
public static void main(String[]args)
public static int num =5;
Static은 변수와 메서드에 하나의 키워드로 사용됩니다.
Static은 컴파일 시간에 동작한다는 개념입니다. 이를 통해 컴파일 시간에 어떤 동작이 일어날지 알 수 있습니다.
반면, Dynamic은 실행 시간에 뭔가가 동작한다는 개념입니다. 이는 프로그램이 실제로 실행될 때 동작이 결정된다는 의미입니다.
이런 개념을 기반으로 쓰임의 차이를 알아보겠습니다.
Static Typing Vs Dynamic Typing
가장 간단한 Static Typing에 대해 알아보겠습니다.
자바는 기본적으로 Static Typing을 사용하는 언어입니다.
Static Typing은 컴파일 시간에 변수의 타입이 결정되는 것입니다. 즉, 사용자는 변수를 선언할 때 타입을 지정해야 합니다.
변수를 선언할떄
num = 5
num;
이런식으로 Type없이 선언은 불가능합니다.
int num;
int num2= 5;
다음과 같은 형식으로 선언하게 되는 것이죠
반대로 Dynamic Typing을 하는 파이썬같은 언어도 존재합니다.
x = 10
y = "Hello"
이런식으로 자바에서는 불가능한 변수선언이 가능합니다.
Static Binding Vs Dynamic Binding
프로그램은 컴파일될떄 변수나 연산에 대해서 Binding하게 됩니다.
Binding 이란 값 또는 연산의 타입 또는 동작이 결정되는 것을 의미합니다.
예를 들어 코드를 작성하면
int x= 5;
x=5 라는 Statement에서 x와 5가 Binding되어 x에 5라는 값을 할당하게 됩니다.
Binding에는 2가지가 존재합니다.
- Static Binding
- Dynamic Binding
여기서 말하는 Binding의 의미는 위에서 기술한 것과 동일합니다.
다른점은 앞에 Static, Dynamic이 붙은 것이죠
Static Binding은 컴파일 시간에 변수나 연산의 타입 또는 동작이 결정됩니다.
Dynamuc Binding은 런타임 시간에 변수나 연산의 타입 또는 동작이 결정됩니다.
자세히 말하면 Static Binding의 경우 컴파일러가 컴파일 과정 중에 어떤 메서드나 변수를 호출하는지 알고있는 것입니다.
다음은 자바의 System.out.println()메서드 입니다.
여러 타입에 대해서 오버로딩돼있는 것을 볼 수 있습니다.
사용자가 작성한 println메서드의 파라미터 타입은 컴파일 시간에 정해지며 어떤 println()을 사용할지 결정합니다.
컴파일 시간에 어떤 메서드가 호출될지 결정됨으로 Static Binding에 속합니다.
이 외에도 Private , Final , Static 메서드 혹은 변수는 Static Binding 하게 됩니다.
이 3가지는 전부 오버라이딩이 불가능하기 때문에 컴파일타임때 Binding 시켜도 문제가 없습니다.
반면에 다음의 코드는 다르게 동작합니다.
public class Main {
public static void main(String[] args) {
Animal animal = new dog();
animal.print();
}
}
class Animal{
public void print() {
System.out.println("It's Animal");
}
}
class dog extends Animal{
public void print() {
System.out.println("It's Dog");
}
}
class rat extends Animal{
public void print() {
System.out.println("It's Rat");
}
}
class Cat extends Animal{
public void print() {
System.out.println("It's Cat");
}
}
이 예시에서 animal객체는 Animal 타입으로 선언됐지만 실제 객체 타입은 Dog입니다.
따라서 animal.print() 가 호출될때 Animal의 print 메서드가 아닌 실제 타입의 print가 호출됩니다
이렇게 호출된 메서드는 실행시점에서 실제 객체의 타입에 따라 결정됩니다.
이를 Dynamic Binding 이라 합니다.
또한 Animal 의 경우 Apparent Type
Dog의 경우 Actual Type이라 부릅니다.
(Static Binding 이 Dynamic Binding의 경우보다 약간 더 빠릅니다.)
Static Checking Vs Dynamic Checking
프로그래밍 언어는 기본적으로 에러에대한 체크를 합니다.
이는 거의 대부분의 언어가 동일하며 언어가 자체적으로 에러체크를 하지 않는 경우에 사용자의 부담이 매우 커질 것 입니다.
에러에대한 체크는 크게 3가지로 나뉩니다.
- Static Checking
- Dynamic Checking
- No Checking
No Checking은 에러체크를 해주지 않는 경우임으로 제외하고 나머지를 집중적으로 보겠습니다.
Static Checking 은 컴파일 타임에 잡히는 버그들을 말합니다. 예를 들어 다음과 같은 코드가 존재할떄
int num = 5;
int num = 4;
중복된 변수명을 사용하고 있기 때문에 프로그램을 돌리기도 전에 사용자에게 오류가 발생했음을 알려줄 것입니다.
또 다른 예시로
char ch = "abcdef";
이와 같은 코드를 작성해도 똑같이 문제가 생김을 바로 알 수 있습니다.
ch 라는 변수는 char 의 타입만 받아야하는데 String 타입을 받아 생기는 오류입니다.
혹은 메서드의 시그니처를 잘못 적은 경우에도 에러가 발생 합니다.
주로 Syntax(문법)자체에 오류가있는 경우에 Static Checking에 걸리게 됩니다.
Dynamic Checking은 Static과는 반대로 런타임시간(프로그램이 실제로 동작하는 시간)에 잡히는 에러들입니다 .
int number = 5;
int number2 = 0;
int result = number / number2;
System.out.println(result);
다음과 같은 코드가 있다면 , 이는 문법적으로는 아무런 문제가 존재하지 않습니다.
하지만 숫자를 0으로 나누게 됨으로써 ArithmeticException이 발생하게 됩니다.
이렇게 실질적으로 프로그램이 구동되어야 알 수 있는 것을 Dynamic Checking이라 합니다.
또 다른 예시로
String str = null;
System.out.println(str.length());
위의코드는 NullPointerException이 발생하게 됩니다.
이또한 Dynamic Checking에 속합니다.
'프로그래밍 기초 > 전산학 기초' 카테고리의 다른 글
[추상클래스 Vs 인터페이스] (0) | 2023.10.22 |
---|---|
클래스 설계와 Abstraction Barrier (0) | 2023.10.22 |
Abstraction(추상화) 기본 개념 - 1편 (0) | 2023.10.20 |
Thread Safety 개념과 방법 [Monitor,Mutex,Semaphore] (2) | 2023.10.15 |
I/O Stream 기본 개념 (0) | 2023.09.29 |