[자바의 정석] 생성자, 변수/멤버 변수의 초기화

2023. 9. 22. 23:41·📝 끄적끄적/🖥️ 자바의 정석

챕터 6 끝!

19개의 영상에서 많은 걸 배웠다.

7까지 달려보자 아자자

 

생성자(contrunctor)

인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’

인스턴스 초기화 메서드란? 인스턴스 변수 초기화하는 메서드이다.

Time t = new Time(); //객체 생성
t.hour = 12; //초기화
t.minute = 34; //초기화
t.second = 56; //초기화

 

❓이것을 간단하게 할 수 없을까

Time t = new Time(12, 34, 56); //생성자 호출

 

특징

  • 이름이 클래스 이름과 같아야 한다.
  • 리턴값이 없다.(void 안 붙임)
  • 모든 클래스는 반드시 생성자를 가져야 한다.

 

기본 생성자

  • 매개 변수가 없는 생성자
  • 생성자가 하나도 없을 때만, 컴파일러가 자동 추가
    • 매개변수가 있는 생성자를 만든 후, 기본 생성자를 호출하면 에러발생

 

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출 시 첫 줄에서만 사용가능
class Car2 {
	String color;		// 색상
	String gearType;	// 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수

	Car2() {
		this("white", "auto", 4); /* 코드 중복 최소화해서 이렇게 쓰면됨 */
		//color = "white" 
		//gearType = "auto"
		//door = 4;
	}

	Car2(String color) {
		this(color, "auto", 4);
	}
	Car2(String color, String gearType, int door) {
		this.color    = color;
		this.gearType = gearType;
		this.door     = door;
	}
}

 

 

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수와 인스턴스 변수를 구별할 때 사용
  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
class Car3 {
	String color;		// 색상
	String gearType;    // 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수

	Car3(String c, String g, String d) {
		color = c; 
		gearType = g;
		door = d;
	}
}

 

여기서는 지역변수가 이름이 다르고, 같은 클래스 내라서 `this.` 가 생략된 것.

원래는 아래처럼 `this`를 붙여줘야 한다.

class Car3 {
	String color;		// 색상
	String gearType;    // 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수

	Car3(String color, String gearType, int door) {
		this.color    = color;
		this.gearType = gearType;
		this.door     = door;
	}
}

 

 

this와 this()

`this`와 생성자 `this()`는 완전히 다른 것이다.
`this`는 ‘참조 변수’이고 `this()`는 ‘생성자’이다.

 

 

변수의 초기화

  • 지역변수는 수동 초기화 해야 함(사용 전 꼭!!)
  • 인스턴스 변수는 자동 초기화됨
class InitTest {
	int x; //인스턴스 변수
	int y = x; //인스턴스 변수

	void method1() {
		int i; //지역변수
		int j = i; //에러. 지역변수를 초기화하지 않고 사용
}

 

 

왜 지역변수는 수동 초기화 해줘야 하는가?

지역변수는 호출스택에 재사용이 빈번한 메모리다.

= 아주 짧은 시간 동안 같은 메모리 공간을 쓰고 또 쓰고 하는데, 호출될 때마다 메모리를 0으로 초기화하면 성능이 떨어지기 때문에 성능을 높이기 위해 새로운 값을 덮어씌우는 식을 초래한다.

그래서 사용자에게 수동 초기화하게 돼있다.

 

그럼 인스턴수 변수는 왜 자동으로 초기화 될까?

인스턴스 변수는 유지기간이 지역변수에 비해 길기 때문에 자동 초기화된다.

= 객체는 여러 변수들을 묶어 놓은 거기 때문에 자동 초기화 안 하면 해줘야 될 게 너무 많아서도 있다.

 

 

멤버 변수(인스턴스 변수, 클래스(static) 변수)의 초기화

1. 명시적 초기화 (=)

class Car {
	int door = 4; //기본형 변수의 초기화
	Engine e = new Engine(); //참조형 변수의 초기화
}

`Engine e;`

-> null이 들어가 있는 것. 만들어지기만 하지 객체가 있는 게 아니다.

 

2. 초기화 블록

   a. 인스턴스 초기화 블록 : { }

   b. 클래스 초기화 블럭 : static { }

class StaticBlockTest 
{
	static int[] arr = new int[10];

	static {
		for(int i=0;i<arr.length;i++) {
			// 1과 10사이의 임의의 값을 배열 arr에 저장한다.
			arr[i] = (int)(Math.random()*10) + 1;
		}
	}

	public static void main(String args[]) {
		for(int i=0; i<arr.length;i++)
			System.out.println("arr["+i+"] :" + arr[i]);
	}
}

 

 

3. 생성자

Car(String color, String gearType, int door) {
		this.color    = color;
		this.gearType = gearType;
		this.door     = door;
	}

 

 

결론

인스턴스 변수는 생성자로
클래스 변수는 static { }로

 

 

클래스 변수의 초기화 시점

  • 클래스가 처음 로딩될 때 단 한번(메모리에 올라갈 때)

 

인스턴스 변수 초기화 시점

  • 인스턴스가 생성될 때마다
class InitTest {
	static int cv = 1; //명시적 초기화
	int iv = 1;        //명시적 초기화
	
	static { cv = 2; } //클래스 초기화 블럭
	{ iv = 2; }        //인스턴스 초기화 블럭

	InitTest() { //생성자
		iv = 3;
	}
}

 

차례대로 1 -> 7이 순서다.

 

저작자표시 비영리

'📝 끄적끄적 > 🖥️ 자바의 정석' 카테고리의 다른 글

[자바의 정석] 참조변수의 형변환, instanceof 연산자  (0) 2023.09.24
[자바의 정석] 제어자, 캡슐화  (0) 2023.09.24
[자바의 정석] 상속, 참조변수 super, 생성자 super()  (0) 2023.09.23
[자바의 정석] static 메서드와 인스턴스 메서드, 오버로딩  (0) 2023.09.21
[자바의 정석] 기본형/참조형 매개변수, 참조형 반환타입  (0) 2023.09.20
[자바의 정석] 클래스 변수와 인스턴스 변수, 호출스택  (0) 2023.09.19
'📝 끄적끄적/🖥️ 자바의 정석' 카테고리의 다른 글
  • [자바의 정석] 제어자, 캡슐화
  • [자바의 정석] 상속, 참조변수 super, 생성자 super()
  • [자바의 정석] static 메서드와 인스턴스 메서드, 오버로딩
  • [자바의 정석] 기본형/참조형 매개변수, 참조형 반환타입
현주먹
현주먹
끄적끄적 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (162)
      • 👶🏻 CS (15)
        • Operating System (8)
        • Database (4)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • JPA (5)
        • Test Code (1)
        • Database (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (57)
        • 후기 및 회고 (5)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL
  • 인기 글

  • 태그

    에프랩
    티스토리챌린지
    코딩테스트준비
    항해99
    개발자취업
    에프랩 후기
    jsp
    자바의정석
    인프런 특정문자뒤집기
    NextSTEP
    객체지향
    코테스터디
    인프런 단어뒤집기
    TDD 클린 코드 with Java
    자바의신절판
    오라클
    ==와 equals()
    F-Lab
    f-lab 후기
    PostGreSQL함수
    백준
    개발자멘토링
    데브클럽
    로또 미션
    JPA
    백준10250
    til
    99클럽
    C
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
현주먹
[자바의 정석] 생성자, 변수/멤버 변수의 초기화
상단으로

티스토리툴바