16일차_생성자

JavaSE 2015. 6. 21. 07:15

-------------------------------------------
생성자 (Constructor)

1. 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드이다.

인스턴스 생성 기본 형식

클래스이름 변수 = new 클래스이름();

new는 인스턴스 생성 명령이고, 클래스이름()은 생성자 호출 명령이다.
-> 모든 클래스는 내부적으로 생성자가 필수 조건이다.

 

2. 인스턴스 변수의 초기화 작업에 주로 사용된다. 멤버변수는 자동 초기화가 지원되므로 생성자가 없어도 초기화 할 수 있다.

 

3. 기본형식

public 클래스이름() {
}

public 클래스이름(매개변수) {
 this.멤버변수 = 매개변수;
}

 

4. 매개변수가 없는 생성자를 기본생성자라고 하고, 생성자가 전혀 없는 클래스인 경우에만 컴파일 과정에서 기본생성자는 자동 생성된다.
매개변수가 있는 생성자를 만드는 경우는 반드시 기본 생성자가 같이 존재해야 합니다. 기본 생성자가 컴파일 과정에서 자동 생성되지 않기 때문이다.


5. 생성자가 두 개 이상을 정의하는 것을 생성자 오버로딩(overloading)이라고 한다. 오버로딩 상태는 메소드 시그니처(signature)가 다른 상태를 뜻한다. 시그니처는 매개변수 구성을 뜻한다. 매개변수 구성은 매개변수 자료형, 개수, 순서에만 영향을 받는다.

 


//Sample82.java
package com.test;

public class Sample82 {

 //생성자가 없는 클래스 작성
 //(-> 내부적으로 기본생성자-매개변수가 없는 생성자- 자동 생성)
 /*
 public Sample82() {
 }
 */
 
 //멤버변수(자동 초기화 지원)
 private int a;
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 

//Main82.java
package com.test;

public class Main82 {

 public static void main(String[] args) {

  //객체 생성(new) 및 생성자 호출(Sample82())
  Sample82 sample = new Sample82();
  
  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 내부적으로 자동 초기화 실행
  System.out.println(sample.getA()); //0
  //System.out.println(sample.a); //X
  
 }

}

 

 

//Sample83.java
package com.test;

public class Sample83 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;

 //기본생성자가 있는 클래스 작성
 //인스턴스 멤버변수에 대한 초기화 지원
 //객체 생성시 자동 호출 및 실행
 public Sample83() {
  this.a = 10;
 }
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 


//Main83.java
package com.test;

public class Main83 {

 public static void main(String[] args) {
  
  //객체 생성(new) 및 생성자 호출(Sample83())
  //생성자에 의한 멤버변수 초기화 과정 실행
  Sample83 sample = new Sample83();

  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 내부적으로 자동 초기화 실행
  System.out.println(sample.getA()); //10
  
 }

}

 

 


//Sample84.java
package com.test;

public class Sample84 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;

 //매개변수가 있는 생성자가 있는 클래스 작성
 //인스턴스 멤버변수에 대한 초기화 지원
 //객체 생성시 자동 호출 및 실행
 //외부에서 전달된 값을 가지고 멤버변수 초기화
 //주의)매개변수가 있는 생성자 작성시 기본생성자 같이 작성할 것
 public Sample84() {
 }
 public Sample84(int a) {
  this.a = a;
 }
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 

 

//Main84.java
package com.test;

public class Main84 {

 public static void main(String[] args) {
  
  //객체 생성(new) 및 생성자 호출(Sample84())
  //매개변수가 있는 생성자에 의한 멤버변수 초기화 과정 실행
  //멤버변수 초기화에 사용될 데이터 전달
  Sample84 sample = new Sample84(20);
  
  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 외부에서 전달된 값으로 초기화
  System.out.println(sample.getA()); //20

 }

}

 

 


//Sample85.java
package com.test;

public class Sample85 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;
 private int b;

 //생성자 오버로딩
 //생성자가 두 개 이상 정의된 상태
 //->매개변수 구성(자료형, 갯수, 순서)이 다른 경우만 인정
 public Sample85() {
 }
 public Sample85(int a) {
  this.a = a;
 }
 public Sample85(int a, int b) {
  this.a = a;
  this.b = b;
 }

 //매개변수 구성이 같은 경우는 오버로딩이 되지 않는다.
 /*
 public Sample85(int b) {
  this.b = b;
 }
 public Sample85(int b, int a) {
  this.b = b;
  this.a = a;
 }
 */
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 public int getB() {
  return this.b;
 }
 
}

 

 

//Main85.java
package com.test;

public class Main85 {

