클래스는 '객체를 정의해놓은 것' 또는 '객체의 설계도 혹은 틀' 이러한 클래스는 객체를 정의하는 데 사용이 되며 객체는 클래스에 정의된 대로 생성된다.
실제로 존재하는 것 사물 또는 개념이며 클래스에 정의된 내용을 기반으로 메모리에 생성된 것이다.
객체 배열은 많은 수의 객체를 다룰 때 용이한 방식이다. 각 요소는 참조변수의 기본값인 null로 자동 초기화 되며, 이 객체 배열은 각 객체의 주소를 저장할 수 있다.
class Time {
int hour;
int minute;
int second;
}
Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
변수 선언 위치에 따라 변수의 종류가 결정되어 진다.
멤버 변수중 static이 붙은 것이 클래스 변수 안붙은 것은 인스턴스 변수이다. 아울러 나머지 변수들은 모두 지역 변수이다.
클래스 변수는 속성 중 객체의 공통 속성인 것을 클래스 변수로 선언하며 객뱔 객체마다 다르게 유지되어야 하는 것은 인스턴스 변수로 선언을 해준다!
메서드란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 자바에서 메서드는 클래스 영역에서만 정의할 수 있다.
호출 스택은 메서드 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며 메서드가 작업하는 동안 연산의 중간결과들을 저장하는 데 사용이 된다.
// 작성 예정
한 클래스 내에 같은 이름의 메서드 여러 개를 정의하는 것을 '메서드 오버로딩'이라고 한다. 오버로딩이 성립하기 위해서는 다음과 같은 3가지 조건을 만족해야 한다.
// System.out.println메서드에는 다양한 오버로딩된 함수들을 가지고 있다.
void println(boolean x)
void println(int x)
void println(char x)
void println(double x)
void println(Object x)
예시)
//보기 1 매서드 중복 정의 오류 날 것이다. already defined
int add(int a, int b){return a+b;}
int add(int x, int y){return a+b;}
//보기 2 매서드 중복 정의 오류 날 것이다. already defined
int add(int a, int b){return a+b;}
long add(int a, int b){return a+b;}
//보기 3 오버로딩 매개변수 타입이 다르다!
long add(int a, int b){return a+b;}
long add(int a, long b){return a+b;}
생성자는 인스턴스(객체 iv 묶음)가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 따라서 인스턴스 변수의 초기와 작업을 위해 사용된다. 또한 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 생성자의 조건은 다음과 같다.
참고로 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이다. 인스턴스는 단순히 인스턴스 변수들의 초기화에 사용되는 특별한 메서드일 뿐이다.
클래스에서 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 '기본 생성자(default constructor)'덕분이었다. 컴파일 시 생성자가 하나도 정의되지 않은 경우 자동으로 기본 생성자를 추가하여 컴파일 한다. 하지만 하나라도 생성자가 존재한다면(ex. 매개 변수 생성자,...) 기본 생성자가 생성되지 않는다.
생성자도 매서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 인스턴스마다 각기 다른 값으로 초기화 된 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용하다.
class Car{
String color;
String gearType;
int door;
Car(){ } // 기본 생성자
Car(String c, String g, int d){ // 매개변수 생성자
color = c;
gearType = g;
door =d;
}
}
같은 클래스의 멤버들 간에 서로 호출할 수 있듯이 생성자 간에도 서로 호출할 수 있다.
이를 위해서는 다음과 같은 조건을 만족해야 한다.
Car(string color)
{
door=5;
Car(color,"auto", 4); // error this(color,"auto", 4); 로 해야 함
// error 생성자의 두번째 줄에서 다른 생성자 호출
}
생성자에서 다른 생성자 첫 출에서만 호출이 가능하도록 한 이유는 생성자(A) 내에서 초기화 작업도중에 다른 생성자(B)를 호출하게 되면 호출된 다른 생성자(B) 내에서도 값을 초기화 할 것이므로 다른 생성자를 호출하기 이전의(A) 초기화 작업이 무의미해질 수 있기 때문이다.
this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this로 인스턴스 변수에 접근할 수 있는 것이다.
한편 인스턴스 변수와 매개변수로 선언도니 지역변수의 이름이 같은 경우 혼동이 올 수 있다. 이러한 경우를 막기 위해서 this를 통해 구별을 한다.
Car(String color, String gearType, int door){ // 매개변수 생성자
this.color = color;
this.gearType = gearType;
this.door =door;
}
참고 문헌
자바의 정석 - 기초편