생성자

  • 객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(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

  1. 오버로딩 - 생성자도 메서드 오버로딩 처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
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
  1. 오버로딩과 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

  1. 오버로딩 - 생성자도 메서드 오버로딩 처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
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
  1. 오버로딩과 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

+ Recent posts