
System.out.println("Number");
int number = sc.nextInt();
System.out.println("num: " + number);
System.out.println("String");
String str = sc.nextLine();
System.out.println(str);
👉 nextInt할 때 숫자+enter를 입력했기 때문
👉 nextLine( )에서는 enter값만 읽기 때문에 input을 할 기회가 없다.
👉 고로 NextInt가 아닌 nextLine()을 쓰자. 하지만 해당 타입에 맞는것으로 변경하면서 써야한다. (화면에서 input받는건 문자열로 받고 캐스팅을 파싱으로 변경하라)
👉 ex) Integer.parseInt(sc.nextLine());
👉 이렇게 일일이 변경하는것이 불편하므로 util 패키지를 별도로 만들어서 사용한다.

👆 static이 안 붙었을때는 각 인스턴스 변수별로 출력값이 나뉘게 되는데, 이는 각 인스턴스 별로 별도의 메모리 공간을 가진다.

👆 static이 붙었을때는 해당 인스턴스들은 값을 공유하게된다. 이는 static이 붙은 클래스 변수의 인스턴스들은 하나의 변수 메모리공간을 공유하기 때문이다.

👉 데이터들은 3가지의 메모리 구조에 할당이 된다.
👉 static / stack / Heap으로 구분이되는데, 해당 사진의 메모리 구조의 공간부터 설명하겠음.
📌 Static Area
a. 메소드의 bytecode, static변수가 할당되는곳
📌 Stack Area
a. 지역변수, 매개변수가 할당되는 영역으로 초기화는 진행되지 않음.
📌 Heap Area
a. 배열과 모든 인스턴스 객체가 할당되는 영역으로 자동 초기화 진행.
b. GC는 여기에 할당되어 있음.
static변수인 nextId는 static공간에 할당이 되고 1이라는 값으로 초기화가 된다.
main메소드 내부에 Student s1 = new Student( ); 를 통해서 s1 변수에 인스턴스가 생성이 되고, s1의 변수는 지역변수이므로 stack 영역에 할당이 된다.
new라는 동적할당을 통해서 Student( ); 객체가 Heap 영역에 할당이된다.
setId메소드를 통해서 id값은 nextid를 통해 1이라는 값을 갖게되고 nextid값은 2로 증가하게된다.
현재 상태에서는 stack영역에 있는 s1이 heap영역의 student를 참조하고있다.
한번 더 Student s2 = new Student( ); 를 통해서 S2의 변수가 stack으로 할당되고, student( );객체가 heap으로 할당되는데 nextid의 값 때문에 id의 값은 2로 할당되게 된다.
👉 nextLine()을 쓰고 형변환을 해주는 번거로움을 줄이기 위함.

👉 ScanUtil이라는 클래스를 생성해서 데이터 타입별로 형 변환 세팅을 미리 해두면
한 줄의 소스코드를 이용하여 sout(질문), input, 형변환 3가지가 한번에 가능한 스킬.

👉 Scanner와 util을 인스턴스 생성하고 사용한다.
👉 피라미드 형식으로 뻗어 나가는 형식으로 대표적으로 yes or no 의 형태가 있다.

이와 같은 인스턴스 변수가 있을 때 왜 yes와 no는 QUIZ의 데이터타입을 가지는지 의문이 든다.
첫 번째 퀴즈 Q1에서 선택 할 수 있는 조건은 Q1.YES와 Q1.NO인데
Q1.YES 를 선택하게 되면 게임이 종료되는것이 아닌 Q1.YES에 이어지는 Q2문제가 출력된다.
그러면 Q2에서도 Q1과 똑같은 목차인 text, yes, no를 가져와야 하니까
q2.yes와 q2.no는 quiz객체로 초기화를 시켜주는 과정을 거치게 된다.
고로, yes 와 no는 다음 문제에 갈 때 마다 quiz 의 데이터를 이용해야 하므로 quiz를 참조하게 된다.

👆 quiz.yes와 quiz.no는 각각 quiz의 객체로 초기화하는 과정을 거친다.
first = new QuizVO("First Quiz");
QuizVO q2 = new QuizVO("2Second Quiz");
QuizVO q3 = new QuizVO("3Third Quiz");
QuizVO q4 = new QuizVO("4th Quiz");
QuizVO q5 = new QuizVO("5th Quiz");
QuizVO q6 = new QuizVO("6th Quiz");
first.setYes(q2);
q2.setYes(q3);
q3.setYes(q4);
q4.setYes(q5);
q5.setYes(q6);
👉 해당 내용을 정리하자면 first는 QuizVO를 참조하고 있다. 그러면 first.yes를 칸 안에 q2의 리모컨을 넣는 개념.
👉 first 문제에서 first.yes와 first.no가 있을때 first.yes를 선택하게 되면 q2의 문제가 출력된다.
그때 first.yes를 선택하면 q2로 간다는 코드가 first.setYes(q2);임
📌 최종적으로 정리하자면, first는 quizVO를 참조하고있기 때문에 초기화 하여 quizVO의 데이터
즉 text, yes, no를 사용 할 수 있다.
고로, first.yes 에다가 q2 를 집어넣게 되면 첫번째 문제에서 yes를 누를시에 q2로 이동하게 된다 라는 말임.