생성자
- 객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Construct)를 이용하면 된다.
- 제약을 걸어준다.
THIS → 나 자신의 객체 주소를 나타낸다.
public class MemberInit {
String name;
int age;
int grade;
// 추가
void initMember(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
- this 는 매개변수로 받는 name 인지 멤버 변수의 name 인지 구분해주기 위해 사용하고,
- this 가 붙은 변수는 멤버 변수임을 나타낸다.
- this 를 생략해도 되는 경우🔽
public class MemberThis {
String nameField; // 멤버변수
void initMember(String nameParameter) { // 매개변수
nameField = nameParameter;
}
}
// 멤버 변수와 매개 변수의 변수명이 다를때는 this 가 생략 가능하다.
생성자 - 도입
- 대부분의 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 편리하게 수행할 수 잇도록 생성자 기능을 제공한다.
- 객체를 생성하자마자 그 즉시 필요한 기능 수행
- 참조 타입 클래스의 객체를 생성시켜주는 것 → 내가 이해한 이론
- 생성자와 메서드의 차이점 및 생성자 특징
- 생성자 이름은 클래스 이름과 같아야 한다.
- 생성자는 반환 타입이 없다.
- 나머지는 메서드와 같다.
- 생성자가 있는 클래스는 객체 호출을 할 때에 바로 생성자가 호출 된다.
- 생성자를 사용한 기능은 무조건 초기값을 세팅하는 “제약” 조건이 성립 하게 된다.
생성자 장점
- 생성자가 없던 시전에는 어떤 작업을 수행하기 위해서 생성자 생성후 메서드를 한번더 호출 해야 했다. → 하지만 생성자 덕분에 객체 생성하면서 바로 필요한 작업을 하게 되어 코드를 간소화 시키고, 간결하게 작업처리가 가능해졌다.
// 생성자 등장 전
MemberInit member = new MEmberInit(); // 객체 생성
member.intitMemeber("user1", 15, 90); // 메서드 호출 (작업 실행)
// 생성자 등장 후
MemberConstruct member = new MemberConstruct("user1", 15, 90); // 객체 생성과 동시에 작업 실행
→ 이러한 장점이 있다.
- 생성자를 호출한다면 무조건 초기 값을 설정 해 주어야 하는 “제약” 조건이 생성되게 되어 → 개발자의 실수를 막아줄 수 있다.
기본 생성자
- 매개 변수가 없는 생성자
- 해당 클래스에 생성자가 하나도 없으면 자바 컴파일러가 자동으로 기본 생성자를 만들어 준다.
- 하지만 생성자가 하나라도 있으면 기본 생성자를 만들지 않는다.
기본 생성자를 자동으로 만들어주는 이유?
- 생성자의 속성 값 만 쓰고 기능이 필요 없을 때 개발자가 직접 생성자를 정의해주어야 하는 불편함이 있기 때문에 자동으로 생성해주고 사용 한다.
생성자 - 오버로딩과 THIS
- 오버로딩 - 생성자도 메서드 오버로딩 처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
→ 이렇게 작성하면 MemberConstruct 의 생성자가 2개가 된다.
MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)
→ 이렇게 오버로딩이 된다.
→ 오버로딩된 생성자를 각각 매개변수 타입에 맞게 인자를 전달 하면 알맞은 생성자를 호출 한다
public class ConstructMain2 {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
// System.out.println 이 있는 생성자를 호출 할테고
MemberConstruct member2 = new MemberConstruct("user2", 16);
// sout 이 없는 생성자를 호출 할 것이다.
MemberConstruct[] members = {member1, member2};
for (MemberConstruct s : members) {
System.out.println("이름 : " + s.name + ", 나이 : " + s.age + ", 성적 : " + s.grade);
}
}
}
→ 출력 해보면 다음과 같이 출력 된다
생성자 호출 name = user1, age = 15, grade = 90
이름 : user1, 나이 : 15, 성적 : 90
이름 : user2, 나이 : 16, 성적 : 50
- 오버로딩과 THIS 같이 사용하여 중복 제거
- this → 자신의 참조 값을 나타낸다. → 결국 나 자신을 호출 하는 것
- this( ) 의 규칙으로는 생성자 블럭 안에서 첫 줄에만 작성이 가능하다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
// 위의 코드를 보면 중복 되는 부분이 보인다.
// 중복된는 부분은 this 를 사용 하여 줄일 수 있는데
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this(name, age, 50);
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
// 이렇게 사용하면 this 가 다시한번 생성자를 호출 하고 인자를 넘기는데
// 이때에 인자 타입이 맞는 생성자를 호출 하게 된다.
이런 식으로 자기 자신을 this 로 호출 하여 간소화 시킬 수 있다.
생성자
- 객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Construct)를 이용하면 된다.
- 제약을 걸어준다.
THIS → 나 자신의 객체 주소를 나타낸다.
public class MemberInit {
String name;
int age;
int grade;
// 추가
void initMember(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
- this 는 매개변수로 받는 name 인지 멤버 변수의 name 인지 구분해주기 위해 사용하고,
- this 가 붙은 변수는 멤버 변수임을 나타낸다.
- this 를 생략해도 되는 경우🔽
public class MemberThis {
String nameField; // 멤버변수
void initMember(String nameParameter) { // 매개변수
nameField = nameParameter;
}
}
// 멤버 변수와 매개 변수의 변수명이 다를때는 this 가 생략 가능하다.
생성자 - 도입
- 대부분의 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 편리하게 수행할 수 잇도록 생성자 기능을 제공한다.
- 객체를 생성하자마자 그 즉시 필요한 기능 수행
- 참조 타입 클래스의 객체를 생성시켜주는 것 → 내가 이해한 이론
- 생성자와 메서드의 차이점 및 생성자 특징
- 생성자 이름은 클래스 이름과 같아야 한다.
- 생성자는 반환 타입이 없다.
- 나머지는 메서드와 같다.
- 생성자가 있는 클래스는 객체 호출을 할 때에 바로 생성자가 호출 된다.
- 생성자를 사용한 기능은 무조건 초기값을 세팅하는 “제약” 조건이 성립 하게 된다.
생성자 장점
- 생성자가 없던 시전에는 어떤 작업을 수행하기 위해서 생성자 생성후 메서드를 한번더 호출 해야 했다. → 하지만 생성자 덕분에 객체 생성하면서 바로 필요한 작업을 하게 되어 코드를 간소화 시키고, 간결하게 작업처리가 가능해졌다.
// 생성자 등장 전
MemberInit member = new MEmberInit(); // 객체 생성
member.intitMemeber("user1", 15, 90); // 메서드 호출 (작업 실행)
// 생성자 등장 후
MemberConstruct member = new MemberConstruct("user1", 15, 90); // 객체 생성과 동시에 작업 실행
→ 이러한 장점이 있다.
- 생성자를 호출한다면 무조건 초기 값을 설정 해 주어야 하는 “제약” 조건이 생성되게 되어 → 개발자의 실수를 막아줄 수 있다.
기본 생성자
- 매개 변수가 없는 생성자
- 해당 클래스에 생성자가 하나도 없으면 자바 컴파일러가 자동으로 기본 생성자를 만들어 준다.
- 하지만 생성자가 하나라도 있으면 기본 생성자를 만들지 않는다.
기본 생성자를 자동으로 만들어주는 이유?
- 생성자의 속성 값 만 쓰고 기능이 필요 없을 때 개발자가 직접 생성자를 정의해주어야 하는 불편함이 있기 때문에 자동으로 생성해주고 사용 한다.
생성자 - 오버로딩과 THIS
- 오버로딩 - 생성자도 메서드 오버로딩 처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
→ 이렇게 작성하면 MemberConstruct 의 생성자가 2개가 된다.
MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)
→ 이렇게 오버로딩이 된다.
→ 오버로딩된 생성자를 각각 매개변수 타입에 맞게 인자를 전달 하면 알맞은 생성자를 호출 한다
public class ConstructMain2 {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
// System.out.println 이 있는 생성자를 호출 할테고
MemberConstruct member2 = new MemberConstruct("user2", 16);
// sout 이 없는 생성자를 호출 할 것이다.
MemberConstruct[] members = {member1, member2};
for (MemberConstruct s : members) {
System.out.println("이름 : " + s.name + ", 나이 : " + s.age + ", 성적 : " + s.grade);
}
}
}
→ 출력 해보면 다음과 같이 출력 된다
생성자 호출 name = user1, age = 15, grade = 90
이름 : user1, 나이 : 15, 성적 : 90
이름 : user2, 나이 : 16, 성적 : 50
- 오버로딩과 THIS 같이 사용하여 중복 제거
- this → 자신의 참조 값을 나타낸다. → 결국 나 자신을 호출 하는 것
- this( ) 의 규칙으로는 생성자 블럭 안에서 첫 줄에만 작성이 가능하다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
// 위의 코드를 보면 중복 되는 부분이 보인다.
// 중복된는 부분은 this 를 사용 하여 줄일 수 있는데
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this(name, age, 50);
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name = " + name + ", age = " + age + ", grade = " + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
// 이렇게 사용하면 this 가 다시한번 생성자를 호출 하고 인자를 넘기는데
// 이때에 인자 타입이 맞는 생성자를 호출 하게 된다.
이런 식으로 자기 자신을 this 로 호출 하여 간소화 시킬 수 있다.
'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글
6. 접근 제어자 (0) | 2024.03.07 |
---|---|
5. 패키지 (0) | 2024.03.06 |
3. 객체 지향 프로그래밍 (0) | 2024.03.05 |
2. 기본형과 참조형 (0) | 2024.03.01 |
1. 클래스와 데이터 (0) | 2024.02.28 |