public class P2_constructor {
public static void main(String[] args) {
System.out.println("테스트 시작");
// 1) 주석때면
// Student s1 = new Student(); // Class Student에 name, age, score가 있었지
// s1이라는 지역변수를 stack에 생성해서 new Student라는 배열 같은걸
// heap메모리로 만드는거야. (주소값 설정이라 생각하자)
// heap메모리에있는 name에 접근해서 트레라는 이름을 저장하는거지./
// s1.name = "트레";
// s1.age = 20;
// s1.score = 99;
//
//
// Student s2 = new Student();
//
// // 인스턴스(Student s1 = new Student(); )가 생성되지 않으면 맨밑에 '생성자 하이'없이 끝난다
// // 인스턴스를 두번 적어주니까 '생성자 하이'가 두번 실행, 끝난다.
// // (--> 시작, class student호출, 호출 한번 더, 끝)
// // 생성자를 호출하는 순간 그 안의 내용이 모두 순서대로 시행됨
//
// System.out.println("테스트 끝");
// 2, 3) 주석떼면
// Student s1 = new Student("한조"); // 밑에서 Student(String a)만 넣으면 하나만 해도되는데
// (String a, int b, int c) 이렇게 선언했으니까 저렇게 넣어야 사용할 수 있다구
Student s1 = new Student("한조", 50, 80);
Student s2 = new Student("트레", 20, 100);
Student s3 = new Student("메르시", 50);
// --> 성적을 아에 안넣고싶어? 0도 아니야. --> 2-2처럼 오버로딩 하면됨
System.out.println(s1.name); // 한조
System.out.println(s1.age); // 50
System.out.println(s2.name); // 트레
System.out.println(s2.score); // 100
System.out.println("테스트 끝");
}
}
class Student{
// 1. 속성(필드) : 인스턴스 변수 정의
String name;
int age;
int score;
int test;
// 2. 생성자
// 문법 : 클래스명 (매개변수 N..)(...)
// 선언만으로는 아무런 일도 하지 않는다
// 인스턴스가 생성되면 실행됨
// 활용 : 일반적으로 값을 초기화하는 용도로 사용
// 1)
// Student(){
// class명을 넣으면 main이랑 같은 초록색이지? 이건 순서대로 출력된다. 즉, syso()가 된다는거임
// System.out.println("생성자 하이");
// System.out.println("생성자를 자동으로 호출한다구");
//
// }
// // 2)
// Student(String a, int b, int c){
//
// // 생성자() 괄호에 매개변수를 쓰면, 맨위에서 new Student();는 사용할 수 없어
// // new Student() 안의 괄호에 String이면 문자열, int면 숫자를 넣으면 되겠지
// // String a, int b, int c 이렇게 넣었다는건
// --> 이 API를 쓰려면 순서대로 String.int.int를 넣지않으면 이걸 못쓴다구
//
// name = a; // 인스턴스 name은 자기자신에게 a를 부여한다.
// age = b;
// score = c;
// }
// 3) String 변수의 이름을 인스턴수 변수의 명과 똑같이 만들고싶어?
Student(String name, int age, int score){
// name = name; // 이렇게하면 2)에서 null이나온다...
this.name = name; // this : 문법키워드로 참조주소임 (생성자일때 사용O, 메서드에서는 사용 X)
this.age = age;
this.score = score;
// new Student("한조", 50, 80); 가 선언되면 이것의 주소값은 0xCC11
// this.name의 주소값이 0xCC11로 부여된다!! (new ... 선언이 없으면 그냥 의미없는 것)
// new Student("트레", 20, 100); 가 선언되면 이것의 주소값은 0xFF11
// this.age의 주소값이 0xFF11로 부여된다!!
test = 10;
// 매개변수에 인스턴스변수명이 없으면 this.이 없어도 된다. (원래는 this. 붙이는게 문법)
}
// 2-2. 생성자 오버로딩 : 생성자를 2개이상 정의할 수 있따
// 만약에 위에거처럼 String, int, int 이렇게 만들면 오버로딩이 안된다. (개수가 중요한게 아님-> String, int, String은돼)
Student(String name, int age){ // String name, int score도 안되겠지?
this.name = name;
this.age = age;
}
Student(){} // 이렇게만 냅두면 new Student(); 이렇게 냅둬도 된다는거지뭐