[Java] 객체지향개념 3
요약 : 생성자와 변수의 초기화
생성자( constructor )
- 생성자의 이름은 해당 클래스의 이름과 같아야한다.
- 생성자 메서드는 리턴값이 없지만 void를 쓰지 않는다.
- 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
- 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메서드와 동일
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야한다. ( 생성자가 2개이상일 때 모든 생성자의 이름이 같으므로 오버로딩의 규칙을 따라야한다. )
- 클래스에 생성자가 없을경우 컴파일러가 기본 생성자를 추가한다.
- 생성자 메서드의 파라미터가 없으면 인스턴스호출시 클래스에도 파라미터가 없어야한다.
- 아니면 둘다있거나.
인스턴스 생성과정
- 연산자 new에 의해서 heap에 해당클래스의 인스턴스가 생성된다.
- 클래스의 생성자가 호출되어 수행된다.
- 연산자 new의 결과로, 생성된 해당클래스의 인스턴스의 주소가 반환되어 참조변수에 저장된다.
생성자에서 다른 생성자 호출하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package test; class Developer { String main_language; String name; int age; Developer(){ // 생성자에서 다른 생성자를 호출 할 수 있다. this ( "php", "jaewon", 27 ); main_language = "javascript"; // 이렇게하면 아래 this로 생성자 호출에서 다시 초기화되기 때문에 this를 가장 위에 선언해야한다. } Developer( String main_language, String name, int age ) { // 인스턴스변수와 지역변수의 이름이 같으므로 // this를 사용해서 인스턴스를 명시해주고 지역변수를 동일이름으로 사용하면 명확하다. this.main_language = main_language; this.name = name; this.age = age; } // 매개변수로 인스턴스를 받아서 초기화를 선언할 수 도 있다. Developer( Developer d ){ this.main_language = d.main_language; this.name = d.name; this.age = d.age; // 혹은 this ( d.main_language, d.name, d.age ); 로도 가능하다 } } public class JavaStudy{ public static void main ( String args[] ) {; Developer someone = new Developer(); Developer jaewon = new Developer( "JAVA", "JAEWON", 30 ); Developer joowon = new Developer( jaewon ); System.out.println( jaewon.main_language ); } } |
변수의 초기화
- 멤버변수( 인스턴스변수, 스태틱변수)와 배열은 자동초기화 되므로 초기화 생략가능
- 지역변수는 초기화하지 않으면 컴파일 에러가난다.
같은 타입의 변수는 다음과 같이 초기화가 가능하다.
1 |
int age, birth, tall; |
멤버변수의 초기화
명시적 초기화
- 클래스내에서 인스턴스변수에 명시적으로 값 할당.
생성자
- 클래스의 생성자함수로 인스턴스변수에 값 할당.
초기화 블럭
- 클래스 초기화 블럭 – 클래스변수의 복잡한 초기화에 사용되며 클래스 로딩될 때 단한번 실행됨
- 인스턴스 초기화 블럭 – 생성자에서 공통적으로 수행되는 작업에사용, 인스턴스가 생성될 때 마다(생성자보다 먼저) 실행된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Developer { // 명시적 초기화가 되어있지만 배열에 원하는 값이 할당되어 있지않음. // 이럴경우 클래스 초기화 블럭에서 아래처럼 처리가능 static int arr[] = new int[10]; // 클래스 초기화 블럭 static { String a = "에이"; for( int i=0; i<arr.length; i++ ){ arr[i] = ( int )( Math.random() * 10 ) + 1; } } static int count = 0; // 인스턴스 초기화 블럭 { String a = "에이"; ++count; // 명시적 선언된 클래스변수의 초기화 } } |
여러개의 생성자가 있을경우 의미상 어떤 생성자로 인스턴스가 생성되던간에 공통적으로 처리되야 하는 경우에 사용된다.
좀 헷갈리네 ㅡ.ㅡ;;