생성자
ㄴ모든 클래스에 하나 이상 반드시 존재.
ㄴ선언하지 않았다면 기본 생성자가 자동으로 추가됨.
>>소스 파일에 생성자를 선언하지 않아도, 바이트 코드 파일에는 기본 생성자가 존재함.
>>생성자를 명시하는 경우: 객체를 다양한 값으로 초기화하기 위함!
기본 생성자: 중괄호 안이 비어있는 생성자. [public] 클래스( ) { }
클래스가 public class로 선언되었을 때 기본생성자에도 public이 붙는다.
객체 생성하려면 생성자 호출이 반드시 필요하다.
ㄴ객체 생성시 초기화를 담당: 객체 초기화란?
객체를 사용할 준비를 하는 것. (필드, 메소드 관련)
생성자가 성공적으로 실행되면 --> 힙 영역에 객체생성 & 객체번지 리턴
리턴된 객체번지는 변수에 저장된다. (클래스 변수에.)
ㄴnew연산자로 클래스로부터 객체를 생성할 때 생성자가 호출된다.
생성자 선언
명시적으로 생성자를 선언하려면 다음처럼 작성한다.
클래스( 매개변수선언, ...) {
//객체의 초기화코드
}
저번에 봤듯이!!
메소드와 비슷하지만, 리턴 없고 클래스이름이다!
일반적으로 블록 내부의 객체초기화 코드에는, 필드에 초기값을 저장하거나 필요한 메소드를 호출한다. (메소드를 통해 객체 사용 전 준비환경 만들기 등)
매개 변수 선언은 생략도 가능하고 여러개 선언도 가능하다.
외부 인자를 블록 내부로 전달하는게 필요하면 선언하면 된다.
필드 초기화 관련
1. 필드에서 직접 초기값 주기
>>동일한 클래스로부터 생성되는 객체의 필드값들은 초기값이 동일해진다.
2. 생성자 블록에서 인자로 값 받기 -> 블록 내부 필드값으로 작용하기
>>생성자 호출할 때 인자(매개값)에 직접 초기값 넣어서 블록 내부 필드값으로 전달할 수 있다.
>>객체 생성 시점에 서로 다른 초기값들을 다양하게 부여할 수 있다.
>>모든 필드를 매개값으로 받으면 너무 많으니까...
매개값 입력이 필요하다고 판단하는 필드를 선정하여 매개값으로 받자
<<실습>>
위 실습에서 매개값 이름을 m, s라고 했다.
그치만 매개변수 이름은 필드 이름과 동일/비슷하게 사용하는게 가독성이 좋다.
"통상적으로 필드와 동일한 이름을 갖는 매개 변수를 사용한다."
>>오잉 근데 이름이 같으면 어캐...!!!!!!
(필드보다 매개 변수의 사용 우선순위가 높아서, 필드와 매개변수 이름이 같으면 매개변수에서 필드로 접근할 수 없다.)
>>다 방법이 있다.
"필드 앞에 this. 를 붙이면 된다. this라는 참조 변수를 통해 필드를 사용하는 개념이다!)
public Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
>>this라는 참조변수가 name필드를 참조하도록 하자!!! this.name
>>this라는 참조변수가 ssn필드를 참조하도록 하자!!! this.ssn
이런 방식을 사용해서, 매개변수 이름을 필드명과 동일하게 설정할 수 있다는 거다>_<
생성자 오버로딩
자바는 생성자 오버로딩을 지원한다.
>>변수를 달리하는 생성자를 여러 개 선언할 수 있도록 함
필요성: 외부에서 제공되는 다양한 데이터를 이용해서 객체를 초기화하려면, 생성자도 다양화되어야 한다.
"기본 생성자를 사용할지, 매개값1 데이터만 받을지, 매개값1과 매개값2를 받을지.." 에 따라서, 적합한 생성자를 통해 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공한다.
생성자가 오버로딩되어있으면, new연산자로 생성자를 호출할 때 작성하는 매개값 타입과 수에 의해 호출될 생성자가 결정된다.
<<생성자 오버로딩 개념익히기 실습>>
위처럼, 생성자 오버로딩을 통하여
다양한 방법으로 Car객체를 생성할 수 있게 한다.
자..그런데
생성자 오버로딩이 많아질 경우... 생성자들이 비슷비슷... 중복된 코드를 많이 작성해야 하는게 좀 그렇다.
>>오버로딩에서 생기는 중복 코드를 제거하는 방법을 알아보자
오버로딩에서 생기는 중복코드 제거하기
다른 어떤 생성자를 호출하자--> this()를 이용
생성자에서 다른 생성자를 호출할 수 있다. this()코드를 사용한다.
ㅡthis()의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야 한다.
ㅡ반드시 생성자 블록 내부 첫 줄에서만 허용된다.
아래 코드를 보면 중복되는 내용이 많다.
3개의 생성자 내용이 비슷하다.
>>앞 2개의 생성자에서 this()를 사용해보자. -->마지막 생성자인
Car(String model, String color, int maxSpeed)를 호출하도록 해보자.
동일 클래스 내에서, this로 어떤 생성자를 부른다. 어차피 생성자라는게 클래스 이름이랑 같으니까.. 호출하려는 생성자의 매개변수에 맞게 써주면 된다. 직접 입력할 변수만 매개변수명으로 작성하면 되는 것 같다.
확인 문제
02.
03.
Board클래스가 오버로딩 되어있다.
this()로 중복 코드 제거하자. (생성자내에서 다른 생성자 호출하기)
04. Board 클래스가 위처럼 선언되어 있을 때, Board 객체를 생성하는 네가지 방법 모두 기술해보세요.
1. Board board1 = new Board("타이틀", "내용");
2. Board board2 = new Board("타이틀", "내용", "writer");
3. Board board3 = new Board("타이틀", "내용", "writer", "날짜");
4. Board board4 = new Board("타이틀", "내용", "writer", "날짜", 123);
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/07 06-4 [메소드] (0) | 2020.07.07 |
---|---|
[1주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.07 |
[혼자 공부하는 자바] 7/06 06-2 [필드] (0) | 2020.07.06 |
[혼자 공부하는 자바] 7/06 06-1 [클래스 선언] [클래스 구성] [new 연산자] [필드] [생성자] [메소드] (0) | 2020.07.06 |
[혼자 공부하는 자바] 7/04 05-2 배열2 (0) | 2020.07.04 |