날아라쩡글이의 블로그입니다.

생성자 (constructor) 본문

중앙 HTA (2106기) story/java story

생성자 (constructor)

날아라쩡글이 2021. 9. 9. 21:07
반응형
  • 생성자는 메소드이다. 
  • 생성자는 클래스의 이름과 동일한 이름을 가진 메소드이다. 
  • 생성자 메소드는 반환타입이 없다
    public class Simple{
  •     void plus(int x , int y){...} //반환값이 없고, 매개변수 int x, int  y가 있는 맴버메소드 plus
  •      int getRandomNumber ( ) {..}  //반환값이 int인 매개변수가 없는 맴버메소드 getRandomNumber 
  •     Simple(){ }  Simple 생성자 메소드 
  • }

맴버메소드의 사용

  • Simple simple = new Simple(); //객체를 생성하고 주소값을 참조변수에 대입한다.
  • sample.plus(100,200);  //객체생성후 참조변수를 이용해서 실행시킬 수 있는 멤버메소드를 실행시킨다. 
  • sample.plus(200,300);
  • int value = sample.getRandomNumber();
  • 맴버메소드란 객체 생성후 접근 변수를 이용해서 실행한다. 

생성자 메소드의 사용

  • Simple simple = new Simple(); //new 키워드로 객체생성할 때만 실행시킬 수 있다. 
  • 객체가 생성되면 바로 실행되는 메소드 이다. 객체가 생성되는 순간에 실행되는 메소드이다. 
  • 참조변수로 실행시킬 수 없다. 
  • 반환타입이 따로 없다. 그렇기 때문에 객체가 new로 인해 생성이되면 바로 실행되며, 1번밖에 실행되지 않는 메소드이다. 
  • Sample() 키워드는 두가지 용도로 사용된다 (클래스명과 동일하게 사용이 되어야한다.)
    1.  객체생성에 사용할 클래스의 이름을 알아낼 수 있다. (제공한다.) ---> Sample()에서 클래스 name은 Sample이다. 많은 class가 있을 때 찾아가기 수월하다. 
    2. 객체 생성직후 실행할 생성자 메소드를 나타낸다. 객체가 생성되면 생성된 객체의 Sample()을 실행한다. 
  • 타 프로그래밍언어의 경우 Sample Sample = Sample :: new ;//객체를 만든다음 
  •                                   sample.init(); //생성직후 init를 실행해 
  • ----->자바의 경우 
  • Sample sample = new Sample()로 sample.init();의 코드를 사라지게 만들어 냈으며, 객체가 생성후 바로 생성직후 바로 시행 될 Sample()메소드가 실행하도록 작성하였다. 

생성자의 경우 (constructor)로 만들어내는 메소드가 아닌 만들어진 객체에 초기화를 진행하는 메소드이다. 바로 실행되는 메소드이다. 

생성자 메소드는 참조변수를 이용해서 실행할 수 없다

생성자메소드와 맴버메소드와의 차이 

  • 생성자 메소드는 클래스네임과 동일해야한다.
  • 반환타입이 없어야한다. 
  • new키워드로 객체 생성시 즉시 실행한다. 
  • 참조변수는 다시 실행하지 않는다. 
  • 객체생성 직 후 수행할 작업이 구현된 메소드이다. 
  • 실행 1번 후 종료된다. 여러번 시행할 필요가 없다
  • 멤버메소드는 객체 생성후 참조변수를 이용해서 여러번 실행한다. 
  • 멤버메소드는 객체가 제공하는 다양한 기능이 구현된 메소드이다. 
  • 생성자의 경우 생성자가 하나라도 정의되어 있지 않으면 컴파일러가 기본생성자 메소드를 자동으로 추가한다. 
  •  
    생성자는 new키워드에서만 실행한다. 
  • 생성자 메소드는 객체 생성 직후에 실행되는 메소드이다. 
    1. new Sample()를 호출해서 객체 생성할 때 생성자 메소드의 실행 시점
    2. Sample.class를 메모리의 설계도 영역에 로딩한다. 
    3. 설계도 영역에 로딩된 Sample.class로 heap영역에 객체를 생성한다. 
    4. 힙영역에 Sample객체가 생성된다.
    5. new키워드와 함께 사용된 Sample()생성자 메소드르 실행한다. 
    6. Sample()생성자 메소드의 수행문이 실행된다.
    7. 참조변수 sample에 힙영역에 생성된 Sample객체의 주소값이 저장된다.


생성자가 하나도 정의 되어 있지 않으면 소스(Student.java)를 컴파일해서 실행파일(Student.class)를 만들때 실행파일(Student.class) 기본생성자 메소드가 자동으로 추가된다. 

생성자의 메소드의 역활은 블록안에 있는 필드의 매개 변수를 초기화 하는 것이다. 

