본문 바로가기

JAVA/DAY 11 _ 23.08.31

Instance

public class P1_instance {

public static void main(String[] args) {	// main이 시작점, 수행할 수 있는 유일한 공간
                                            // class들은 다 다른 폴더에 저장돼있고, 나중에 import해와서 main에서 출력됨


    // 1. 메모리를 생각해보자
    // Stack -> 지역변수가 저장되는 곳
    // heap -> 인스턴스(하늘색)가 저장되는 곳



    // 인스턴스 생성 문법 : new Class명();
    // 1) 클래스 정의 형태로 heap메모리를 생성, 가르키는 주소값이 없으면 생성과 동시에 소멸된다.
    new StudentInfo();			// 	2) studentInfo라는 새로운 인스턴스를 생성하겠다
                                        // 	   StudentInfo 클래스의 인스턴스 a1과 a2를 생성하면 밑에것처럼!
    StudentInfo a1 = new StudentInfo();	//	3) a1이라는 참조변수가 new StudentInfo의 주소값을 받는다
    							// (a1의 ... int같은게 뭐엿지)
    StudentInfo a2 = new StudentInfo();	
    new StudentInfo();					
    // 4) 보통은 3번처럼 참조변수와 같이 쓰지, 그냥 인스턴스 생성만은 안한다
    StudentInfo a5;					// 5) 이건그냥 참조변수를 생성하는 문법임!!!
    a5 = new StudentInfo();
    a5.score = 98;

    System.out.println(a5);				// StudentInfo@2a556333 -> 그냥 a5가 가르키는 주소값을 출력
    System.out.println(a5.score);			// 98 -> a5가 . 접근한 score를 출력




    // 1-1. 메모리를 생각해보자2

    // stack : a1, a2
    // heap : 0xFF11, 0xCC11	--> 참조변수가 사라지면 사라지니까..

    a1.age = 50;
    a2.score = 99;
    // . : 접근 연산자임 (heap메모리에 접근해서 정보를 저장하고 싶을때)
    // 지역변수 a1의 0xFF11에 접근해서 age = 50을 넣겠다
    // 지역변수 a2의 0xCC11에 접근해서 score = 99를 넣겠다




    // 1-2. 예시

    a1.name = "한조";
    a1.age = 40;
    a1.score = 80;
    System.out.println(a1.name);		// 한조


    a2.name = "트레";
    a2.age = 20;
    a2.score = 80;
    System.out.println(a2.age);			// 20



    // Q.
    a2 = a1;					// a2가 a1의 주소값을 받아, a1과 같은 메모리를 가지게 됨

    a1.name = "안녕";
    System.out.println(a2.name);		// 안녕

    System.out.println(a2.age);			// 40




    // Test다시

    TestA testA = new TestA();
    // testA라는 이름을가진 참조변수(TestA)를 생성, new TestA를 생성하겠다.

    testA.v1 = 10;			// testA의 v1 = 10
    // testA.v2 = 20;			// --> int를 TestB에 넣을 수 없다고 error (type mismatch)
    testA.v2.v1 = 30;			
    // testB의 v1 = 30 --> testA에서 v2에 접근, v2는 참조변수 testB를 가지고 있으므로 v1을 지정할 수 있다

    // System.out.println(testA.v2.v1);	// NullPointerException -> testA의 v2는 지금 null값이니까

    testA.v2.v1 = 20;

    System.out.println(testA.v2.v1 + "이제는 뜨겠지"); 	// 20

    // 2) class TestA를 새로 만들었어
    // int v1 = 10; 랑 TestB v2 = new TestB(); 를 안에다 넣었고
    // 이제는 TestB가 heap메모리에 주소값을 만들었어 (--> 만들기전에는 null이었는데, 이제는 0이 들어가겠찌)
    // testA에서 v2에 접근, v2는 또 새로운..... 다시★★★★★


}

}

 

// ♥ 클래스 : 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶어 놓은 것
// -> 클래스는 객체의 설계도이며, 클래스로부터 생성된 객체는 해당 클래스에 정의된 속성과 메서드를 가짐
// -> 지금은 P1이라는 이름으로 class가 생성됨

// 클래스 정의문법 : class 클래스명{코드코드코코코코코드..} (ex // class minji{커피를 마셔라코드})
// 클래스명 명명법 : 파스칼 케이스 --> 첫글자를 대문자로 시작, 명사로 짓기
// ※ 주의사항 : 클래스 정의만으로는 아무것도 안된다 (ㄹㅇ 정의만 한거임)

 

class StudentInfo{

	
	// 1. 속성 (= 인스턴스 변수 or 멤버 변수)
	// -> 속성 정의를 잘해줘야한다!★★★
	
	String name; 				//  내가 원래쓰던 노란색 변수 : 지역변수 (stack에 쌓인다)
	int age;				// --> 하늘색 : 인스턴스 변수
	int score;
	
	String name2 = "민지"; 		// 인스턴스 생성과 동시에 속성을 정의해줄수 있지만, 보통이렇게 안쓴다	
	
	
	// public static void main(String[] args)
    	// --> 이것도 하나의 메서드임. 여기 안에서 선언되는 변수는 지역변수임!!!
	// class안에 있는 변수는 어떠한 정의, 이러한 형태의 모양을 만들겠다... 느낌?
	// System.out.println(); --> 이런것도 시행 X
	
	//  ※ 예시
	//	class Car {
	//	    String brand;
	//	    String model;
	//	    int year;		--> Car의 정보를 정의만 한것들임
	
	
	
	
	// 2. 생성자
	
	
	
	// 3. 기능 (= 메서드) : 클래스 내부에서 데이터를 처리하거나 특정 동작을 수행하는 함수
	
	
	
}


// 1)
//class TestA{
//	
//	int v1; 	// 인스턴스 변수 선언 (초기값) -> int타입의 v1 --> heap메모리에 0이 저장됨
//	
//	TestB v2;	// 인스턴스 변수명은 v2, TestB라는 참조변수
			// -> 참조변수 타입의 v2 --> heap메모리에 null이 저장됨
//	
//	// TestB v1;  --> 이것도 변수명은 중복될 수 없다
//	
//}



// 2)

class TestA{
	
	int v1 = 10;
	
	TestB v2 = new TestB();
	
}


class TestB{
	
	int v1;		// 인스턴스 변수 선언 (초기값)
	
}

'JAVA > DAY 11 _ 23.08.31' 카테고리의 다른 글

Setter & Getter - self study  (0) 2023.09.10
Class - self study  (0) 2023.09.10
Math.  (0) 2023.09.10
Method  (0) 2023.09.10
Constructor  (0) 2023.09.10