반응형

Java) Static Binding 과 Dynamic Binding


메소드 바디에 메소드 호출을 연결하는 것을 " 바인딩 " 이라고 합니다.

두 가지 타입이 바인딩이 있는데요.


1) static binding   (정적 바인딩)

2) dynamic binding (동적 바인딩)


일단 타입을 이해해봅시다.


1) 변수 타입

int data = 30;

각 각의 변수들은 타입을 가지고있고 primitive 타입이거나 아닐 수 있습니다. 

정수 타입의 데이터 변수가 있고 30이란 정수값을 가지고있네요.



2) 참조 타입 

class Dog{  

 public static void main(String args[]){  

  Dog d1;//Here d1 is a type of Dog  

 }  

 



d1 객체는 Dog타입을 가지고있습니다.


3) 객체 타입

class Animal{}  


class Dog extends Animal 

 public static void main(String args[]){  

  Dog d1=new Dog();  

  

}  

Object는 특이한 자바 클래스의 인스턴스입니다.

하지만 Object 또한 부모 인스턴스이기도하죠. 

d1은 Dog클래스의 인스턴스입니다만, Animal의 인스턴스이기도하지요.


이제 스태틱 바인딩을 알아봅시다.


객체의 타입이 컴파일러에 의해서 컴파일시 정해지는것을 스태틱 바인딩이라고합니다.

만약 private, final, static method가 클래스 내부에 있다면 스태틱 바인딩입니다.




//스태틱바인딩의 예입니다.


2 ) Dynamic binding


 class Animal{  

 void eat(){System.out.println("animal is eating...");}  

 

  

class Dog extends Animal{  

 void eat(){System.out.println("dog is eating...");}  

  

 public static void main(String args[]){  

  Animal a=new Dog();  

  a.eat();  

 }  

}  

Run-time시에 객체의 타입이 결정된다면동적 바인딩입니다. 

객체타입은 컴파일러에 의해 결정될  없습니다.

Dog 인스턴스의 또한 Animal 인스턴스이기 때문이죠.

그래서 컴파일러는 기본유형만 알고 제대로된 a 타입을 모릅니다.



반응형
by 발전소장 에르 :) 2017. 8. 11. 00:55
반응형

자바 Final Keyword 1편 보기. http://loganstory.com/229 

정리해보자면,

final 키워드는 변수,메소드,클래스에 사용될 수 있는데,

final은 오버로드와 오버라이드 그리고 상속이 제한된다는 점

하지만 순수호출은 가능하다는 점!

기억하고 계시나요?

그렇다면 맨 처음에 설명드렸던 초기화되지않은 파이널 변수에 대해서 알아보도록하죠.

Q) Blank or Uninitialized final variable이 무엇인가요?

A)선언되었을떄 초기화되지않은 파이널 변수를 Blank final variable이라고합니다.

만약, 여러분이 객체가 생성될 때 값이 초기화되고 바뀌지않는 변수를 만들고자 할 때 Blank final variable을 사용하시게 될텐데요.

(직원 고유번호, PIN번호 같은 곳에 쓰일 수 있다고합니다)

Blank final variable은 생성자 안에서만 초기화될수 있습니다.

이해를 도울 예제를 살펴보시죠.

blank final variable( 빈 파이널 변수)는 이렇게 생겼습니다.

          1. class Student{  
          2. int id;  
          3. String name;  
          4. final String PAN_CARD_NUMBER;  
          5. ...  
          6. }  

 

그럼 빈 파이널 변수를 초기화시킬 수 있을까요?

 생성자를 통해서만 가능합니다.

package fianl_keyword;


class Bike10{  

  final int speedlimit;//blank final variable  

   

  Bike10(){  

  speedlimit=70;  

  System.out.println(speedlimit);  

  }  

 

  public static void main(String args[]){  

    new Bike10();  

}  

}  

자. 살펴봅시다!

필드에 blank final variable을 선언해줬고,

생성자에서 speedlimit의 값을 70으로 초기화했습니다.

그리곤 메인메소드에서 찍어봤는데요.

70이 뙇!

그렇단 말은 생성자의 변수 초기화구문이 적용됬다는게 증명이 된거겠죠.

그리고 final 키워드앞에 static이 올수도있습니다.

그렇다면 static blank final variable을 생성할수도있다는 말이되지요.

허나, static block에서만 초기화가 가능합니다.

예제를 살펴보시죠.

package fianl_keyword;

class A{  

  static final int data;//static blank final variable  

  static{ data=50;}  

  public static void main(String args[]){  

    System.out.println(A.data);  

 }  

}

result = 50  

필드에 static blank final variable 생성해주고,

static{} 블럭안에서 해당 필드를 초기화해줍니다.

그리고 메인메소드에서 접근자 .(dot)을 통해서 호출을 해보면

50이라는 결과값이 나옵니다.

Q)  final 매개변수는 뭐에요..?

A) 쉽습니다. 메소드의 매개변수에 final키워드를 사용해주시면됩니다.

