안녕하세요. 요즘 안드로이드를 공부하고 있는데 역시 자바에 대한 깊이의 부족함을 느끼곤 합니다.


이번에 제가 만난 코드는 static 초기화였습니다.



이게 어디에 있냐하면 클래스를 정의하는 멤버변수를 선언하는 곳에 있는겁니다. 

그래서 검색을 해보니 static 초기화라고 합니다.


그래서~!!


쇠뿔도 단김에 빼라고 자바의 대표적인 초기화 4가지를

포스팅하겠습니다.


제가 생각하는 자바에서의 초기화는 4가지가 있습니다. 지극히 주관적이고 아는게 4개 뿐입니다;; 더 아시는 분이 계시다면 댓글로 알려주세요

1. 아까도 말씀드린 staic 초기화

2. 인스턴스 초기화

3. 명백한 초기화

4. 생성자 초기화 

가 존재합니다.

일단 개념부터 말씀드린 뒤에 어디에 사용되는지 알려드리면서 각각의 초기화의 순서에 대하여 알아보겠습니다.

-개념-

1. static 초기화란 staic을 선언한뒤 블록 안에다가 값을 넣어 초기화 하는 기법입니다. 사실 초기화 말고도 다른 역활을 할 수 있습니다. 형식은 


2. 인스턴스 초기화란 staic이 없는 상황에서 블록으로 감싸 그안에 로직을 정의하는 것입니다.

3. 명백한 초기화란 다들 아시다시피 저글링이라는 클래스를 정의를 한다면 모든 저글링의 체력은 35이며 공격력과 방여력이 모두 일정합니다. 그렇다면 다른 값이 없으니 명백한 초기화

}

이런 형식이 되는것이죠.

4. 마지막으로 생성자 초기화는 다들 아시다 시피 생성자를 호출할 때 값을 넘겨 값에 따라 다르게 초기화를 하는 기법입니다.

대충 이런 형식입니다.


자 그러면 이들이 무엇이 다르냐 하는 것은 바로 실행 순서 입니다.


언제 실행되느냐 어떤 점이 좋으냐가 바로 중요한 점이죠.


3. 명백한 초기화와 4. 생성자 초기화는 대강 감이 잡히실 겁니다.

명백한 초기화는 초기화를 한번하면 그 객체를 몇번생성하든 초기화를 한번만 하면 된 다는 것이 장점이며

생성자 초기화는 객체에 따라 다른 상태를 주어서 객체마다 다른 특성을 나타내도록 할 수 있습니다.


그렇다면 1. static 초기화와 2. 인스턴스 초기화는 어떤 점이 다를가요? 

바로 실행 순서와 실행되는 조건입니다.

static 초기화 블록은 클래스 변수의 복잡한 초기화에 사용된다. 클래스가 처음 로딩될 때 한번만 수행된다.

인스턴스 초기화 블럭은 인스턴스 변수의 복잡한 초기화에 사용된다. 인스턴스가 생성될때 마다 수행된다. (생성자보다 먼저 수행된다.)


여기에 관해서는 


Powerful Programming 님의 블로그를 참조하였습니다.

http://warmz.tistory.com/50


인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘 사용되지 않는다. 대신 클래스의 모든 생성자에서 공통적으로 수행되어져야 하는 코드가 있는 경우 생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.

Car(){
    System.out.println("Car 인스턴스 생성");
    color="White";
    gearType="Auto";
}
Car(String color, String gearType){
    System.out.println("Car 인스턴스 생성");
    this.color = color;
    this.gearType=gearType;
// 인스턴스 블럭
{  System.out.println("Car인스턴스 생성");  }

Car(){
   color="White";
   gearType="Auto";
}
Car(String Color, String gearType){
   this.color=color;
   this.gearType=gearType;


이처럼 코드의 중복을 제거할 수 있다.


자 그렇다면 파일을 실행 했을 때 무엇이 먼저 실행되는 지를 살펴 보자.



결과 값

1. static { }

2. BlockTest bt = new BlockTest(); 

3. { }

4. 생성자

5. BlockTset bt2 = new BlockTest();

6. { }

7. 생성자



이상으로   static 초기화 / 인스턴스 초기화 / 명백한 초기화 / 생성자 초기화 

에 대한 포스팅을 마치겠다.

Posted by 구레이더

자바스크립트는 다른 언어와는 다른 점중에 하나는 바로 동등연산자인 ==이다.


자바에서 1=="1"의 결과는 무엇이라고 생각하는가? 답은 false이다. 하지만 자바스크립트는 어떨까? 답은 true이다


왜 그러하다고 생각하는가? 이것은 자바스크립트에서는 동등연산자의 경우 느슨한 비교를 하는 것이라고 생각할 수 있다.


우선 화면은 통해서 살펴보겠다.


첫번째는 number형인 숫자와 string 형인 문자열의 비교이다. 정답은?

두번째는 null 형과 undefined형의 비교이다. 정답은?

첫번째의 정답은 true이다.

두번째의 정답은 true이다.

과연 이것이 기존의 생각하는 동등연산자의 결과과 같은가? 아마 다를것이다. 그 이유는 동등연산자(==)의 경우 데이터타입을 확인하지 않기 때문이다. 이것에 관련된 연산의 결과는 아래의 표를 참조하자.



그렇다면 어떻게 연산을 해야할까? 그 답은 일치연산자인 (===)에 있다. 이 연산자는 데이터타입까지 비교를 한 뒤 결과값을 반환하여 준다.


즉 내용물과 데이터 타입이 같아야 한다는 것이다. 아까와 같은 연산을 일치연산자(===)를 통해서 해보자.


아까와 같은 코드이다. 대신 연산자를 일치연산자로 대체하였다. 결과는 어떨까?

 아까는 true였던 값들이 false가 된것을 확인할 수 있다.

즉, 자바스크립트에서는 동등연산자보다 일치연산자를 사용하는 것을 권장한다. 안그렇다면 위의 표를 다 외워서 그때그때 사용해야할 것이다.

 


Posted by 구레이더