본문 바로가기

백엔드개발자 준비하기

[백엔드개발자 준비하기] 생성자

자료형 변수명 = 값
J09_Student를 담을 수 있는 자료형
스택메모리에는 컴파일 시점에 할당됨
원래는 J09_Student 에 null값이 들어있음
new는 생성자를 쓰기 위한 키워드 (new 생성자)가 한 세트
new라는 것을 거쳐 생성을 함 : 동적 메모리 할당
스택메모리에는 컴파일 시점에 할당됨
스택메모리 : 정적메모리, 힙 : 동적메모리
컴파일 당시에 스택메모리를 할당해주었는데 추가로 메모리가 필요한 경우 힙메모리에서 빌려옴
힙메모리에서 빌리는 과정을 생성이라고 함
힙메모리에 할당된 주소는 매번 변경됨 
따라서 힙메모리 주소를 정적메모리인 스택메모리에 넣어두고 이름을 지정해줌 
따라서 이름을 알고 있으면 힙메모리의 주소를 불러올 수 있음(아래 Student1 같은 경우)
. : 참조자료형

생성자는 클래스 명과 일치한다
그러나 형태는 메소드형태임
클래스를 정의해두어야 생성자 사용이 가능하다
어딘가에 대입하려면 리턴값이 있어야 함
생성자는 항상 주소값이 들어가야 해서 항상 주소값을 리턴해줌

생성자는 제일 상위에서 생성하여 조합 해야 한다

 

생성자의 3가지

1) 아무것도 없는 생성자

2) 필수인 매개변수를 가지는 생성자 

3) 전체 생성자

 

중간에 부속품을 만들어야 할 경우에는 final을 해제

중간에 부속품을 바꾸지 말아야할 경우 final을 사용 


기본생성자는 생략되어있는데 다른 생성자를 사용하고 싶을때 메소드처럼 새로운 매개변수를 활용하여 오버로딩 가능하다

 

Alt + Shift + s : 게터세터나 생성자 자동생성

 

예시

[J10_Student]

public class J10_Student {
	
	// 참조변수, 레퍼런스변수, 멤버변수 라고불린다
	// 메소드도 마찬가지로 참조메소드, 레퍼런스메소드, 멤버메소드라고 불린다. 
	String name;
	int age;

	// 클래스에서는 지역변수와 멤버변수를 구분함 
	// s1.~~ : 생성된 이후에 값을 대입
	// 생성할 때 바로 메소드 사용하듯이 값을 넣어주면 바로 사용가능
	// 하지만 그러면 생성자 변수와 멤버변수의 이름이 같을때 문제가 생김
	// 따라서 this.를 사용하여 멤버변수를 특정해줌
	
	// 생성자들
	J10_Student() {
		System.out.println("기본생성자 호출");
	}
	
	J10_Student(int age) {
		System.out.println("학생의 나이 : " + age);
	}
	
	J10_Student(String name) {
		System.out.println("학생의 이름 : " + name);
	}
	
	// (주소).~~ 에서 .은 참조한다는 뜻
	// this는 자기 자신의 주소 : main 에서 사용하는 s1.~~ 과 같은 주소를 가짐
	J10_Student(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// 이 메소드에서 사용되는 변수는 멤버변수
	void printInfo() {
		System.out.println("학생 이름 : " + name);
		System.out.println("학생 나이 : " + age);
	}

[J10_StudentMain]

public class J10_StudentMain {

	public static void main(String[] args) {
		
		// 주소에다 변수를 넣음
		// 해당변수는 클래스 내부의 생성자의 멤버변수로 들어감
		// 그것이 printInfo를 통하여 출력
		J10_Student s1 = new J10_Student("박은빈", 23);
		s1.printInfo();
		
		// 원래 생성 이후에 값을 넣어야 하는데(도색) 생성할 때 값을 바로 넣기 위해서 this사용
	}
}