 public static void main(String[] args) {

  Sample85 sample1 = new Sample85();
  System.out.printf("a:%d, b:%d %n"
    ,sample1.getA(), sample1.getB()); //0, 0
  
  Sample85 sample2 = new Sample85(10);
  System.out.printf("a:%d, b:%d %n"
    ,sample2.getA(), sample2.getB()); //10, 0
  
  Sample85 sample3 = new Sample85(20, 30);
  System.out.printf("a:%d, b:%d %n"
    ,sample3.getA(), sample3.getB()); //20, 30
  

  //문제) 멤버변수 b만 20으로 초기화하려면
  //생성자 호출 과정?
  Sample85 sample4 = new Sample85(0, 20);
  System.out.printf("a:%d, b:%d %n"
    ,sample4.getA(), sample4.getB()); //0, 20
  

  
 }

}


--------------------------------------------------------

 

 

//Human.java
package com.test;

public class Human {
 
 private String gender;
 
 public Human() {
  //랜덤하게 남자 또는 여자가 발생하도록 하는 과정 추가 -> private 메소드 추가
  this.gender = "남자";
 }
 
 //객체 생성시 성별을 결정하는 요소(남, 여)를 받아주는
 //매개변수가 있는 생성자 준비
 public Human(String gender) {
  if (gender.equals("남자") || gender.equals("여자")) {
   this.gender = gender;
  } else {
   //랜덤하게 남자 또는 여자가 발생하도록 하는 과정 추가 -> private 메소드 추가
   this.gender = "여자"; 
  }
 }
 
 //Human 클래스의 객체가 생성된 후에
 //getGenger() 요청시 null 값이 아닌
 //"남자" 또는 "여자"가 반환되도록 한다.
 public String getGender() {
  return this.gender;
 }

}

 

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Human human1 = new Human();
  System.out.println(human1.getGender()); //남자
  
  Human human2 = new Human("로봇");
  System.out.println(human2.getGender()); //여자
  
  Human human3 = new Human("남자");
  System.out.println(human3.getGender()); //남자
  
  Human human4 = new Human("여자");
  System.out.println(human4.getGender()); //여자

 }

}

 


//Calculator.java
package com.test;

public class Calculator {
 
 private int op1;
 private int op2;

 //생성자 오버로딩
 public Calculator() {
  this.op1 = 0;
  this.op2 = 0;
 }
 public Calculator(int op1, int op2) {
  this.op1 = op1;
  this.op2 = op2;
 }
 
 //메소드 오버로딩
 public int add() {
  int result = 0;
  result = this.op1 + this.op2;
  return result;
 }
 public int add(int op1, int op2) {
  int result = 0;
  result = op1 + op2;
  return result;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //기본 생성자 호출
  Calculator cal1 = new Calculator();
  System.out.println(cal1.add()); //0
  
  //오버로딩 생성자 호출
  Calculator cal2 = new Calculator(10, 20);
  System.out.println(cal2.add()); //30
  
  //오버로딩 메소드 호출
  Calculator cal3 = new Calculator();
  System.out.println(cal3.add(30, 40)); //70

 }

}

 

 


도형(Figure) 클래스를 만들고, 원, 삼각형, 사각형 객체를 적용할 수 있도록 만든다.
 각각의 도형마다 면적을 계산할 수 있는 메소드를 추가한다.
원의 면적 - 반지름*반지름*3.14
삼각형의 면적 - (밑변*높이)/2
사각형의 면적 - 가로*세로

//Circle.java
package com.test;

//원 도형 클래스
public class Circle {
 
 //반지름
 private int radius;
 
 public Circle() {
  this.radius = 1;
 }
 
 public Circle(int radius) {
  this.radius = radius;
 }
 
 public double area() {
  return radius*radius*3.14;
 }

}

 


//Triangle.java
package com.test;

//삼각형 도형 클래스  
public class Triangle {
 
 private int baseLine;
 private int height;
 
 public Triangle() {
  this.baseLine = 1;
  this.height = 1;
 }
 
 public Triangle(int baseLine, int height) {
  this.baseLine = baseLine;
  this.height = height;
 }
 
 public double area() {
  return (baseLine*height)/2.0;
 }

}

 


//Figure.java
package com.test;

//도형 클래스(원, 삼각형, 사각형)
public class Figure {
 
 private Object figure;
 
 public Figure() {
 }
 
 public Figure(Object figure) {
  this.figure = figure;
 }

