728x90

 

생성자(constructor)

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

이외에도 메서드이기 때문에 {}에 작업할 내용을 넣으면 됨

모든 클래스에는 반드시 하나의 생성자가 있어야한다

 

ex) iv 초기화 예시

Time t = new Time();  // 생성자
t.hour = 12;    // 인스턴스 메소드(iv) 초기화
t.minute = 34;  // 인스턴스 메소드(iv) 초기화
t.second = 56;  // 인스턴스 메소드(iv) 초기화

 

 

생성자의 필요성

위처럼 객체생성 후 iv 초기화를 해야하므로 번거롭다

한 줄로 할 수 있다면 직관적이고 편리할 것

 

생성자 예시

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

위의 4줄이 1줄로

 

생성자 호출이라는 의미

생성자 불러다 썼다는 의미

 

 

생성자의 규칙

1) 클래스명과 생성자명이 같아야한다

2)항상 리턴값이 없다(void 안붙인다)

 

 

 

1) 클래스명과 생성자명이 같아야한다

    같은 이름이 존재할 수 있는건 오버로딩이 가능하기 때문

2)항상 리턴값이 없다(void 안붙인다)

 

 

 

1.기본 생성자(default constructor)

생성자가 하나도 없을 때만 컴파일러가 자동 추가

생성자는 원래는 직접 값을 넣어줘야한다

기본생성자를 안넣어주면 에러메세지가 다른게 나오기에 찾기 힘들다

Card c = new Card(); // 기본생성자

 

 

기본생성자 에러

class Data_1도 생성자가 없지만 에러가 안나는건 값을 안넣어줬기 때문이고, Class Data_2에는 Data_2(int x)라는 값을 임의로 넣어줬기 때문에 생성자도 따로 지정해줬어야 했는데 안했기에 에러가 난 것

 

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

 

매개변수 생성자가 필요한 이유

4줄이 1줄로

 

Car c = new Car(”while”,”auto”,4); 문장이 실행되는 과정

 

1)참조변수 C가 생성됨

2)new연산자가 객체 및 주소값 생성

3)생성자 호출되면서 객체 초기화

4)변수(Car c)에 주소값이 들어감

 

 

1)참조변수 C가 생성됨

2)new연산자가 객체를 만들고 객체에 주소값 부여

       (객체 멤버 3개 : color, geartype, door)

각 객체 멤버에 데이터타입의 기본값 들어가 있음(String은 null int는 0)

 

3)생성자가 호출되면서 객체를 초기화시킴

생성자 호출로 white, auto, 4의 값이 color, geartype, door로 들어감

 

초기화란?

자기가 원하는 값을 처음으로 넣는 것을 초기화라 부름

 

4)마지막으로 Car c에 주소값이 들어감

객체와 참조변수 연결해야하니까 대입연산자( = )가 객체의 주소를 저장한다

객체의 주소값은 new연산자의 반환값

 

728x90
반응형
728x90

 

생성자(constructor)

  • 해당 클래스와 똑같은 이름을 정의하면, 얘가 바로 생성자(constructor)
  • 초기에 주입할 필요가 있는 값(초기값)을 전달하거나 초기에 작업을 수행할 때 쓴다
  • 리턴값이 없으며, 모든 클래스는 생성자가 반드시 한개이상 존재한다.
  • 따로 선언하지 않아도 보이지 않는 default constructor가 자동으로 추가된다.

 

 

this 키워드

  • 클래스인스턴스화 되었을 때인스턴스를 가리키게 하는 특수한 키워드
  • 자바에서 this는 자기자신을 뜻함

 

 

생성자(constructor)는 왜 써야할까?(과정설명)

파일수정 시 어떤파일을 수정할지 파일 지정해줘야하는데 파일지정 행위를 까먹거나 나중에 하게되면 문제발생

  1. 인스턴스 생성시점에서 ("data.txt")처럼 파일을 지정할 수 있다면 까먹지 않고 안정성 상승
  2. 인스턴스가 생성될 때, 처리되어야할 어떤 작업(초기값 등)이 있을 때, 또는 생성될 때 실행되어야하는 작업들을 하고 싶을 때 생성자(constructor)로 해결 가능

 

