[Java의 정석]Chapter6.객체지향 프로그래밍(32~35)

Hello_Wendy·2022년 4월 20일
0

자바의 정석

목록 보기
45/61
post-thumbnail

Chapter 6. 객체지향 프로그래밍

32. 생성자(constructor)

  • 생성자 : 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'
  • 인스턴스 변수의 초기화 작업에 주로 사용
  • 인스턴스 생성 시에 실행되어야 하는 작업을 위해서도 사용
  • 생성자 역시 메서드처럼 클래스 내에 선언
  • 구조도 메서드와 유사하지만 리턴값이 없음
  • 생성자 앞에 리턴값이 없음을 뜻하는 키워드 void를 사용하지 않고, 아무것도 적지 않음

🍟 생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 함
2. 생성자는 리턴값이 없음
<생성자도 메서드이기 때문에 리턴값이 없다는 의미의 void를 붙여야 하지만, 모든 생성자가 리턴값이 없으므로 void 생략 가능함>

🍔 생성자의 정의 - 생성자도 오버로딩 가능하므로 하나의 클래스에 여러개의 생성자 존재 가능

클래스이름(타입 변수명, 타입 변수명, . . .) {
	//인스턴스 생성시 수행될 코드,
    //주로 인스턴스 변수의 초기화 코드를 적음
}

ex)
class Point {
	point() { //매개변수가 없는 생성자
    	...
    }
    
    point(int x, int y) { //매개변수가 있는 생성자
    	...
    }
    ...
}
  • 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스 생성하는 것 아님
  • 생성자는 단순히 인스턴스변수들의 초기화에 사용되는 특별한 메서드 일 뿐 다른 메서드와 다르지 않음

33. 기본 생성자(default constructor)

  • 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 함

  • 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 기본 생성자(default constructor)덕분임

  • 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 아래와 같은 내용의 기본 생성자를 추가하여 컴파일 함

    	클래스이름() {} //기본 생성자
    	Point() {} 	  //Point클래스의 기본 생성자
  • 컴파일러가 자동적으로 추가해주는 기본 생성자는 이와 같이 매개변수도 없고 아무런 내용도 없는 간단한 것

  • 인스턴스 초기화 작업이 요구되어지지 않는다면 생성자를 정의하지 않고 컴파일러가 제공하는 기본 생성자를 사용하는 것도 좋음

  • 클래스의 '접근 제어자(Access Modifier)'가 public인 경우에는 기본 생성자로 'public 클래스이름( ) { }'이 추가됨

🍇 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때 뿐

  • 클래스가 두 개 일 경우, 하나에만 기본 생성자를 추가하면 생성자가 정의되어 있으므로, 다른 클래스에 추가하지 않으면 기본 생성자가 자동으로 추가 되지 않아서 컴파일 시 에러발생
<에러>
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2();

<정상>
Data_1 d1 = new Data_1();
Data_1 d2 = new Data_2(10); 

예제에서 컴파일 에러가 발생하지 않도록 하기 위해서
Data_2 클래스의 인스턴스를 생성할 때 생성자 Data_2(int x)를 사용하던가
Data_2클래스에 생성자 Data_2()를 추가로 정의 필요

34. 매개변수가 있는 생성자

  • 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용 가능
  • 인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용
자동차를 클래스로 정의한 것인데, 
단순히 color, gearType, door 세 개의 인스턴스 변수와 두 개의 생성자만을 가지고 있음

class Car {
	String color; //색상
    String gearType; //변속기종류-auto,manual
    int door; //문의 개수
    
    Car() {} //기본 생성자
    Car(String c, String g, int d) { //생성자
    	color = c;
        gearType = g;
        door = d;
    }
}
  • Car인스턴스를 생성할 때, 생성자 Car()를 사용한다면, 인스턴스를 생성한 다음에 인스턴스 변수들을 따로 초기화 해주어함
  • 하지만, 매개변수가 있는 생성자 Car(String color, String gearType, int door)를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 가능
  • 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 코드가 간결하고 직관적
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;Car c = new Car("white","auto",4);

35. 매개변수가 있는 생성자 예제

🍎 인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야함
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

  • 생성자를 잘 활용하면 보다 간결하고 직관적인, 객체지향적인 코드를 작성할 수 있음
profile
안녕 나의 새로운 세상

0개의 댓글