Java - Construct

CYSSSSSSSSS·2024년 4월 22일
0

자바

목록 보기
21/26

Java

Construct

Construct?

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();

        //Setting
        member1.age = 15;
        member1.name = "user1";
        member1.grade = 90;
        MemberInit member2 = new MemberInit();

        //Setting
        member2.age = 12;
        member2.name = "user2";
        member2.grade = 92;

        // MemberInit Array
        MemberInit[] members = {member1 , member2};

        for(MemberInit member: members){
            System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
        }
    }
}
  • 회원 객체를 생성하고 나면 위에 예제 처럼 name,age,grade 같은 변수에 초기값을 설정한다.
  • 회원 객체를 제대로 사용하기 위해서는 객체를 생성하자마자 초기값을 설정해야한다.
  • 초기값이 반복되는 코드를 제거해야 좋다.
package construct;

public class MethodInitMain2 {
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();

        //Setting
        initMember(member1 , "user1" , 15,90);

        //Setting
        MemberInit member2 = new MemberInit();
        initMember(member2 , "user2" , 16,92);
        // MemberInit Array
        MemberInit[] members = {member1 , member2};

        for(MemberInit member: members){
            System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
        }
    }

    static void initMember(MemberInit member , String name , int age , int grade){
        member.name = name;
        member.age = age;
        member.grade = grade;
    }
}
  • 함수를 이용해서 불필요한 반복을 줄일수 있게 되었다.
  • 하지만 객체지향의 특성상 속성과 기능은 한 곳에 두는 것이 더 나은 방법이다.
  • 즉 클래스가 자기 자신의 데이터를 변경하는 기능인 메서드를 제공하는 것이 좋다.

this

  • 클래스에서 멤버 변수를 메서드를 활용하여 초기화 할때 멤버 변수와 매개변수의 변수명이 똑같아 구분을 하기 위한 용도로 사용한다.
  • 멤버 변수와 매개변수는 매개변수가 코드 블럭의 안쪽에 있기 때문에 매개변수가 우선순위를 갖게 된다.
package construct;

public class MemberInit {
    String name;
    int age;
    int grade;

    //static은 클래스에서는 절대 사용하지 말아야 한다.
    void initMember(String name , int age , int grade){
        this.name = name;   // this는 멤버 변수에 값을 넣을때 매개변수와 멤버 변수가 같을 경우 구분을 하기위한 용도로 사용한다.
        this.age = age;
        this.grade = grade;
    }
}
package construct;

public class MethodInitMain3 {
    public static void main(String[] args) {
        MemberInit member1 = new MemberInit();

        //Setting
        member1.initMember("user1" , 15,90);

        //Setting
        MemberInit member2 = new MemberInit();
        member2.initMember("user2" , 16,92);
        // MemberInit Array
        MemberInit[] members = {member1 , member2};

        for(MemberInit member: members){
            System.out.println("이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
        }
    }

}
  • initMember안에 있는 this는 인스턴스 자신의 참조값을 나타낸다.
  • this는 생략도 가능하다
  • this는 변수를 찾을때 지역변수(매개변수도 지역변수)를 먼저 찾고 그다음으로 멤버 변수를 찾는다.
package construct;

public class MemberThis {
    String nameField;

    void initMember(String nameParameter){
        nameField = nameParameter;  // 멤버 변수와 매개변수가 이름이 다를 경우에는 this를 생략해도 된다.
    }
}
  • nameParameter를 찾고 -> nameField를 찾는다.
  • this를 이처럼 쓸수도 있고 안쓸수도 있지만 멤버변수에 접근하는 경우에 항상 this를 쓰는 코딩 스타일도 있다.
package construct;

public class MemberThis {
    String nameField;

    void initMember(String nameParameter){
        this.nameField = nameParameter;  // 이름이 달라도 무조건 쓰는 경우가 있다..
    }
}
  • 무조건 this를 쓸경우 지역변수와 멤버변수를 구분을 잘 시켜줄 수 있다.

생성자

