ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 생성자
    자바 2024. 8. 14. 10:08

    대부분 객체 지향 언어에서는 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있도록 생성자 기능을 제공한다. 생성자를 사용하면 객체를 생성하는 시점에 필요한 기능을 수행할 수 있다.

     

     

    생성자의 장점

    1) 중복 호출 제거

    2) 필수값 입력 보장

     

     

    package construct;
    
    public class MemberInit {
        String name;
        int age;
        int grade;
    }
    package construct;
    
    public class MethodInitMain1 {
        public static void main(String[] args) {
            
            MemberInit member1 = new MemberInit();
            member1.name = "user1";
            member1.age = 15;
            member1.grade = 90;
            
            MemberInit member2 = new MemberInit();
            member2.name = "user2";
            member2.age = 16;
            member2.grade = 80;
            
            MemberInit[] members = {member1, member2};
            for (MemberInit s : members) {
                System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
            }
        }
    }

     

     

     

    package construct;
    
    public class MemberConstruct {
        String name;
        int age;
        int grade;
        
        // 생성자 추가
        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;
        }
    }
    package construct;
    
    public class ConstructMain1 {
        public static void main(String[] args) {
        
            // 인스턴스를 생성하고 즉시 해당 생성자를 호출
            // initMember(...) 메서드를 사용해서 반복 제거
            MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
            MemberConstruct member2 = new MemberConstruct("user2", 16, 80);
        
            MemberConstruct[] members = {member1, member2};
        
            for (MemberConstruct s : members) {
                System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
            }
        }
    }

     

     

    This
    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;
    }

    메서드의 매개변수에 정의한 String name 과 Member 의 멤 버 변수의 이름이 String name 으로 둘다 똑같다.

    > 멤버 변수와 메서드의 매개변수의 이름이 같은 경우

     

     

    this.name = name; //1. 오른쪽의 name은 매개변수에 접근
    this.name = "user"; //2. name 매개변수의 값 사용
    x001.name = "user"; //3. this.은 인스턴스 자신의 참조값을 뜻함, 따라서 인스턴스의 멤버 변수에 접
    근

    - 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다.

    - 멤버 변수에 접근하려면 앞에 this. 이라고 해주면 된다.

    - this 는 인스턴스 자신의 참조 값을 가리킨다.

     

     

    생성자 - 오버로딩과 this()
    package construct;
    
    public class MemberConstruct {
        String name;
        int age;
        int grade;
     
        //추가, this. 부분 중복
        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;
        }
    }
    package construct;
    
    public class ConstructMain2 {
        public static void main(String[] args) {
        
            MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
            // 추가
            MemberConstruct member2 = new MemberConstruct("user2", 16);
        
            MemberConstruct[] members = {member1, member2};
        
            for (MemberConstruct s : members) {
                System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
            }
        }
    }

    생성자를 오버로딩 한 덕분에 성적 입력이 꼭 필요한 경우에는 grade 가 있는 생성자를 호출하면 되고, 그렇지 않은 경 우에는 grade 가 없는 생성자를 호출하면 된다.

     

     

    this.name = name;
    this.age = age;

    두 개의 생성자를 보면 해당 부분이 중복되는 것을 알 수 있다.

    이때 this() 라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다.

     

     

    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() 는 생성자 코드의 첫줄에만 작성할 수 있다.

     

     

    생성자 VS 메서드

    - 생성자의 이름은 클래스 이름과 같아야 한다. 첫 글자도 대문자로 작성한다.

    - 생성자는 반환 타입이 없다.

     

     

    기본 생성자
    public class MemberInit {
        String name;
        int age;
        int grade;
        
        MemberInit() { //생성자 필요 }
    }
    
    public class MethodInitMain1 {
        public static void main(String[] args) {
            MemberInit member1 = new MemberInit();
            ...
        }
    }

    클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다. 단, 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.

    따라서 첫 번째 코드가 생성자 없이 작동할 수 있었던 것은 자바가 자동으로 기본 생성자를 만들어 준 것이다.

     

     

     

     


    (참고)

    김영한 실전자바 - 기본 (섹션4. 생성자) 

    728x90

    '자바' 카테고리의 다른 글

    [JAVA] equals() - 동일성과 동등성  (0) 2024.08.19
    [JAVA] Object 클래스  (0) 2024.08.19
    [JAVA] 예외처리  (0) 2023.05.07
    [JAVA] path 클래스  (0) 2023.05.06
    [JAVA] 파일 읽고쓰기, BufferedWriter 파라미터로 넘기기  (0) 2023.04.29
Designed by Tistory.