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 |