Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 무디스
- 다형성
- 기업분석
- 미국주식
- 자바
- 오버라이딩
- 배당성장
- mco
- 현금흐름표
- object
- 주린이
- 금리인하
- 접근제어자
- 인플레이션
- XLF
- etf
- 주식
- 프로그래머스
- 그리디 알고리즘
- javascript
- FCF
- 제태크
- Java
- StringBuffer
- S&P500
- 백준
- 잉여현금흐름
- 알고리즘
- 객체지향
- 금리인상
Archives
- Today
- Total
오늘의하루
[자바의 정석] 생성자 & 변수의 초기화 본문
생성자
생성자는 인스턴스가 생성될 때마다 호출되는 "인스턴스 초기화 메서드"이며 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
Card c = new Card();
1. 연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조 변수 c에 저장된다.
생성자의 조건
생성자의 이름은 클래스의 이름과 동일해야 하며 리턴 값이 없지만 void를 쓰지 않는다.
class Test{
...
Test() // 매개변수 없는 기본 생성자
{
// 인스턴스 초기화 작업
}
Test(String kind, int number) // 매개변수 있는 생성자
{
// 인스턴스 초기화 작업
}
}
기본 생성자(Default constructor)
매개변수가 없는 생성자를 의미하여 클래스에 생성자가 하나도 없다면 컴파일러가 기본 생성자를 추가해 준다.
- 생성자가 하나라도 있다면 컴파일러는 기본 생성자를 추가하지 않는다.
class Car{
String color;
String gearType;
int door;
Car(){} // 기본 생성자
Car(String c, String g, int d){ // 매개변수 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c1 = new Car(); // 생성자 Car() 호출
c1.color = "green";
c1.gearType = "auto";
c1.door = 3;
Car c2 = new Car("red", "auto", 4); // 생성자 Car(String c, String g, int d) 호출
this( ) - 생성자에서 다른 생성자 호출하기
같은 클래스의 다른 생성자를 호출할 때 사용하며 다른 생성자 호출은 생성자의 첫 문장에서만 사용 가능하다.
class Car{
String color;
String gearType;
int door;
Car(){ // 기본 생성자
this("white", "auto", 4);
}
Car(String c, String g, int d){ // 매개변수 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c1 = new Car();
/*
c1.color = "white"
c1.gearType = "auto"
c1.door = 4
*/
Car c2 = new Car("red", "auto", 5);
/*
c2.color = "red"
c2.gearType = "auto"
c2.door = 5
*/
참조 변수 this
인스턴스 자신을 가리키는 참조 변수이며 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
class Car{
String color;
String gearType;
int door;
Car(){
this("white", "auto", 4);
}
Car(String color, String gearType, int door){
this.color = color; // this.color는 Car에 있는 변수 color를 의미한다.
this.gearType = gearType; // this.gearType는 Car에 있는 변수 gearType를 의미한다.
this.door = door; // this.door는 Car에 있는 변수 door를 의미한다.
}
}
생성자를 이용한 인스턴스 복사
생성자에서 참조 변수를 매개변수로 받아서 인스턴스 변수들의 값을 복사한다.
- 똑같은 변수값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.
class Car{
String color;
String gearType;
int door;
Car(){ // 기본 생성자
this("white", "auto", 4);
}
Car(String color, String gearType, int door){ // 매개변수 있는 생성자
this.color = color;
this.gearType = gearType;
this.door = door;
}
Car(Car c){ // 인스턴스의 복사를 위한 생성자
color = c.color;
gearType = c.gearType;
door = c.door;
}
}
Car c1 = new Car();
/*
c1.color = "white"
c1.gearType = "auto"
c1.door = 4
*/
Car c2 = new Car("red", "auto", 5);
/*
c2.color = "red"
c2.gearType = "auto"
c2.door = 5
*/
Car c3 = new Car(c2); // 생성자로 인스턴스 복사
/*
c3.color = "red"
c3.gearType = "auto"
c3.door = 5
*/
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 말한다.
- 멤버 변수와 배열은 각 타입의 기본값으로 자동 초기화되므로 초기화를 생략할 수 있다.
- 지역 변수는 사용 전에 꼭 초기화를 해주어야 한다.
자료형 | 기본값 |
boolean | false |
char | '\u0000' = 공백(한칸) = ' ' |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d or 0.0 |
참조형 변수 | null |
class InitTest{
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method(){
int i; // 지역변수
int j = i; // Compile Error! 지역변수를 초기화하지 않고 사용했기 때문이다.
}
}
멤버 변수의 초기화
멤버 변수의 초기화 방법에 대해 알아보자
명시적 초기화(explicit initialization)
class Car{
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}
생성자(constructor)
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
초기화 블록(initialization block)
인스턴스 초기화 블록
- 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때마다 생성자보다 먼저 실행된다.
클래스 초기화 블록
- 클래스 변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다.
- 명시적 초기화 이후 진행된다.
class InitBlock{
static { /* 클래스 초기화 블럭 */ }
{ /* 인스턴스 초기화 블럭 */ }
}
// 예제
class StaticBlockTest{
static int[] arr = new int[10]; // 명시적 초기화
// 지금은 배열에 모두 기본값 0으로 들어가 있다.
static{ // 배열 arr을 1~10사이의 값으로 채운다.
for(int i = 0; i < arr.length; i++){
arr[i] = (int)(Math.random() * 10) + 1;
}
}
}
멤버 변수의 초기화 시기와 순서
- 클래스 변수 초기화 시점은 클래스가 처음 로딩될 때 단 한 번이다.
- 인스턴스 변수 초기화 시점은 인스턴스가 생성될 때 마다이다.
class InitTest{
static int cv = 1; // 명시적 초기화
int iv = 2; // 명시적 초기화
static {cv = 3;} // 클래스 초기화 블럭
{iv = 4;} // 인스턴스 초기화 블럭
InitTest(){iv = 5;} // 생성자
}
- 클래스 변수 cv 기본값 = 0
- 클래스 변수 cv 명시적 초기화 = 1
- 클래스 변수 cv 초기화 블록 = 3
- 인스턴스 변수 iv 기본값 = 0
- 인스턴스 변수 iv 명시적 초기화 = 2
- 인스턴스 변수 iv 초기화 블록 = 4
- 인스턴스 변수 iv 생성자 = 5
- 최종적으로 클래스 변수 cv = 3, 인스턴스 변수 iv = 5 가 된다.
멤버 변수의 초기화 시기와 순서 예제
class Product{
static int count = 0; // 클래스 변수
int serialNo; // 인스턴스 변수
{ // 인스턴스 초기화 블럭
++count;
serialNo = count;
}
Product(){} // 기본 생성자
}
public class ProductTest{
public static void main(String[] args){
Product p1 = new Product();
Product p2 = new Product();
Product p3 = new Product();
System.out.println("serialNo of p1 = " + p1.serialNo); // 1
System.out.println("serialNo of p2 = " + p2.serialNo); // 2
System.out.println("serialNo of p3 = " + p3.serialNo); // 3
System.out.println("Total Product Number = " + Product.count); // 3
}
}
클래스 변수를 클래스 초기화 블록이 아닌 인스턴스 초기화 블록으로 하는 이유는 만약 클래스 초기화 블록을 사용한다면 로딩될 때 한번 실행되기 때문에 클래스 변수 count는 몇 개의 Product 객체를 만들어도 1이다.
'JAVA' 카테고리의 다른 글
[자바의 정석] 제어자 & 다형성 (0) | 2022.10.18 |
---|---|
[자바의 정석] 상속 & 오버라이딩 & package & import (0) | 2022.10.17 |
[자바의 정석] 변수와 메소드 & 메소드 오버로딩 & JVM 구조 (0) | 2022.10.14 |
[자바의 정석] 객체지향 언어 & 클래스와 객체 (0) | 2022.10.12 |
[Java] 자바의 정석 객체지향 part 복습 (1) | 2022.09.30 |
Comments