생성자의 중복 정의

  • 컴파일러가 자동으로 추가한 기본생성자 메소드 
  • public Student() {
  • }
  • 생성자 메소드도 메소드이기 때문에 중복으로 정의가 가능하다. 
  • overloding의 경우 매개변수의 타입이 다르면서, 갯수가 다르면 되기 때문에 
  • 매개변수를 추가해서 작성 할 예정이다. 
  • 생성자도 매개변수를 서로 다르게 중복정의를 할 수 있다
  • 생성자도 오버로딩이 가능하다. 매개변수 타입과 갯수가 다르게 정의한다. 
  • 이렇게 매개변수를 입력하게 될 경우, 매개변수가 있는 생성자 메소드를 만든 후 삭제를 하게 되면, 컴파일러에서 자동으로 기본생성자 메소드를 자동으로 생성하지 않는다. 
  • 그렇기 때문에 그냥 기본생성자를 생성한 후 입력하는 편이 오류를 낮출 수 있다.
  • 무조건 값을 받아야 할 경우에는 기본생성자를 추가하지 않아도 되지만 그래도 기본생성자를 만들고 나서 작성해주는 것이 좋다. 
  • public Student (String studDept, int studNo, String studName ){..}--->NO
  • public Student (Strind studDept, int studNo, String studName){..}--->NO
  • 생성자의 매개변수는 생성자의 메소드 내에 있는 this.라는 호출방식을 이용한다. 
  •  
    같은 이름으로 매개변수명을 쓰게 만들어 주는 것이 좋다. this가 구분짓게 만들어 준다
  • 생성자 메서드에서는 매개변수와 생성자 매개변수를 구분짓는 방법을 this로 구분짓게 만들어 준다. this는 생성된 자기자신의 주소값을 가지고 있는 참조 변수이다.
  • 매개변수와 맴버변수의 이름이 같아도 괜찮다. 
  • this의 경우 다른 용도로도 사용할 수 있는데, Window용 프로그램을 만들때 사용을 하지만 다른 용도로는 사용하지 않기 때문에 앞으로 생성자 메소드와 매개 변수를 구분지을 때 사용을 한다. 
  • 자기자신의 주소값을 다른 놈에게 전달시에 사용한다. 
  • 생성자 메서드에서 매개변수와 동일할 때 구분짓기 위해서 사용하는데, java에서는 확실하게 구분이 되어 있지만, 자바스크립트에서는 애매모호한 부분이 있다. 
  • getter ,setter메소드도 있지만 this는 생성된 객체 자기자신의 주소값을 가지고 있는 참조 변수 이다. 

이클립스 프로그램에서 ctrl + 마우스 우측을 클릭하면, view에 source ---->  Generate Constructor Using Feids 를 누르면 자동으로 'this. 매개변수 '가  추가될 수 있도록 만들어진다. 

Call By value /  Call By Reference 

  • 변수영역은 stack영역으로 선입선출의 형태로 가지고 있다. 맨아래에 처음 불러진 변수의 값이 있고, 순차적으로 쌓는 모양으로 된다. 
  • main메소드내에는 참조변수 2개와 일반 변수 1개가 있고, 객체 영역에 Sample객체를 이용하여 값을 변경했기 때문에 number에 있는 일반변수의 값이 Sample의 매개변수로 불러와져 매개변수 영역으로 올라갔다. 매개변수의 경우 일반 변수기 때문에 블록 내부에서 정의가 되어 실행 ++;이 끝나자 사라져 버렸다
  • 그래서 매개 변수가 사라졌고, 이후 Student의 값을 변경하는 메서드가 실행되어, Student의 객체내의 매개변수를 실행하였고, Student매개변수가 변수 영역에 생겨나고 주소값을 참조 하였다. 
  • 참조 변수를 만들어서 호출하면 참조값이 참조 변수내부에 들어가게 되고, change메소드가 실행되어 Student의 객체 원본의 내용에 영향이 가게된다. 
  • 즉, 기본자료형은 값을 복제해서 가져와서 전달하며, 참조한 주소값의 경우 복사본과 원본을 가져오기 때문에 원본이 바뀔 수도 있다는 점을 항상 유의 해야한다. 
  • 1. 메소드 실행시 기본자료형의 값은 값의 복사본이 전달되기 때문에 원본값이 변하지 않는다. 
  • 2. 참조자료형은 객체의 주소값이 전달되기 때문에 같은 객체를 참조하게 된다. 따라서, 원본값이 변경될 수 있다. 
  • Call By Value의 경우 값을 복사하고 전달하면서 메소드를 실행하나
  • Call By Reference 의 경우 주소값을 주면서 메소드를 실행하기 때문에 원본값이 변경될 수 있다는 점을 참고해야한다. 참조 변수에는 항상 주소값이 있다고 생각을 해야하며, 주소값을 획득한 순간 바로 그 객체를 바라보게 된다. 

 

반환타입이 있는 경우 System.out.println내부에서 출력이 가능하지만, void처럼 반환타입이 없는 경우 System.out.println이 될 수 없다. 그래서 .을 이용하여 출력하는 방법을 진행하면 된다. 

반응형

'중앙 HTA (2106기) story > java story' 카테고리의 다른 글

접근제한자 (modifier)  (0) 2021.09.13
Static , 정적메소드, 정적변수  (0) 2021.09.12
메소드  (0) 2021.09.08
객체 지향 언어  (0) 2021.09.06
배열  (0) 2021.09.03
Comments