Download presentation
Presentation is loading. Please wait.
1
Java의 정석 제 6 장 객체지향개념 I-3 Java 정석 2008. 6. 27 남궁성 강의
Chapter 6. 객체지향개념 I Java의 정석 제 6 장 객체지향개념 I-3 안녕하십니까? 자바의 정석의 저자 남궁성입니다. 지금부터 제6장 객체지향개념1-3에 대한 강의를 시작하겠습니다. 남궁성 강의
2
객체지향개념 I-1 객체지향개념 I-2 객체지향개념 I-3 Java 1. 객체지향언어란? 2. 클래스와 객체
의 정석 Chapter 6. 객체지향개념 I 1. 객체지향언어란? 객체지향개념 I-1 2. 클래스와 객체 3. 변수와 메서드 객체지향개념 I-2 4. 메서드 오버로딩 제6장 객체지향개념1의 세번째 강의입니다. 생성자와 변수의 초기화에 대해서 강의하겠습니다. 5. 생성자 객체지향개념 I-3 6. 변수의 초기화
3
Java 5. 생성자 6. 변수의 초기화 정석 5.1 생성자란? 5.2 생성자의 조건 5.3 기본 생성자
Chapter 6. 객체지향개념 I 5. 생성자 5.1 생성자란? 5.2 생성자의 조건 5.3 기본 생성자 5.4 매개변수가 있는 생성자 5.5 생성자에서 다른 생성자 호출하기 – this() 5.6 참조변수 this 5.7 생성자를 이용한 인스턴스의 복사 6. 변수의 초기화 다음과 같은 순서로 강의가 진행될 것인데요. 책의 목차와 좀 다릅니다... 책의 내용을 강의형식에 맞게 재구성하였습니다. 6.1 변수의 초기화 6.2 멤버변수의 초기화 6.3 초기화 블럭 6.4 멤버변수의 초기화 시기와 순서
4
Java 의 정석 Chapter 6. 객체지향개념 I 5. 생성자
5
Java 5.1 생성자(constructor)란? 정석 - 인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’
의 정석 Chapter 6. 객체지향개념 I 5.1 생성자(constructor)란? ▶ 생성자란? - 인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’ - 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용 - 몇가지 조건을 제외하고는 메서드와 같다. - 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다. * 인스턴스 초기화 – 인스턴스 변수에 적절한 값을 저장하는 것. 생성자는 인스턴스초기화 메서드입니다. 인스턴스가 생성될 때... 인스턴스를 초기화 하는 작업을 합니다. 꼭 인스턴스 초기화 작업만 해야하는 것은 아니고요. 초기회 이외에 다른 작업을 수행하는 코드를 넣어도 괜찮습니다. 인스턴스를 생성하면 인스턴스변수들이 만들어지잖아요? 이 인스턴스변수들에 적절한 값을 저장하는 것을 인스턴스 초기화 라고 합니다. 생성자는 근본적으로는 메서드와 같습니다. 몇가지 다른 점만 기억하시면 되고요. 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 합니다. 그런데 지금까지 생성자를 알지도 못했고 만들지도 않았는데도 별 문제가 없었습니다. 그 이유는 컴파일러가 자동적으로 생성자를 만들어 주었기 때문입니다. 클래스에 생성자가 하나도 없을 때 컴파일러는 자동적으로 기본생성자를 추가해줍니다. 이에 대해서는 잠시후에 자세히 알아볼 것입니다. 이 코드는 Card클래스의 인스턴스를 생성하는 것인데요. 이 코드가 수행될 때 처리되는 과정은 다음과 같습니다... 먼저 참조변수 c가 선언되고... 그 다음에 연산자 new에 의해서 Card인스턴스가 생성됩니다. 그리고 생성자 Card()가 호출되어 생성된 인스턴스의 초기화를 수행합니다. 이때 인스턴스의 생성이 생성자에 의한 것이 아니라 연산자 new에 의한 것이라는 것을 확인하세요. 생성자의 주 목적은 new연산자에 의해 생성된 인스턴스의 인스턴스변수에 적절한 값이 저장되도록 하는 것입니다. 마지막으로 연산자 new의 결과로.. 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장됩니다. 5 5
6
Java 5.2 생성자의 조건 정석 - 생성자의 이름은 클래스의 이름과 같아야 한다.
Chapter 6. 객체지향개념 I 5.2 생성자의 조건 ▶ 생성자의 조건 - 생성자의 이름은 클래스의 이름과 같아야 한다. - 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다.) 클래스이름(타입 변수명, 타입 변수명, ... ) { // 인스턴스 생성시 수행될 코드 // 주로 인스턴스 변수의 초기화 코드를 적는다. } class Card { ... } 생성자는 근본적으로 메서드와 같습니다. 앞서 설명했던 것 처럼 인스턴스 초기화 메서드입니다. 그러나 메서드라고 하지 않고 굳이 생성자라고 부르는 것은 다음과 같이 메서드와는 다른 특징을 갖고 있기 때문입니다. 먼저 생성자의 이름은 클래스의 이름과 반드시 같아야합니다. 두번째로 생성자는 항상 리턴값이 없습니다. 그렇다고 리턴값이 없음을 의미하는 void를 붙이지는 않습니다. 왜냐면... 모든 생성자는 항상 리턴값이 없기 때문에 굳이 리턴값이 없다고 표시할 필요가 없기 때문입니다. 매개변수를 선언하는 것이나 수행될 코드를 적는 것은 메서드와 똑같습니다. 생성자의 구현부에도 메서드처럼 return문을 사용할 수 있습니다. 아래에 두 개의 생성자가 선언된 Card클래스가 있습니다. 이처럼 하나의 클래스에 여러 개의 생성자를 선언할 수 있습니다. 생성자의 이름은 클래스이름과 같아서... 같은 클래스 내의 모든 생성자들은 이름이 같을 수 밖에 없습니다. 이것 역시 오버로딩입니다. 그래서 이처럼 하나의 클래스에 여러 개의 생성자를 정의해야하는 경우에는 오버로딩의 규칙을 따라야합니다. Card() { // 매개변수가 없는 생성자. // 인스턴스 초기화 작업 } Card(String kind, int number) { // 매개변수가 있는 생성자 // 인스턴스 초기화 작업 } 6 6
7
5.3 기본 생성자(default constructor)
Java 의 정석 Chapter 6. 객체지향개념 I 5.3 기본 생성자(default constructor) ▶ 기본 생성자란? - 매개변수가 없는 생성자 - 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다. (생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.) 클래스이름() { } Card() { } // 컴파일러에 의해 추가된 Card클래스의 기본 생성자. 내용이 없다. 기본 생성자는 클래스이름뒤에 괄호()만 붙인... 매개변수가 정의되지 않은 생성자를 말합니다. 인스턴스를 생성할 때 new연산자와 함께 생성자를 호출하도록 되어 있기 때문에... 모든 클래스는 반드시 하나 이상의 생성자가 있어야 합니다. 그렇지 않으면 인스턴스를 생성할 수 없겠죠... 그렇다고 해서... 인스턴스초기화 작업이 필요없는 클래스에 매번 아무런 내용도 없는 생성자를 추가해주는 것은 좀 불편합니다. 그래서 클래스에 생성자가 하나도 정의되지 않은 경우에는 컴파일러가 자동적으로 아무런 내용도 없는 기본생성자를 추가함으로써 모든 클래스에 반드시 하나 이상의 생성자가 있어야 한다는 원칙을 지킬 수 있게 도와줍니다. 이렇게 하면... 생성자가 하는 일은 없겠지만... 인스턴스를 생성하는데 아무런 문제가 없습니다. 그러나... 클래스에 정의된 생성자가 하나라도 있으면... 컴파일러는 기본생성자를 추가하지 않습니다. 그래서 클래스에 생성자를 정의할 때는 반드시... 내용이 없는 기본 생성자도 함께 정의해주는 것이 좋습니다. “모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.” 7 7
8
5.3 기본 생성자(default constructor)
Java 의 정석 Chapter 6. 객체지향개념 I 5.3 기본 생성자(default constructor) “모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.” 클래스 Data1과 Data2가 있는데요... Data1에는 생성자가 전혀 정의되어 있지않고... Data2에는 하나의 정수값을 매개변수로하는 생성자가 하나 정의되어 있습니다. ConstructorTest클래스의 main메서드에서 이 두 클래스의 인스턴스를 생성합니다. 이때 Data2인스턴스를 생성하는 라인에서 생성자 Data2()를 찾을 수 없다는 컴파일 에러가 발생합니다. 두 클래스 모두 기본 생성자를 정의하지 않았는데도... Data2인스턴스를 생성할때만 에러가 발생하는 이유는 뭘까요. 앞서 설명드린 것 과 같이... 생성자가 정의된 클래스에는 컴파일러가 기본생성자를 추가하지 않기 때문입니다. Data1클래스는 생성자가 하나도 없지만... 컴파일 하면 기본생성자가 자동적으로 추가됩니다. 그래서 인스턴스를 생성할 때 new Data1()과 같이 해도 생성자 Data1()이 있으니까... 에러가 발생하지 않습니다. 그러나 Data2클래스는 생성자가 있기 때문에 Data1클래스와 달리 컴파일러에 의해서 기본생성자가 추가되지 않습니다. 그래서 new Data2()와 같이 인스턴스를 생성하면 생성자 Data2()가 존재하지 않으므로 에러가 발생하는 것입니다. 에러가 발생하지 않게 하려면... Data2클래스에 기본생성자. Data2() {}를 추가로 정의하던가... 인스턴스를 생성할 때 매개변수가 있는 생성자만을 사용해야 합니다. new Data2();대신 new Data(10);과 같이 해야한다는 얘기죠. 8 8
9
Java 5.4 매개변수가 있는 생성자 정석 의 Chapter 6. 객체지향개념 I
5.4 매개변수가 있는 생성자 이와 같이 Car클래스를 정의하였을 때... 왼쪽의 코드와 같이 기본생성자를 이용해서 인스턴스를 생성한 다음에... 인스턴스 변수를 따로 일일이 초기화 해주는 것보다... 오른쪽과 같이 매개변수가 있는 생성자를 이용해서 인스턴스를 생성할 때 직관적으로 알기쉽게 초기화하는 것이 좋습니다. 여러 개의 Car인스턴스를 만든다고 할 때 왼쪽의 코드는 오른쪽코드에 비해 훨씬 더 복잡해 질 것입니다. 그래서 클래스를 만드는 사람은 매개변수를 통해 인스턴스를 초기화 할 수 있는 생성자를 적절히 제공함으로써 클래스를 사용하는 쪽에서 간결한 코드를 작성할 수 있도록 지원하는 것이 바람직합니다. 왼쪽의 코드는 차를 인도받은 다음에 구입자가 직접 차의 색깔도 칠하고 기어종류도 바꾸고 하는 것과 같고요. 오른쪽의 코드는 처음에 차를 주문할 때부터 차의 색깔과 기어의 종류, 문의 개수를 지정하는 것과 같다고 할 수 있습니다. 9 9
10
5.5 생성자에서 다른 생성자 호출하기 – this()
Java 의 정석 Chapter 6. 객체지향개념 I 5.5 생성자에서 다른 생성자 호출하기 – this() ▶ this() – 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용 다른 생성자 호출은 생성자의 첫 문장에서만 가능 * 코드의 재사용성을 높인 코드 메서드 오버로딩에서 배운 것처럼... 메서드의 이름이 같으면... 코드는 달라도... 의미적으로는 같은 일을 합니다. 마찬가지로... 같은 클래스내의 생성자들은 모두 이름이 같고, 인스턴스의 초기화라는 공통적인 목적을 가지고 있습니다. 그래서... 생성자들을 잘 비교해보면 서로 호출을 통해서 재사용성을 높일 수 있는 경우가 많습니다. 여기서 Card클래스의 기본 생성자 Car()에서 각 인스턴스변수의 값을 white, auto, 4로 초기화 합니다. 차를 주문할 때 아무런 옵션도 주지 않으면 기본적으로 흰색에 자동변속기를 설치한 문 4개짜리 자동차를 만든다는 것이죠. 코드 자체에는 아무런 문제가 없지만... 이렇게 하는 것보다는 매개변수가 있는 생성자를 호출하도록 하는 것이 재사용성을 높이고... 코드의 중복을 제거하는 좋은 코드 입니다. 이처럼 오버로딩할 때는 서로 호출을 통해 재사용성을 높이고 코드의 중복을 제거할 수는 없는지... 고민해야합니다. 같은 클래스의 한 생성자에서 다른 생성자를 호출할 때는 클래스이름이 아닌 this를 사용해야 합니다. 그리고... 반드시 생성자의 첫 줄에 한번만 호출할 수 있습니다. 여기서는 두 번째 줄에서 다른 생성자를 호출했지만... 주석은 무시되므로 실제로는 첫 줄에서 호출한 것입니다. 한 생성자 내에서 초기화 작업을 수행한 다음에 다른 생성자를 호출하면... 다른 생성자에 의해서 전에 수행한 초기화 작업이 덮어써져 버릴 수 있기 때문에 생성자에서 다른 생성자를 호출할 때... 생성자의 첫줄에서만 호출할 수 있도록 하는 것입니다. 예를 들어 아래와 같은 코드가 가능하다면... 인스턴스변수 door의 값을 5로 초기화 하였는데... 다른 생성자에 의해서 door의 값이 4로 바뀔 것입니다. 그러면 인스턴스 변수 door에 5를 저장하는 코드는 의미가 없어지겠죠. 그래서 door에 5를 저장하는 코드가 다른 생성자를 호출하는 코드 다음에 가는 것이 맞습니다. 10 10
11
Java 5.6 참조변수 this 정석 ▶ this – 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음
Chapter 6. 객체지향개념 I 5.6 참조변수 this ▶ this – 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재 * 인스턴스변수와 지역변수를 구별하기 위해 참조변수 this사용 앞에서 배운 괄호가 붙은 this()는 생성자이고요.. 괄호가 없는 this는 인스턴스 자기 자신을 가리키는 참조변수 입니다. 인스턴스 자기자신을 가리키고 있다는 얘기는 인스턴스의 주소가 저장되어 있다는 것이고요. 이 참조변수 this는 모든 인스턴스 메서드에서 사용할 수 있습니다. main메서드와 같은 static메서드에서는 사용할 수 없고요.. 숨겨진 채로 존재한다는 것은 따로 정의하지는 않았지만... 그냥 사용할수 있다는 의미입니다. 여기서는 참조변수 this가 인스턴스변수와 지역변수를 구별하기 위해 사용되었습니다. 이처럼 인스턴스변수와 지역변수가 이름이 같을 때는 인스턴스변수 앞에 this.를 붙여야 서로 구분이 됩니다. 만약에 여기서 this를 붙이지 않는다면... 이름이 같기 때문에...둘 다 지역변수로 간주됩니다. 왼쪽 코드와 같이 인스턴스변수와 지역변수가 이름이 다르면... this를 사용하지 않고도 서로 구별이 되긴 하지만... 가능하면 오른쪽 코드와 같이 매개변수의 이름을 인스턴스변수의 이름과 같게 정의하고... this를 사용해서 구별하는 것이 코드의 의미가 더 명확해 집니다. 11 11
12
Java 5.7 생성자를 이용한 인스턴스의 복사 정석 – 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.
Chapter 6. 객체지향개념 I 5.7 생성자를 이용한 인스턴스의 복사 – 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다. – 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다. – 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다. 이번엔 생성자를 이용해서 인스턴스를 복사하는 방법에 대해서 알아보겠습니다. 인스턴스간의 차이라는 것은 인스턴스변수의 값에 의한 차이 밖에 없습니다. 클래스변수는 모든 인스턴스가 서로 공유하고, 메서드 역시 인스턴스마다 내용이 같으니까요. 그래서... 기존의 인스턴스와 같은 내용의 인스턴스를 복사해서 새로운 인스턴스를 만들려면.. 기존의 인스턴스의 인스턴스변수들의 값을 새로운 인스턴스의 인스턴스변수에 복사해주면 됩니다. 여기 보시면... 매개변수로 Car타입의 참조변수를 입력받는 생성자를 추가했습니다. 매개변수를 통해서 복사할 원본의 참조를 얻어오는 것이지요. 그 다음에... 참조변수c를 이용해서 원본의 인스턴스변수 값들을 읽어서 새로운 인스턴스의 인스턴스변수에 저장합니다. Car인스턴스를 생성하면... 먼저 인스턴스가 생성되고 각 인스턴스 변수는 기본값으로 자동초기화 됩니다. 그 다음에... 기본생성자가 호출되고... 기본생성자에서 세 개의 매개변수를 가진 생성자를 다시 호출합니다. 매개변수로 white, auto, 4가 각각 넘겨졌으니까... 인스턴스변수 color, gearType, door에는 white, auto, 4가 저장됩니다. 두번째로 Car인스턴스를 생성하면... 먼저 인스턴스가 생성되고... 좀전과 달리 Car타입의 참조변수를 매개변수로 선언한 생성자가 호출됩니다. 매개변수로 첫번째 인스턴스를 넘겨주고요. 이 생성자는 넘겨받은 참조변수가 가리키는 인스턴스의 인스턴스변수의 값을 새로생성된 인스턴스에 저장합니다. 그래서 인스턴스 c2에도 white, auto, 4가 각각 저장되어... 인스턴스 c1과 인스턴스 c2는 동일한 값을 저장하게 됩니다. 이 생성자를 좀더 개선하면... 이렇게 할 수 있습니다. 기존의 코드를 호출해서 재활용함으로써 코드의 중복을 제거하였습니다. 이와같은 방식으로 인스턴스를 복사하면... 기존의 인스턴스가 어떤 값을 가지고있는지 몰라도... 같은 상태의 인스턴스를 생성할 수 있습니다. 예를 들어 초기화작업이 복잡한 인스턴스를 여러 개 생성해야하는 경우... 하나의 인스턴스만 복잡한 초기화작업을 거치도록 생성한 다음에... 그 다음부터는 생성된 인스턴스를 이와 같은 방식으로 복사해서 새로운 인스턴스들을 만들면 코드의 효율이 좋아질 것입니다. 또 다른 예로는... 인스턴스를 가지고 작업을 하기 전 상태를 복사 해놨다가... 작업도중에 문제가 생겼을 때 인스턴스를 원래의 상태로 되돌린다던가 하는 경우에 사용할 수 있을 것입니다. Java API에 있는 많은 클래스들이 이처럼 인스턴스의 복사를 위한 생성자를 정의하고 있으며 이 예제가 이를 이해하는데 도움이 되길 바랍니다. 12 12
13
Java 의 정석 Chapter 6. 객체지향개념 I 6. 변수의 초기화 13
14
Java 6.1 변수의 초기화 정석 - 변수를 선언하고 처음으로 값을 저장하는 것
Chapter 6. 객체지향개념 I 6.1 변수의 초기화 - 변수를 선언하고 처음으로 값을 저장하는 것 - 멤버변수(인스턴스변수,클래스변수)와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략할 수 있다. - 지역변수는 사용전에 꼭!!! 초기화를 해주어야한다. 변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 합니다. 우리가 파일을 삭제해도 파일이 점유하고 있던 저장공간을 지우는 것이 아니라... 다른 파일에 의해서 덮어써지는 것이라는 것을 알고 계실겁니다. 마찬가지로 변수를 선언해서 저장공간이 마련되었을 때... 전에 사용되던 공간을 재활용하는 것일 수 있기기 때문에... 그 저장공간에는 이미 어떠한 값이 저장되어있을 가능성이 높습니다. 이 값을 쓰레기값이라고도 하는데요. 그래서... 변수를 선언한 다음에는... 변수를 적절한 값으로 초기화를 해주는 것이 필요합니다. 그렇지 않으면 쓰레기값이 사용되어서 생각하지 못했던 엉뚱한 결과를 얻을 수 있겠죠. 클래스 변수와 new연산자를 통해서 생성되는... 인스턴스, 배열 은 각 타입의 기본값으로 자동초기화 됩니다. 그래서 초기화를 생략할 수 있지만... 지역변수는 자동초기화가 되지 않기 때문에... 반드시 초기화를 해주어야 합니다. 각 타입의 기본값은 앞에서 이미 배웠지만... 다시한번 확인해보세요. x와 y는 인스턴스 변수라서... int의 기본값이 0으로 자동초기화 됩니다. 그래서 초기화를 하지 않고도 이처럼... 바로 사용할 수 있고요. i와 j는 메서드안에 선언되었으므로 지역변수입니다. 지역변수는... 자동초기화가 되지 않기 때문에... 사용하기 전에 반드시 초기화를 해주어야 합니다. 그렇지 않으면... 컴파일 에러가 발생합니다. 에러가 발생하지 않게 하려면... 변수 i가 사용되기 전에 이렇게... 값을 저장해서... 쓰레기 값이 아닌 값으로 초기화를 해주어야 합니다. 사실은 이러한 제약... 지역변수는 반드시 초기화를 해주어야 한다는 제약...은 없어도 되는 것이기도 하지만... 개발자의 실수를 줄여주기 위해서 만들어진 것입니다. 14 14
15
Java 6.1 변수의 초기화 – 예시(examples) 정석 의 Chapter 6. 객체지향개념 I
6.1 변수의 초기화 – 예시(examples) 변수의 선언과 초기화의 예를 몇가지 살펴보겠습니다. 클래스 영역에 선언되는 멤버들... 메서드나 멤버변수들은... 클래스 내에서 선언순서에 관계 없습니다. 보통 멤버변수를 모아서 앞부분에 선언하고... 그 아래에 메서드들을 선언하곤 하는데요... 그러나 이처럼... 변수들끼리 서로 참조하는 경우에는... 15 15
16
Java 6.2 멤버변수의 초기화 정석 1. 명시적 초기화(explicit initialization)
Chapter 6. 객체지향개념 I 6.2 멤버변수의 초기화 ▶ 멤버변수의 초기화 방법 1. 명시적 초기화(explicit initialization) 2. 생성자(constructor) 지역변수와는 달리 클래스변수와 인스턴스변수는... 변수가 만들어진 후에 바로 사용할 수 있는 상태가 되어 있어야 하기 때문에... 변수의 생성과 동시에 적절한 초기화가 뒤따라야 합니다. 앞서 살펴본 것과 같이... 자동차를 주문한 다음에 차의 속성을 바꾸는 것보다... 자동차가 만들어졌을 때 이미 적절하게 초기화되어 있는 것이 더 좋겠죠. 그래서 초기화가 필요한 겁니다. 멤버변수의 초기화에는 모두 3가지 방법이 있는데요. 명시적 초기화, 생성자, 초기화 블럭이 있습니다. 명시적 초기화는 간단합니다. 이처럼 변수의 선언과 동시에 초기화를 해주는 것을 말하고요. 생성자는 인스턴스변수의 초기화에 사용된다는거 이미 배웠고요. 마지막으로 초기화 블럭이 있는데... 초기화 블럭에는 인스턴스초기화 블럭과 클래스 초기화 블럭 두가지가 있습니다. 명시적 초기화와 생성자에 대해서는 이미 배웠으므로... 초기화 블럭에 대해서 좀더 자세히 알아보겠습니다. 3. 초기화 블럭(initialization block) - 인스턴스 초기화 블럭 : { } - 클래스 초기화 블럭 : static { } 16 16
17
6.3 초기화 블럭(initialization block)
Java 의 정석 Chapter 6. 객체지향개념 I 6.3 초기화 블럭(initialization block) ▶ 클래스 초기화 블럭 – 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다. ▶ 인스턴스 초기화 블럭 – 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다 (생성자보다 먼저) 실행된다. 초기화 블럭은 명시적 초기화만으로 처리할 수 없는 복잡한 초기화에 사용됩니다. 초기화할 때는 항상 명시적 초기화가 1차적으로 고려되어야 하고, 명시적 초기화로 해결되지 않을 때 초기화 블럭을 사용해야 합니다. 클래스 초기화 블럭은 클래스변수의 복잡한 초기화에 사용됩니다. 클래스가 로딩되면 클래스변수가 만들어지고... 그 다음에 클래스 초기화 블럭이 자동적으로 호출되어 클래스변수에 대한 초기화를 수행합니다. 클래스 초기화 블럭은 클래스가 로딩될 때 단 한번만 실행됩니다. 인스턴스 초기화 블럭은 생성자 처럼... 인스턴스가 생성될 때 마다 자동적으로 호출됩니다. 인스턴스 초기화 블럭 다음에 생성자가 실행된다는 것... 실행순서를 잘기억해두시고요. 인스턴스변수의 복잡한 초기화는 생성자를 이용하면 되므로 사실 인스턴스 초기화 블럭은 거의 사용되지 않습니다. 그래서 인스턴스초기화 블럭은... 각 생성자에서 공통적으로 수행해야하는 작업을 따로 뽑아서 처리하는데 사용됩니다. 각 생성자에서 수행될 공통부분을 인스턴스 초기화블럭에 뽑아넣으면... 코드의 중복이 제거되니까요... 초기화 블럭은 내부적으로는 메서드로 처리됩니다. 자동적으로 호출되는 초기화 메서드죠. 생성자도 메서드인것 처럼요. 선언되는 영역도 메서드처럼 클래스 영역에 선언하고요. 인스턴스 초기화 블럭은 그냥 블럭{}을 만들고 그 안에 코드를 적기만 하면 됩니다. 클래스 초기화 블럭은 인스턴스초기화 블럭에 static만 붙이면 되고요. StaticBlockTest클래스에 클래스변수로 배열을 선언했습니다. 명시적초기화로 배열을 생성하기는 했지만... 배열에는 int의 기본값인 0으로만 자동초기화 되어 있겠죠. 그리고 클래스 초기화 블럭에서 반복문을 이용해서 이 배열에 1과 10사이의 임의의 값으로 초기화합니다. 이처럼... 명시적 초기화로는 해결할 수 없는 복잡한 초기화에 초기화 블럭을 사용하면 되는 겁니다. 17 17
18
InitTest it = new InitTest();
Java 의 정석 Chapter 6. 객체지향개념 I 6.4 멤버변수의 초기화 시기와 순서 ▶ 클래스변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 ▶ 인스턴스변수 초기화 시점 : 인스턴스가 생성될 때 마다 InitTest it = new InitTest(); 클래스 변수는 클래스가 처음 로딩될 때 단 한번 수행됩니다. 그리고 인스턴스 변수는 인스턴스가 생성될 대 마다 수행됩니다. InitTest라는 클래스가 이렇게 정의되어 있을 때, InitTest의 인스턴스를 생성하면... 인스턴스를 생성하기 위해서는 클래스정보가 필요하니까... 클래스가 메모리에 로딩됩니다. 이때... InitTest에 정의된 클래스변수 cv가 생성됩니다. 멤버변수는 자동초기화 되니까... cv에는 int의 기본값인 0으로 초기화 됩니다. 그 다음에... cv의 명시적 초기화가 수행되서 cv값은 1로 바뀌고요... 그 다음에... 클래스 초기화 블럭에 의해서 cv의 값은 2가 됩니다. 이제 로딩된 클래스 정보를 이용해서 인스턴스가 생성됩니다. 클래스에 정의된 인스턴스변수 iv가만들어지고... int의 기본값인 0으로 자동초기화 됩니다. 그 다음에 명시적 초기화에 의해서 1로 값이 바뀌고... 인스턴스 초기화 블럭에 의해서 2로 바뀝니다. 그 다음에 생성자가 수행되면서 인스턴스변수 iv의 값은 3이 됩니다. 항상 클래스 초기화가 인스턴스 초기화 보다 먼저 수행되고... 기본값, 간단한 초기화 , 복잡한 초기화... 의 순서로 초기화가 수행되고... 인스턴스 초기화의 마지막으로는 생성자가 호출된다는거... 잘 기억해주시기 바랍니다. 18 18
19
Java 의 정석 Chapter 6. 객체지향개념 I 6.4 멤버변수의 초기화 시기와 순서 * 플래시 동영상 : Initialization.exe 또는 Initialization.swf (java_jungsuk_src.zip의 flash폴더에 위치) 방금전에 살펴본 멤버변수의 초기화에 대한 예제를 플래시 동영상으로 만들었습니다. 멤버변수의 초기화를 단계별로 잘 살펴보시고... 그 과정과 순서를 다시 한번 잘 정리하시기 바랍니다. 19 19
20
Java 6.4 멤버변수의 초기화 시기와 순서 - 예제설명 정석 의 Chapter 6. 객체지향개념 I 0x100 count
6.4 멤버변수의 초기화 시기와 순서 - 예제설명 p1 serialNo 0x100 count p2 serialNo 0x200 p3 serialNo 0x300 이것은 책에 있는 예제인데요... Product클래스가 이와 같이 정의되어 있을 때... Product인스턴스를 생성하면... 먼저...Product클래스가 메모리에 로딩되면서 클래스변수인 count가 만들어지겠죠. count의 타입이 int니까 int의 기본값인 0으로 자동초기화되고요... 예제에서는 count의 명시적 초기화를 0으로 해주었지만... 자동초기화 되니까 안 써줘도 됩니다. 그 다음에 인스턴스가 생성되고... 인스턴스변수 serialNo가 0으로 자동초기화 됩니다. 그 다음에... 명시적초기화는 없으니까 넘어가고... 인스턴스 초기화 블럭이 수행됩니다. 클래스변수 count의 값을 1 증가시키니까... count의 값이 0에서 1로 바뀌고... count의 값을 serialNo에 저장합니다. 그래서 serialNo의 값이 1이 됩니다. 그 다음에 생성자가 수행될 차례인데... 수행할 내용이 없습니다. 사실 인스턴스 초기화 블럭의 코드는 생성자에 넣어도 상관없습니다. 그래도 생성자 대신 인스턴스 초기화 블럭을 사용한 이유는... 코드의 의미상... 모든 생성자에서 공통적으로 수행되어야할 내용이기 때문입니다. 즉, 어떤 생성자를 사용해서 인스턴스를 생성하더라도 수행되어야할 내용이라는 것이죠. Product인스턴스를 하나 더 생성하면... 이미 클래스정보는 메모리에 로딩되었기 때문에... 이번엔 클래스변수의 초기화는 수행되지 않고 새로 생성되는 인스턴스의 초기화만 수행됩니다. 클래스에 정의된 내용에 따라서 인스턴스를 생성하는데요... 먼저 인스턴스변수 serialNo가 만들어지고 serialNo의 타입인 0으로 자동초기화 됩니다. serialNo의 명시적초기화는 없으니까... 바로 인스턴스 초기화블럭이 수행됩니다. count의 값이 1증가해서 2가되고.... serialNo에는 count의 값인 2가 저장됩니다. 세번째 Product인스턴스를 생성하면... 똑같은 과정을 거쳐서... count의 값이 3이되고... serialNo의 값 역시 3이 됩니다. 20 20
21
감사합니다. http://www.javachobo.com Java 정석
의 정석 Chapter 6. 객체지향개념 I 감사합니다. 더 많은 동영상강좌를 아래의 사이트에서 구하실 수 있습니다. 이것으로 제 6장 객체지향개념1의 세번째 강의를 모두 마치겠습니다. 감사합니다. 이 동영상강좌는 비상업적 용도일 경우에 한해서 저자의 허가없이 배포하실 수 있습니다. 그러나 일부 무단전제 및 변경은 금지합니다. 관련문의 : 남궁성
Similar presentations