그럼 한번 입력받은 매개변수는 변경할 수 없는 상수가 되버리죠.


cube 메소드의 매게변수에 final int n 을 줍니다. 그리고 

연산식으로 n 변수를 연산해봅시다.


그리고 메인메소드에서 객체를 생성하고 매개변수로 5를 주면?


컴파일러 에러가 두둥!

에러를 해석해봅시다.package fianl_keyword;


class Bike11{  

  int cube(final int n){  

  n=n+2;//can't be changed as n is final  

  n= n*n;  

  }  

  public static void main(String args[]){  

    Bike11 b=new Bike11();  

    b.cube(5);  

}  

}  


Exception in thread "main" java.lang.Error: Unresolved compilation problems: 

This method must return a result of type int

The final local variable n cannot be assigned. It must be blank and not using a compound assignment

The final local variable n cannot be assigned. It must be blank and not using a compound assignment


at fianl_keyword.Bike11.cube(Bike11.java:4)

at fianl_keyword.Bike11.main(Bike11.java:10)



두둥... 에러내용을 해석해보자면 이렇습니다

"야, 사용자야 생각을 해보자.. 니가 매개변수에 final 줬지?

니가 값 바뀌는게 싫어서 매개변수를 상수로 정의했으면서 왜

그 상수로 연산식을 포함한 메소드를 실행시키는건데? 

돌아가 안되" 라고 하네요..

그럼 생성자에 final 키워드를 사용할 수 있을까요?

생성자는 상속되지않기때문에 final키워드를 사용할 수 없습니다..!!

모르시는 부분이나 애매한 부분은 댓글남겨주시면 감사하겠습니다 :)





반응형
by 발전소장 에르 :) 2017. 8. 8. 01:08
반응형

Final Keyword In Java!!


fianl은 유저에게 엄격할 뿐더러 오직  변수, 메소드,  클래스총 3곳에 사용될 수 있습니다!

final 키워드는 변수와 함께 사용될 수 있고, 

값이 없는 빈 변수 혹은 초기화되지않은 빈 파이널 변수에 사용될 수 있습니다.

파이널 변수는 생성자에서만 초기화시킬 수 있고, 

빈 파이널 변수(Blank Final Variable)은 static이 될 수 있고 static 블럭안에서 초기화 될 수 있습니다.

감이 안오신다면 더 자세히 알아보도록할까요.

1) FINAL VARIABLE 

한번 선언하면 값을 바꿀 수 없습니다.

SWIFT에서 let의 역할을 하고있는것같네요.

예제를 한번 살펴봅시다.

Bike9클래스를 만든 후 필드에 speedlimit란 정수타입 변수에게 90의 초기값과 final키워드를 붙여줍니다.

그리고 run() 메소드에 위에서 초기화했던 speedlimit값을 재초기화하는 구문을 넣습니다.

Bike9클래스안에 main메소드를 넣고 인스턴스를 생성하고 매소드를 실행해봅시다.

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

The final field Bike9.speedlimit cannot be assigned


at fianl_keyword.Bike9.run(Bike9.java:7)

at fianl_keyword.Bike9.main(Bike9.java:12)


2번째 줄 보이시나요?  BIke9.speedlimit는 재정의될 수 없습니다.!

네, 맞아요 final이 걸리면 게다가 초기화가 된 채로 선언되면 바꿀수없어요.. 생성자도 아닌 메소드에선 더더욱..

2) Final Method

Bike클래스를 정의하고 final 메소드를 선언한다음에 

메인 메소드에서 자식 객체를 생성하여 

자식객체가 부모객체를 오버라이드한 메소드를 실행시켜볼 예정입니다.


Bike클래스를 상속받고 부모클래스의 메소드를 오버라이드했습니다.

그리고 실행해보지요.

두둥..


Exception in thread "main" java.lang.VerifyError: class fianl_keyword.Honda overrides final method run.()V





에러 덩어리네요.

중요한건 맨 위 2줄이라 나머지는 잘랐습니다만,

2번쨰 줄이 가장 중요하네요.

  final 메소드 run()을 오버라이드할 수 없습니다.!

슬슬 이해가 되시나요?

3) final class 

final키워드를 붙힌 Bike클래스를 만들고

final클래스인 Bike를 상속합니다(에러)


Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Honda cannot be resolved to a type


at fianl_keyword.Bike.main


final클래스를 상속하려고하니 

자바 컴파일러가 " 야, 이거 final이야 상속못해. 돌아가."

라고 합니다. 

Q)그럼, 메소드를 오버라이드하지 못해도 상속받는건 가능한가요?

A)네 가능합니다.!



fianl메소드를 오버라이드하는 건 불가능하지만, 순수 호출은 가능하다는거! 중요하겠지요?

정리해보자면,

final 키워드는 변수,메소드,클래스에 사용될 수 있는데,

final은 오버로드와 오버라이드 그리고 상속이 제한된다는 점

하지만 순수호출은 가능하다는 점!

2편에서 봐요~:)



반응형
by 발전소장 에르 :) 2017. 8. 7. 01:47
| 1 |