 public Object getFigure() {
  return figure;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Figure figure1 = new Figure(new Circle()); //원 객체
  
  System.out.println(figure1.getFigure());  //Circle 객체의 해쉬코드
  
  System.out.println(((Circle)figure1.getFigure()).area());  //3.14
  
  Figure figure2 = new Figure(new Circle(10)); //원 객체
  
  System.out.println(((Circle)figure2.getFigure()).area());  //3.14
  
  Figure figure3 = new Figure(new Triangle(20,10)); //삼각형 객체
  
  System.out.println(((Triangle)figure3.getFigure()).area());
  

  //문제)
  //사각형 객체-> Figure 객체에 저장
  //사각형의 면적을 얻는 과정 추가
  

  //문제)
  /*
  자료형1 a = new Figure();  //Figure, Object
  자료형2 b = figure1.getFigure(); //Object
  자료형3 c = (Circle)figure1.getFigure();  //Circle, Object
  자료형4 d = ((Circle)figure1.getFigure()).area();  //double, Double, Object
  자료형5 e = (Triangle)figure3.getFigure();
  자료형6 f = ((Triangle)figure3.getFigure()).area();
  */
  
 }

}

 

 

//Rectangle.java
package com.test;

//문제)
//사각형 도형 클래스 작성할 것.
public class Rectangle {
 
 //멤버변수 -> 높이, 너비
 
 //생성자 -> 기본생성자, 매개변수 있는 생성자
 
 //면적 계산용 메소드
 public int area() {
  //계산식
 }

}

 


//Rectangle.java
package com.test;

public class Rectangle {
 
 private int height, width;
 
 public Rectangle() {
 }
 
 public Rectangle(int height, int width) {
  this.height = height;
  this.width = width;
 }

 public double area() {
  return height * width;
 }
 
}

 

 

//MainFigure.java
package com.test;

public class MainFigure2 {

 public static void main(String[] args) {

  Figure[] array = new Figure[5];
  
  array[0] = new Figure(new Circle(10));
  array[1] = new Figure(new Triangle(10, 20));
  array[2] = new Figure(new Rectangle(20, 20));
  array[3] = new Figure(new Circle(20));
  array[4] = new Figure(new Triangle(20,20));
  
  /*
  for (Figure figure : array) {
   //figure.area(); //X
   System.out.println(figure.toString());
   Object obj = figure.getFigure();
   System.out.println(obj.toString());
   if (obj instanceof Circle) {
    Circle circle = (Circle)obj;
    System.out.println(circle.area());
   }
  }
  */
  
  for (Figure figure : array) {
   Object obj = figure.getFigure();     
   if (obj instanceof Circle) {
    System.out.printf("Circle Area : %.2f %n"
      , ((Circle)obj).area() );
   }
   if (obj instanceof Triangle) {
    System.out.printf("Triangle Area : %.2f %n"
      , ((Triangle)obj).area() );
   }
   if (obj instanceof Rectangle) {
    System.out.printf("Rectangle Area : %.2f %n"
      , ((Rectangle)obj).area() );
   }
  }
  
  
 }

}

 

 

 


6. 생성자 내에서 다른 생성자 호출시 this 키워드 사용. 생성자 호출 구문은 반드시 다른 구문보다 먼저 실행되어야 한다.
-> 생성자 오버로딩 상태인 경우 사용


메소드 내에서 다른 메소드 호출시 this 키워드 사용.
-> 인스턴스 메소드인 경우만 가능.


//Sample86.java
package com.test;

public class Sample86 {
 
 private int a, b;
 
 public Sample86() {
  //방법1
  this(10, 10);
  
  //방법2
  /*
  this.a = 10;
  this.b = 10;
  */
 }
 
 public Sample86(int a, int b) {
  this.a = a;
  this.b = b;
 }
 
 public int getA() {
  return this.a;
 }
 
 public int getB() {
  return this.b;
 }

}

 

 

//Main86.java
package com.test;

public class Main86 {

 public static void main(String[] args) {

  Sample86 sample1 = new Sample86();
  System.out.println(sample1.getA()); //10
  System.out.println(sample1.getB()); //10
  
  Sample86 sample2 = new Sample86(20, 20);
  System.out.println(sample2.getA()); //20
  System.out.println(sample2.getB()); //20
  
  
 }

}


-------------------------------------------
요약

1. 생성자
- 생성자  객체 생성시에 호출되는  메소드 이다.
문제) 생성자의 기본 특징 나열할 것
-
-
-
-
-

2. 기본 형식
기본 생성자, 매개변수가 있는 생성자

3. 매개변수가 있는 생성자는 외부에서 전달된 값으로 멤버변수를 초기화할 때 사용.

4. this 키워드 생성자 호출시 사용 가능.
-> 생성자 오버로딩 상태인 경우

 

----------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JavaSE' 카테고리의 다른 글

18일차_상속  (0) 2015.06.21
17일차_멤버변수  (0) 2015.06.21
15일차_메소드  (0) 2015.06.21
14일차_메소드  (0) 2015.06.21
13일차_메소드  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,