어떤 클래스가 어떤 작업을 처리하기전 delimiter값을 세팅해야 우리작업을 할 수 있는 상황이라고하면,

이 파라미터값 조정을 까먹기가 상당히 쉽다.

개선책

인스턴스 생성시, delimiter값을 지정하지 않으면 클래스가 인스턴스화되지 못하도록 하면서 개발자가 실수할 가능성 차단가능. 인스턴스를 생성할 때 delimiter값을 지정하는 것을 해볼 것. 생성자constructor를 정의해야한다.

 

자바에서의 클래스는 생성자(constructor)라는 특수한 메소드를 구현할 수 있는 기능을 제공하며, 중요기능은 초기화이다. 해당 클래스와 똑같은 이름을 정의하면, 얘가 바로 생성자(constructor)

인스턴스를 생성할 때, 자바는 이 클래스와 동일한 메소드가 있다면 그 메소드를 호출하도록 약속 되어있기에 우리는 그 클래스가 인스턴스화 될 때 실행되어야할 코드를 construct method 안에 정의 하는 걸 통해서 초기화의 목적을 달성할 수 있는 것

 

print클래스가 인스턴스화 될 때 구분자를 인자로써 받을 것이기에 print메소드의 매개변수로 delimiter를 받으면됨

 

생성자(constructor) 모양새

