Programming Language/JAVA (2) - 혼공자
[Java 혼자 공부하는 자바] 생성자
나수비니
2023. 9. 25. 20:00
728x90
생성자
핵심 키워드
- 기본 생성자, 생성자 선언, 매개 변수, 객체 초기화, 오버로딩, this()
핵심 키워드
- 생성자는 new 연산자로 호출되는 {} 중괄호 블록
- 객채 생성시 초기화를 담당한다.
생성자
생성자란?
- 인스턴스가 생성될 때, 호출되는 ‘인스턴스 초기화 메서드’이다.
- 즉, 클래스로부터 new 연산자로 객체를 생성 = 인스턴스화 할 때 호출되어 변수의 초기화를 담당한다.
- 코드 예시?
Cat cat0 = new Cat();
Cat cat1 = new Cat();
Cat cat2 = new Cat();
- new cat()이 생성자이다.
생성자 정의
- 생성자 또한 메소드이므로, 사용을 위해 먼저 정의되어야 한다. 일반 메소드와의 차이는 리턴 타입이 없다는 것이다.
class Cat {
String name;
double weight;
int age;
/* 생성자 정의 *'/
Cat (String s, double d, int i) {
name = s;
weight = d;
age = i;
}
}
생성자 조건
- 생성자 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다. void 또한 사용하지 않는다.
- 메소드처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
생성자의 역할
- 생성자는 두 가지 역할을 한다.
- 객체 생성 - 객체를 만드는 것
- 객체 초기화
- 객체의 필드 값을 설정하는 것
- 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것
/* 1. 객체 생성 */
Cat c = new Cat();
/*2. 필드 초기화 */
c.name ="네로";
c.weight = 3.78;
c.age = 3;
- 생성자 활용 방식
- 생성자를 활용하면, 위 코드를 단 한 줄로 만들 수 있다.
/* 객체 생성과 동시에 초기화 */ Cat c = new Cat("네로", 3.78, 3);
생성자의 필드 초기화
- 클래스로부터 객체가 생성될 때, 필드는 기본 초기값으로 자동 설정된다.
- 만약 다른 값으로 초기화 하고 싶다면?
- 필드를 선언할 때 초기값을 지정한다
- 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다
- 생성자에서 초기값을 준다
- 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화할 수 있다. 예를 들어, 이름/주민번호 필드값은 클래스를 작성할 때 초기값을 줄 수 없고 객체 생성 시점에 다양한 값을 가져야 한다.
- 따라서, 생성자의 매개값으로 이 값들을 받아 초기화해야한다.
- 필드를 선언할 때 초기값을 지정한다
- 예시
//생성자 필드초기화
package sec03.exam03;
public class Korean {
//Field
String nation ="대한민국";
String name;
String ssn;
//Constructor
Korean(String n, String s) {
this.name = n; **//내가 가지고 있는 name이라는 필드. -> name의 매개값을, 나의 필드인 name에 저장해라.**
this.ssn = s;
}
}
package sec03.exam03;
public class KreanExample {
public static void main(String[] args) {
Korean k1 = new Korean("박자바","01225-1234567");
System.out.println(k1.nation);
System.out.println(k1.name);
System.out.println(k1.ssn);
System.out.println("-----");
Korean k2 = new Korean("김자바","930525-0654321");
}
}
this ()
- 매개 변수 이름은 필드 이름과 유사하거나, 동일한 것 사용을 권장
- 필드와 매개 변수 이름 완전히 동일할 경우, this.필드로 표현
- 사실 이해가 잘 가지 않는다…
- this란?
- 기본적으로 매개변수와 필드의 명이 같을 경우 매개변수의 값만 참조하게 되는데, 매개변수로 받은 값과 필드 값을 같은 값으로 참조시키기 위해 선언한다.
- this는 인스턴스의 자기 자신을 의미한다. 주로, 필드(전역변수)와 메소드 또는 생성자의 매개변수가 동일할 때, 인스턴스 필드임을 명확히 하기 위해 사용한다.
- 이해됐다..
this.a(매개변수) = a(필드);
public class InstanceMemberEx02 {
int a, b; //필드
public InstanceMenberEx02(int a, int b) { //생성자 (매개변수)
this.a = a; //this.a는 필드 / a는 매개변수를 의미
this.b = b; //this.b는 필드 / b는 매개변수를 의미
생성자 오버로딩 (overloading)
- 매개 변수를 달리하는 생성자 여러 개 선언
- 외부에서 제공되는 다양한 데이터를 사용하여 객체화 하기 위해
키워드 핵심
- 기본 생성자
- 클래스 선언 시, 컴파일러에 의해 자동으로 추가되는 생성자
- 생성자 선언
- 생성자를 명시적으로 선언 가능. 생성자를 선언하면 기본 생성자는 생성되지 않음
- 매개 변수
- 생성자 호출 시 값을 전달받기 위해 선언되는 변수
- 객체 초기화
- 생성자 내부에서 필드값 초기화하거나 메소드 호출해서 사용 준비를 하는 것
- 오버로딩
- 매개 변수 달리하는 생성자를 여러 개 선언
- this()
- 객체 자신의 또다른 생성자를 호출할 때 사용
생성자 추가 이해하기
0923
뜯어지는 머리
내가 생성자를 완벽하게 이해를 못 한 것 같다.
package Java10;
/*
* 틀.
*/
public class User {
String name; //이름
int age; //나이
String hobby; //취미
// 클래스의 생성자
// 클래스가 생성이되면 매개변수로 데이터들이 입력된다
// 전역변수로 선언해준 name, age, hobby는 null/0값이다.
// 아래 Main 클래스가 생성되는 시점에서 비로소 값들이 들어온다.
public User (String _name, int _age, String _hobby) {
// 헷갈리니까 this를 붙여줄 수 있다.
// 여기서 this의 의미는 User 클래스의 변수를 말한다.
this.name = _name;
this.age = _age;
this.hobby = _hobby;
}
}
package Java10;
public class Main {
public static void main(String[] args) {
//생성자 파라미터(매개변수)에 맞게 인자 삽입해준다.
//name이라는 프로그램이 실행되면, user라는 변수에다가
//User 클래스를 생성을 했다.
//new를 해주는 행위 자체가 클래스를 생성을 해줬다는 것이다.
//User 이라는 붕어빵 틀이면, Main이라는 클래스에서 이를 사용하려고 new를 만들어서 실제 값들을 넣은 것
//그렇게 함으로써 클래스를 생성했다는 것이다.
//즉 User가 생성이 되어서, 생성될 때 값을 삽입을 해줬고
//User 클래스로 넘어간다.
User user = new User("이홍철",30,"프로그래밍");
System.out.println(user.name);
}
}