본문 바로가기

Java/Java_OOP 2(object_oriented Programming)

Java_OOP 2( object_oriented Programming ) 객체지향적 프로그래밍

반응형

1. 생성자(constructor)

  * 생성자 란 ?

   - 객체 생성될 때 자동으로 호출되는 함수(메서드)

   - 클래스명과 반드시 같아야 한다.  '클래스명' == '메소드명'

   - 리턴자료형을 사용 안해도 된다.

   - 오버로딩이 가능

   - 역할 : 필드 초기화

   - 매개변수가 없는 생성자를  '디폴트생성자' 라고 한다.

   - 상속 X

   - 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

   - 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용

   - 몇가지 조건을 제외하고는 메서드와 같다.

   - 모든 클래스에서는 반드시 하나 이상의 생성자가 있어야 한다.

     (지금까지 컴파일이 가능했던이유는 자동으로 컴파일러가 자동적으로 '디폴트생성자'를 생성했기 때문)

 

  * 생성자의 역할 : 객체생성 + 필드초기화(동시에)  -> 생성자

  * 생성자 선언 형식

   - 리턴자료형 X

   -  [접근지정자] [기타제어자] 생성자함수([매개변수]......) 

 

  * 인스턴스 생성과 순서

     Car c  =  new  Car();

   1) 연산자 new에 의해서 메모리가(heep)에  Car클레스의 인스턴스가 생성된다.

   2) 생성자 Car()가 호출되어 수행된다.

      - 이때 인스턴스에 생성이 생성자로 인한것이 아닌 new에 의한것이다. 

   3) 연산자 new의 결과로, 생성된 Car인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

     

  * 생성자의 조건

   - 생성자의 이름은 클래스의 이름과 같아야 한다.

   - 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다.)

   - 조건 방식 

클래스 이름(타입 변수명, 타입 변수명 ....){

// 인스턴스 생성시 수행될 코드

// 주로 인스턴스 변수의 초기화 코드를 적는다.

//return 문 사용할 수 있다.

}

 

   * 기본 생성자란?

     - 매개변수가 없는 생성자

     - 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

     - 생성자가 하나라도 있으면 컴파일러는 기본생성자를 추가하지 않는다.

     - 인스턴스를 생성 할 때 new 연산자와 함께 생성자를 호출하도록 되어있기 때문에
       "모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다. "

 

클래스이름(){ }

car(){ } 컴파일러에 의해 추가된 car클래스의 기본생성자. 내용 없다.

 

   

 

 this  ?

 - 클래스 자기 자신의 주소값을 갖는 [참조변수]

 - 3가지 용도

   1) 맴버를 가리킬 때의 this 

   2) 생성자에서 또 다른 생성자를 호출할 때의 this 

   3) 단독(리턴 값 , 매개변수 값)으로 사용될 때의 this

 

  * this()  - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

             - 다른 생성자 호출은 생성자의 첫 문자에서만 가능

             -  한 생성자내에서 초기화 작업을 수행한 다음에 다른 생성자를 호출하면 다른 생성자에 의해서

                전에 수행한 초기화 작업이 덮어써질수 있기 때문에 생성자에서 다음생성자를 호출할때 첫

                문장에서만 호출할수있도록 하는것이다.

 

() 가 붙은 this 는 생성자 

{} 가 없는 this 는 참조변수

 

  * 참조변수 this

   - 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.

   - 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

 

 

 

 

 

 * 생성자를 이용한 인스턴스 복사

  - 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.

  - 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들 값을 복사한다.

  - 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.  

 

 * 변수의 초기화

  - 변수를 선언하고 처음으로 값을 저장하는 것

  - 멤버변수(인스턴스변수, 클래스변수)와 배열은 각 타입의 기본값으로 자동 초기화되므로 초기화를 생략할 수 있다.

  - 지역변수는 사용전 꼭!! 초기화를 해주어야 한다.

각 타입의 기본 값

 

 

* 맴버변수의 초기화 방법 

 - 명시적 초기화(explicit initialization)  = 선언과 함께 초기화 하는것

 - 생성자(constructor)  =  인스턴스변수에 초기화

 - 초기화 블럭(initialization block) 

    =  인스턴스 초기화 블럭: { }       - 인스턴스변수의 복잡한 초기화에 사용

// 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다 (생성자 보다 먼저) 실행

 

    =  클래스 초기화 블럭 : static{ }   - 클래스변수의 복잡한 초기화에 사용

//  클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행  

 

  * 멤버변수의 초기화 시기와 순서

   - 클래스변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번   , 프로그램 시작

       기본값 -> 명시적초기화 -> 클래스 초기화 블럭

   - 인스턴스변수 초기화 시점 : 인스턴스가 생성될 때 마다 , 객체생성

       기본값 -> 명시적초기화 -> 인스턴스초기화 블럭 -> 생성자

 

ex) 프레임 count++

 

반응형