1. 문 기를 담 명 드 ¶
- 다 는 die메드 다. 그런데. 되고 뻔뻔럽게 메드를 . 떻게 된것까? 봅다.
~cpp #include <iostream> using namespace std; class Foo{ public: int id; Foo(){ static idSequance = 0; id = idSequance++; cout << "Create! id = " << id << endl; } void die(){ cout << "I suicide. Id is " << id << endl; delete this; // } void sayMyId(){ cout << "My Id is no " << id << endl; } void sayHello(){ cout << "say Hello" << endl; } }; int main(int argc, char** argv) { cout << endl << ":::::: Case 1 - 동당 " << endl; Foo* foo1 = new Foo();// Create! 를 력다. foo1->sayHello(); // Hello 력 foo1->sayMyId(); // id 력 foo1->die(); // 객 foo1->sayHello(); // 동 가능 foo1->sayMyId(); // 동 가능 // id cout << endl << ":::::: Case 2 - id " << endl; Foo* foo2 = new Foo();// Create! 를 력다. foo2->sayHello(); // Hello World 력 foo2->sayMyId(); // id 력 foo2->die(); foo2->sayHello(); foo2->sayMyId(); cout << endl << ":::::: Case 3 - NULL로 고 메드 기 " << endl; Foo* foo3 = NULL; // 명보. foo3->sayHello(); // Hello 를 력다. //foo3->sayMyId(); // debug, release 모두 동 다. //foo3->die(); // debug, release 모두 동 다. cout << endl << ":::::: Case3 - 변로 " << endl; Foo foo4; foo4.sayHello(); // Hello World 력 foo4.sayMyId(); // id 력 foo4.die(); // debug mode assertion error foo4.sayHello(); // release 동 가능 foo4.sayMyId(); // release 동 가능 cout << endl; return 0; }결과는 다과 같 력됩다. 교보면, 각 보고 가 는다면 명 보.
~cpp :::::: Case 1 - 동당 Create! id = 0 say Hello My Id is no 0 I suicide. Id is 0 say Hello My Id is no 3604872 :::::: Case 2 - id Create! id = 1 say Hello My Id is no 1 I suicide. Id is 1 say Hello My Id is no 3604872 :::::: Case 3 - NULL로 고 메드 기 say Hello :::::: Case3 - 변로 Create! id = 2 say Hello My Id is no 2 I suicide. Id is 2 say Hello My Id is no 2 Press any key to continue
2.1. Case1 - 동당 ¶
~cpp Foo* foo1 = new Foo(); // Create! 를 력다. foo1->sayHello(); // Hello World 력 foo1->sayMyId(); // id 력 foo1->die(); // 다. foo1->sayHello(); // 된다? foo1->sayMyId(); // 것..--;
2.2. Case2 - NULL로 고 메드 기 ¶
~cpp Foo* foo2 = NULL; // 명보. foo2->sayHello(); // Hello 를 력다.(--;) foo2->sayMyId(); // debug, release 모두 동 다. foo2->die(); // debug, release 모두 동 다.
3. 명 ¶
"단 명=드"를 면 명다.
C++ 목는 기 C 능 면 OOP를 는 것다. 로 OOP 고 납기 려 드를 다. OOP를 C 구 됩다.
게 보는 드를 기 는 C++ 론 배경 다.
- 로, C++ 래 봅다.
- 둘로, 귀된 멤 들 는 것 각 보겠다.
- 막로, 문기 대 봅다.
3.1. C++ 래 과 다. ¶
러가 되다고 가 봅다. 리가 class를 고 려면 로그램 class Data 들 는 "class " 보를 담 놓 곳 다.
~cpp class Foo{ public: int id; // <- 부 보 다. };C++ Strong typed language 므로 모든 되고, 되는 것 검 다. 만 는 다과 같 변 국다.
~cpp Foo foo4;new 드로 당는 runtime class instance 를 낼 다. 를 로그램 는 id가 int 라는 보를 담는 class "class " 보를 담는 곳 다.
기까가, class struct 드가 는 동 다. 그리고, class 는 몇가 더 각 는데, 그 나가 foo 를 떠 member 를 는가 다.
그러나, 러 리는 보를 변든, new 로 당든 type 보고 고, 를 는 부 다. 그리고 는데 과 두 명다.
그 class instance vpt, 관 대 pointer 보가 더 들 가 다. 그러나 기는 각 다. 둘로 갑다
3.2. instance 귀된 멤 들 봅다. ¶
리는 러 다. 러 리는 member 부 드를 가리는 로 모두 교다. 그리고 로 돌다.
C++ 과, instance 귀된 멤 들 가리 다. 과 멤 드는 모두 동 방법로 되고, 모두 동 메 를 다.
러 라면, 가 문 깁다.
동 라면 각각 instance 떻게 근는가?
동 라면 각각 instance 떻게 근는가?
무 리냐 면,
그러나
~cpp class Foo{ public: int id; void sayMyId(){ cout << "My Id is no " << id << endl; } };라는 는 각 instance id 라는 근다.
그러나
~cpp Foo::sayMyId()
같 무런 는 드가 된다면, id 라는 근 다. C++ 는 런 를 class 귀된 들 로 당 class 를 묵로 결고 다. ,
~cpp Foo:sayMyId()라는 드가 될때 러가
~cpp Foo:sayMyId(Foo* x)라는 로 고, 록 만듭다. 그리고, 다면
~cpp Foo*
부 ~cpp foo1->sayMyId(foo1);로 를 드를 다.
C++ 러 다 당 로 C 면 OOP를 구다.
. 러 class내 static 멤 를 고 instance 때 instance 멤 변 근 못는 가 됩다. static 로 면 묵로 pointer 를 고 를 다.
런 배경 바로 다로 갑다.3.3. 문기 대 봅다. ¶
다과 같 드를 면,
~cpp Foo* foo1 = new Foo(); // Create! 를 력다. foo1->sayHello(); // Hello 력 foo1->sayMyId(); // id 력 foo1->die(); // 객 foo1->sayHello(); // 동 가능 foo1->sayMyId(); // 동 가능
렇게 나다.( 랫)
렇게 나다. (C++ 빼고) 문 되는 부, 반 두가
~cpp Create! id = 0 say Hello My Id is no 0 I suicide. Id is 0 say Hello // 객 (delete this) 드 My Id is no 3604872 // 객 (delete this) 드
~cpp sayHello() sayMyId()
겁다. 둘 명 member 를 는 메 다면 ~cpp sayHello() -> sayHello(Foo*) sayMyId() -> sayMyId(Foo*)로 된다는 것 겁다. 만 두 는 다른 다.
sayHello()는 instance variable 근 는다는 것고,
~cpp sayMyId()
는 근다는 .따라, 메모리를 (?) 리고 난 당 instance 부 보리 id가 다과 같 게 나.
그리고
~cpp say Hello 객 (delete this) 드 My Id is no 3604872 객 (delete this) 드instance 되던 메모리는, 당 process 가 메모리로 돌가, 근 로 되 다. 부 delete this 당 instance 값 떻게 ""느냐 따라, 랫 로 다르게 나다.
그리고
~cpp delete x라는 드는 x 값 변 다. 변 다. 는 call by value 로 x 값 NULL로 변경봤, 는 드가 경가 기 때문, 변 다.
만 구 러가, 메모리를 system로 반고 근 로 다면, 다 강 근 access 러가 나겠. 러 구 랫 겁다.
foo2~3 러 배경 결과를 는 보 명다.
그 foo2는 C++ 볼 는 긴 . (foo3 기만)
~cpp Foo* foo2 = NULL; // 명보. foo2->sayHello(); // Hello 를 력다.드 결과는
~cpp say Hello과 같 동다. 가
~cpp Foo::sayHello(foo2) -> Foo::sayHello(NULL)된것고, sayHello 내는 pointer 값 NULL 근 므로 무런 러가 발 다.
OOP 고로 instance가 므로 가능 드만, 됩다. C++ 당 instance 무를 검 다. 검 겠. NULL 0 라는 pointer 값 당까.
5. 덧붙 Java 드를 봅다. ¶
instance 무를 검는 Java 드를 봅다.
( null 값 검고, instance pool instance를 pointer를 근는 것로 기다. )
~cpp // Main.java file class Foo{ public int a; void sayHello(){ System.out.println("Hello"); } } public class Main { public static void main(String[] args) { Foo foo= null; foo.sayHello(); } }를 면, 다과 같 exception 력다. 는 Java Language Specification 2nd (3rd가 나군.) jvm specification 고.
( null 값 검고, instance pool instance를 pointer를 근는 것로 기다. )
~cpp java.lang.NullPointerException at Main.main(Main.java:19) Exception in thread "main"
C++는 NULL 드로 고, 0 라고 되 기 때문 검가 가능다.그러나 vm 들 그래 모두 null 당는 드가 고 검가 가능다.