Java
C++ 멤버변수 와 자바 멤버변수 초기화
[하마] 이승현 (wowlsh93@gmail.com)
2015. 9. 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;
}
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;
int y;
public:
Point(int a, int b) : x(a), y(b)
{
}
};
이 경우는 int x = a; 와 같이 바로 초기화 된다.
const 멤버변수
const int a = 20; //에러 발생
const int i; //에러 발생
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
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 를 '쉽게' 하기 어렵다.
- 상황에 맞춰서 쓰도록~