  • 객체를 생성하면 초기값을 할당해야하는 경우가 많기 때문에 앞서 만들었던 initMember같은 메서드가 매번 필요했다.
  • 대부분에 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있도록 생성자라는 기능을 제공한다.
  • 객체를 생성하는 시점에서 즉시 필요한 기능을 수행할 수 있다.
package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct(String name , int age , int grade){
        System.out.println("생성자 호출 = "+ name + ",age="+age + ",grade=" + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}
  • 생성자에는 3가지의 규칙이 있다.
  • 1.생성자의 이름은 클래스의 이름과 같아야 한다.
  • 2.생성자는 반환 타입입 없다. 항상 비워둬야 한다.
  • 3.위에 두가지 내용빼고는 매서드랑 모든 규칙을 동일시한다.
package construct;

public class ConstructMain1 {
    public static void main(String[] args) {
        // 선언을 할때 값을 넘겨 주면서 -> 객체를 불러라 + 생성자를 이용해 초기화까지 진행한다.
        MemberConstruct member1 = new MemberConstruct("user1" , 15 , 90);    // 선언과 동시에 멤버변수의 값을 넘겨줘서 값을 초기화 한다.
        MemberConstruct member2 = new MemberConstruct("user2" , 17 , 92);    // 선언과 동시에 멤버변수의 값을 넘겨줘서 값을 초기화 한다.

        MemberConstruct[] members = {member1 , member2};

        for(MemberConstruct member : members){
            System.out.println("사용자 이름: " + member.name + " 나이: " + member.age + " 성적: " + member.grade);
        }
    }
}
  • 객체를 선언하는 과정이 = 생성자 호출하는 과정이다.
  • 선언할때 멤버 변수 값을 넘겨줘야 한다.

생성자 장점

  • 생성자를 안만들었을때는 멤버변수 초기화 하는 부분을 메서드를 만들어서 객체를 선언한후 초기화하는 메서드를 한번더 불러야 한다.
  • 그러나 생성자는 선언과 초기화를 동시해 할수 있기 때문에 중복 호출을 줄여주는 장점이 있다.

제약 생성자 호출 필수

  • 만약 생성자를 만들어두고 인스턴스 선언시 객체를 넘겨주지 않을 경우에는 값이 존재하지 않기 때문에 숫자형 자료들은 0 / 문자형 자료형은 null 이런식으로 값이 넘어가기 때문에 프로그램 동작에는 이상이 없지만 시스템 상태에서는 큰 문제를 유발할 수 있다. 따라서 생성자에 반드시 값을 넘겨줘야 한다.
  • 그러나 생성자를 메서드 오버로딩 처럼 여러개 정의할 수 있는데 그 경우는 한가지만 사용하면 된다.
  • 반드시 호출해야 하는 생성자 때문에 시스템 상에서 문제되는 부분을 바로 발견하고 원천적으로 막을 수 있다.

기본 생성자

  • 매개변수가 없는 생성자를 기본 생성자라고 한다.
  • 자바 컴파일러는 생성자를 생성하지 않아도 기본 생성자를 자동으로 만들어준다.
  • 그러나 생성자를 개발자가 직접 정의를 할 경우 기본 생성자를 만들지 않는다.
package construct;

public class MemberDefault {
    String name;

    MemberDefault(){
        System.out.println("기본 생성자 호출");
    }
}

package construct;

public class MemberDefaultMain {
    public static void main(String[] args) {
        MemberDefault memberDefault = new MemberDefault(); // 정상적으로 실행
    }
}

생성자 오버로딩과 this

  • 생성자도 메서드 오버로딩 처럼 여러 가지 버전의 생성자를 만들 수 있다.
package construct;

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 + ",age="+age + ",grade=" + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}
  • 이름과 나이만 받는 생성자와 / 이름,나이,성적을 받는 생성자를 만들면서 생성자 오버로딩이 되는 과정이다.
  • 생성자를 만들때 중복되는 부분이 만들어 질때 this를 이용하여 중복을 단순화 시킬 수 있다.
package construct;

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 + ",age="+age + ",grade=" + grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}
  • 중복을 간편화 할때 해당 this는 무조건 첫번째 문장에 작성해야 한다.
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보