ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 생성자(Constructor) & Setter
    JAVA/컨셉 , 예제 2018. 8. 24. 13:42

    클래스의 객체는 다양한 멤버 필드를 갖고 있을 것이다. 학생의 경우를 예로 들면 이름, 나이, 대학교, 전공 등을 멤버 필드로 둘 수 있다.

    public class Student { private String name; private int age; private String uni; private String major; // 다른 클래스에서 private 멤버변수에 무분별한 접근 및 제어 // 방지하기 위해 setter 함수에 특정 조건을 걸도록 함. public void setName(String name){ if(name.length() == 3) this.name = name; } public void setAge(int age){ this.age = age; } public void setUni(String uni){ this.uni = uni; } public void setMajor(String major){ this.major = major; } public void study(){ System.out.printf("%s Studying %s now\n", this.name, this.major); } public void goToUni(){ System.out.printf("%s go to %s university\n", this.name, this.uni); } }

    Student 클래스 정의

    public class StudentMain { public static void main(String[] args) { // TODO Auto-generated method stub Student st = new Student(); st.setName("박민우"); // 이름이 3글자여서 갱신됨 st.setName("민우"); // 이름이 2글자여서 setter 조건 불만족해 갱신되지 않음 st.setUni("Soongsil"); st.study(); st.goToUni(); } }

    다음과 같이 Student 클래스를 정의하도록 한다.

    실행하면 결과는

    다음과 같이 잘 나온다. setter에 대해 배울 때 이클립스에서 편하게 생성을 할 수 있었다. 거기에는 

    public void setAge(int age){ this.age = age; }

    다음과 같은 식으로 멤버 변수의 값을 바로 제어해줬지만 실무에서는 

    public void setName(String name){ if(name.length() == 3) this.name = name; }

    다음과 같이 조건을 주는 경우가 많다고 한다. 클래스 외부에서 멤버변수에 대한 무분별한 제어를 어느정도 필터링 하는 역할을 한다고 볼 수 있다.
    객체를 선언하고 setter 함수를 사용해서 객체의 멤버 변수를 적절하게 바꿀 수 있지만 멤버 변수가 수십개에 이르는 경우가 많다. 이럴 때는 멤버들에 대해 하나하나 setter 메소드를 수행해야 할까? 상당히 불편한 반복작업이 될 것이다. 이를 해소해 주는 것이 생성자이다.

    생성자는 객체 생성시 무조건 호출되어야 하며, setter 함수를 통해 값을 제어하고 싶은 멤버 변수를 파라미터로 넣고, setter와 비슷한 방식으로 값을 제어해준다.

    ※ 생성자명 : public 클래스명(private params...)
    ※ 생성자는 객체 생성시 단 한번만 호출됨

    한번만 사용할 수 없을뿐더러 setter 함수를 통해 생성자의 역할을 대체 할수 있기 때문에 그 이상 사용할 필요도 없다고 할 수 있겠다.
    처음 객체 생성시 값을 설정해야 하는 이유는 멤버 변수에 쓰레기값 (null이나 0 등...)이 들어가는 것을 방지하기 위함이 아닐까 하는 생각을 했다. 값이 없는 객체에 대해 제어할 필요가 없기 때문에.

    public class Student { private String name; private int age; private String uni; private String major; public Student(String name, int age, String uni, String major){ this.name = name; this.age = age; this.uni = uni; this.major = major; } public void setName(String name){ // 다른 클래스에서 private 멤버변수 무분별한 접근 및 제어 if(name.length() == 3) // 방지하기 위해 특정 조건을 걸도록 함. this.name = name; } public void setAge(int age){ this.age = age; } public void setUni(String uni){ this.uni = uni; } public void setMajor(String major){ this.major = major; } public void study(){ System.out.printf("%s Studying %s now\n", this.name, this.major); } public void goToUni(){ System.out.printf("%s go to %s university\n", this.name, this.uni); } }

    Student 클래스에 생성자 포함

    public class StudentMain { public static void main(String[] args) { // TODO Auto-generated method stub Student st = new Student("박민우", 30, "SoongSil", "Computer Science"); st.study(); st.goToUni(); } }

    Student 클래스 객체 생성. 생성자 호출을 통해 멤버 변수 setter 함수 사용한 것과 같은 결과.

    결과가 잘 나오는 것을 확인할 수 있다.


Designed by Tistory.