관리 메뉴

HAMA 블로그

C++ 멤버변수 와 자바 멤버변수 초기화 본문

Java

C++ 멤버변수 와 자바 멤버변수 초기화

[하마] 이승현 (wowlsh93@gmail.com) 2015.09.26 10:22

C++


일반 멤버변수 초기화

- C++ 같은 경우는 멤버변수를 선언과 동시에 초기화를 못시키기때문에 (수정: C++11 부터는 가능) 생성자에서 초기화하며 ,
  생성자 내부 말고 ,생성자 초기화리스트에서 생성하는  효율적인 이디엄이있으며, 

- 자바의 경우 멤버번수를 자동 초기화 해주지만 C/C++ 은 그러지 않기때문에  초기화 과정이 필요함.


class A {
    B b = new B();  <-- 에러이다.
}

- 초기화 리스트를 사용하지 않은 경우.

class A
{
      int x;
      int y;
public:
      Point(int a, int b)
      {
            x = a;
            y = b;
      }
};

 - 초기화 리스트를 사용한 경우.

class A
{
      int x;
      int y;
public:
      Point(int a, int b) : x(a), y(b)
      {
      }
};

이 경우는  int x = a; 와 같이 바로 초기화 된다.


const 멤버변수 

const int a = 20;          //에러 발생 

const int i;                   //에러 발생
    

const 는 바로 초기화 해야한다.  이때 멤버변수라 문제가 생기는데 이때 초기화 리스트를 사용할수 있다.
초기화 리스트에서 초기화 안하면 에러발생한다.

#pragma once
class test
{
const  int n;

public:
test(void);
~test(void);

};

test::test(void):n(0)
{
}

정적 멤버변수 

static  int s;                       // ok

static  int s = 10;                //에러 발생 

const static  int s = 10;       //ok



//////////////////////   test.h /////////////////////

#pragma once
class test
{
const  int n;
static int s;
const static  int cs;

public:
test(void);
~test(void);

};


//////////////////////   test.cpp /////////////////////

#include "test.h"

const int test::cs = 10;       // 이렇게 초기화도 가능하다.
int test::s = 10;

test::test(void):n(0)
{
}




자바
 


- 자바같은경우는 ,멤버변수(인스턴스) 변수를  생성자 뿐만 아니라 선언하면서 바로 대입가능.
- 자바 경우는 멤버변수는 자동 초기화 , 지역변수는 자동초기화 안됨. 
- 자바의 경우 

Example 1:

class A {
    B b = new B();  <-- 정상
}

Example 2:

class A {
    B b;

    A() {
         b = new B();  <-- 정상  
    }
}

Exampe 1 과 Example2 방식의  차이점 정리  (선언하자마자 대입 vs 나중에 대입) 


  • 둘간의 근본적인 차이는 없다. (둘다 컴파일시 생성자에서 초기화 된다)
  • 첫번째 방법이 좀 더 읽기 쉽다.
  • 첫번째 방법으로는 예외처리가 쉽지 않다. ( 선언 아래에 {} 를 추가하여 할수있다)
  • 첫번째 방법은 너무 이른 할당을 하게 한다.
  • 두번째 방법은 생성자가 여러개일때 이곳 저곳에 해야한다. 까먹을수도.. (init() 함수이용)
  • 첫번째 방법으로는  DI 를 '쉽게' 하기 어렵다. 
  • 상황에 맞춰서 쓰도록~


0 Comments
댓글쓰기 폼