class Print00 {
	public String delimiter = "";
	public Print00(String delimiter) {  // print00의 ()이 생성자

 

 


 

class Print00 { 
	public String delimiter = ""; 
	public Print00(String _delimiter) {
			delimiter = _delimiter;  // 이 클래스의 인스턴스 변수인 delimiter 값은 _delimiter의 값은 "----"
	}  // 밑에 A()메소드를 호출하면 println(delimiter)값에 "----" 들어가게됨
	public void A() { 
		System.out.println(delimiter); // 인자값에 "----"
		System.out.println("A");
	}
	public void B() {
		System.out.println(delimiter);
		System.out.println("B");

}

이 클래스의 인스턴스 변수인 delimiter 값은 _delimiter의 값은 "----" 밑에 A()메소드를 호출하면 println(delimiter)값에 "----" 들어가게됨

 

만약 언더바를 빼고 delimiter = delimiter;라고 한다면

Q.왼쪽 delimiter는 인스턴스 변수delimiter일까 생성자 메소드의 delimiter매개변수일까?

A. delimiter매개변수

※ 확인방법 ※ 

실행해보면 구분자가 출력이 안되어 나오는데, String delimiter = "";에 세팅이 안됬기 때문. 또한 이클립스에서 같은변수인지 색표시에서도 각각 구별되어져 보임. 이런 경우 앞에 this.를 붙여준다. this키워드 붙인 후 연결되는 delimiter가 바뀌는게 보인다.

this는 우리가 생성한 인스턴스를 가리키는 것 this.delimiter는 인스턴스의 변수를 가리키니까 String delimiter = "";의 delimiter를 가리키며, 생성자메소드 뿐 아니라 클래스 아래있는 메소드들의 delimiter에도 this.를 붙여 명시적으로 해두는게 좋다

 

생성자(constructor)는 초기에 주입할 필요가 있는 값(초기값)을 전달하거나 초기에 작업을 수행할 때 쓴다

this는 클래스가 인스턴스화 되었을 때에 인스턴스를 가리키는 특수한 이름

 

 

 

전체코드

// OOP 7. 생성자(constructor)와 this

// 생성자(constructor)
// 초기에 주입할 필요가 있는 값을 전달하거나 초기에 작업을 수행할 때 쓴다
// 리턴값이 없으며, 모든 클래스는 생성자가 반드시 한개이상 존재한다. 
// 따로 선언하지 않아도 보이지 않는 default constructor가 자동으로 추가된다.

// this 키워드
// 클래스가 인스턴스화 되었을 때에 인스턴스를 가리키게 하는 특수한 키워드
// 자바에서 this는 자기자신을 뜻함

public class OOP07 {
	public static void main(String[] args) {
	
//	 생성자(constructor)는 왜 써야할까?
//	 파일수정 시 어떤파일을 수정할지 파일 지정해줘야하는데 파일지정 행위를 까먹거나 나중에 하게되면 문제발생
//	 1)인스턴스 생성시점에서 ("data.txt")처럼 파일을 지정할 수 있다면 까먹지 않고 안정성 상승
//	 2)인스턴스가 생성될 때, 처리되어야할 어떤 작업(초기값 등)이 있을 때,
//	 또는 생성될 때 실행되어야하는 작업들을 하고 싶을 때 생성자(constructor)로 해결 가능
	
	
//	 print클래스는 어떤 작업을 처리하기전 delimiter값을 세팅해야 우리작업을 할 수 있는 상황이라고하면,
//	 이 파라미터값 조정을 까먹기가 상당히 쉽다.
//	 개선책
//	 인스턴스 생성시, delimiter값을 지정하지 않으면 클래스가 인스턴스화되지 못하도록 하면서 개발자가 실수할 가능성 차단가능
//	 인스턴시 생성할 때 delimiter값을 지정하는 것을 해볼 것. 생성자constructor를 정의해야함
	
//	 자바에서의 클래스는 생성자라는 특수한 메소드를 구현할 수 있는 기능을 제공하며, 중요기능은 초기화
//	 해당 클래스와 똑같은 이름을 정의하면, 얘가 바로 생성자(constructor)
//	 인스턴스를 생성할 때 자바는 이 클래스와 동일한 메소드가 있다면 그 메소드를 호출하도록 약속 되어있기에
//	 우리는 그 클래스가 인스턴스화 될 때 실행되어야할 코드를 construct method 안에 
//	 정의 하는 걸 통해서 초기화의 목적을 달성할 수 있는 것
		
//	 print클래스가 인스턴스화 될 때 구분자를 인자로써 받을 것이기에 print메소드의 매개변수로 delimiter를 받으면됨
				
	Print00 p1 = new Print00("----");		// new가 없으면 메소드를 호출하는 것과 같다
    p1.A();
    p1.B();

    Print00 p2 = new Print00("====");
    p2.A();
    p2.B();    
	}
}

class Print00 {
	public String delimiter = "";
	public Print00(String delimiter) {  // print00의 ()이 생성자
		this.delimiter = delimiter; 	// _delimiter는 이 맥락에서 "----"
	}
	// 이 클래스의 인스턴스 변수인 delimiter 값은 _delimiter의 값은 "----"
	// 밑에 A()메소드를 호출하면 println(delimiter)값에 "----" 들어가게됨
	// 만약 언더바를 빼고 delimiter = delimiter;라고 한다면 왼쪽 delimiter는 
	// 인스턴스 변수delimiter일까 생성자 메소드의 delimiter매개변수일까? 
	// delimiter매개변수이다
	// 확인방법은 실행해보면 구분자가 출력이 안되어 나오는데,  String delimiter = "";에 세팅이 안됬기 때문
	// 이클립스에서 같은변수인지 색표시에서도 구별되어져 보임. 이런 경우 앞에 this.를 붙여준다.
	// this는 우리가 생성한 인스턴스를 가리키는 것
	// this.delimiter는 인스턴스의 변수를 가리키니까 String delimiter = "";의 delimiter를 가리킴
	// 생성자메소드 뿐 아니라 클래스 아래있는 메소드들의 delimiter에도 this.를 붙여 명시적으로 해두는게 좋다
	
	// 생성자(constructor)는 초기에 주입할 필요가 있는 값을 전달하거나 초기에 작업을 수행할 때 쓴다
	// this는 클래스가 인스턴스화 되었을 때에 인스턴스를 가리키는 특수한 이름
	public void A() {
		System.out.println(this.delimiter);
		System.out.println("A");
	}
	public void B() {
		System.out.println(this.delimiter);
		System.out.println("B");
	}
}

 

728x90
반응형

+ Recent posts