생성자 (Constructor)
생성자는 클래스로부터 객체가 생성될 때 객체의 초기화 과정을 기술하는 특수한 메소드이다. 객체가 생성될 때 무조건 수행되며, 한번만 수행된다. 생성자는 객체를 생성하는 new 명령어에 의해 자동으로 실행된다.
생성자는 주로 객체 변수를 초기화할 필요가 있을 때 사용하며, 이름은 반드시 클래스의 이름과 동일해야한다.
class Box5 {
int width;
int height;
int depth;
//생성자로서 초기화 수행
public Box5(int w, int h, int d) {
width = w;
height = h;
depth = d;
}
}
public class BoxTest {
public static void main(String[] args) {
Box5 mybox = new Box5(10, 20, 30); //3개의 매개변수로 객체 생성
int vol = mybox.width * mybox.height * mybox.depth;
System.out.println("박스의 부피: " + vol);
}
}
/*
실행결과
박스의 부피: 6000
*/
생성자 오버로딩
클래스는 여러개의 생성자를 가질 수 있다. 이 의미는 같은 이름의 생성자를 여러개 중첩하여 사용할 수 있다는 의미다.
여러개의 생성자를 사용할 때 생성자의 이름은 같지만, 생성자가 가지는 매개변수의 타입과 개수는 반드시 달라야 한다.
class Box5 {
int width;
int height;
int depth;
double dwidth;
double dheight;
double ddepth;
//두개의 생성자를 오버로딩
public Box5(int w, int h, int d) {
width = w;
height = h;
depth = d;
}
public Box5(double w, double h, double d) {
dwidth = w;
dheight = h;
ddepth = d;
}
}
public class BoxTest {
public static void main(String[] args) {
Box5 mybox1 = new Box5(10, 20, 30); //생성자의 매개변수에 적합한 생성자 수행
Box5 mybox2 = new Box5(10.5, 20.5, 30.5); //생성자의 매개변수에 적합한 생성자 수행
int vol1 = mybox1.width * mybox1.height * mybox1.depth;
double vol2 = mybox2.dwidth * mybox2.dheight * mybox2.ddepth;
System.out.println("정수박스의 부피: " + vol1);
System.out.println("실수박스의 부피: " + vol2);
}
}
this
this는 현재의 객체를 의미한다. 일반적으로 생성자나 메소드의 매개변수가 객체변수와 같은 이름을 사용하는 경우에 this를 사용한다.
this 의 역할
✔ 자신의 메모리를 가리킨다.
✔ 생성자에서 다른 생성자를 호출함
✔ 인스턴스 자신의 주소를 반환
class Box {
int width;
int height;
int depth;
public void Box(int width, int height, int depth) {
width = width;
height = height;
depth = depth;
}
}
이 경우 매개변수의 변수값을 다시 같은 매개변수에 할당하는 형식이 되어 아무런 의미를 가지지 못한다. 즉 이 경우에는 예약어 this를 사용하여 객체변수에 생성자 매개변수로 받은 값을 할당해야한다.
class Box {
int width;
int height;
int depth;
public void Box(int width, int height, int depth) {
this.width = width;
this.height = height;
this.depth = depth;
}
}
this는 현재의 객체변수를 가리킨다.
class Box {
int width;
int height;
int depth;
public Box() {
this(1, 1, 1);
}
public Box(int w) {
this(w, 1, 1);
}
public Box(int w, int h) {
this(w, h, 1);
}
public Box(int w, int h, int d) {
width = w;
height = h;
depth = d;
}
}
public class BoxTest{
Box mybox1 = new Box();
Box mybox2 = new Box(10);
Box mybox3 = new Box(10, 20);
Box mybox4 = new Box(10, 20, 30);
}
같은 클래스 내에서 여러 생성자를 만들 때, this를 사용하여 생성자 메소드를 간단하게 작성할 수 있다. 어떠한 형태의 객체가 생성되더라도 결국 마지막의 생성자가 실행되게 된다.
메소드
클래스 메소드
메소드에 static을 붙여서 클래스 메소드를 사용할 수 있다. 클래스 변수처럼 객체를 생성하지 않고도 클래스명.클래스메소드명 으로 접근할 수 있으며, 클래스로부터 생성된 모든 객체들이 공유할 수 있는 메소드이다. 클래스 메소드 내에서는 오직 클래스 변수만이 사용가능하다.
class Box {
int width;
int height;
int depth;
public long idNum;
static long boxID = 100; //클래스 변수 선언
//클래스 메소드 선언
static long getCurrentID() {
int count = 1;
boxID = boxID + count;
return boxID;
}
}
public class BoxTest{
public static void main(String args[]) {
Box mybox1 = new Box();
mybox1.idNum = Box.getCurrentID(); //클래스 메소드 호출
Box mybox2 = new Box();
mybox2.idNum = Box.getCurrentID(); //클래스 메소드 호출
System.out.println(mybox1.idNum);
System.out.println(mybox2.idNum);
System.out.println(Box.getCurrentID());
}
}
/*
출력결과
100
101
102
*/
클래스이름을 사용해 클래스메소드를 호출했다.
메소드 오버로딩
생성자 오버로딩처럼 메소드도 오버로딩될 수 있다. 즉 같은 클래스에 같은 이름의 메소드를 중첩하여 사용할 수 있다는 얘기다. 중첩된 메소드들은 매개변수의 형과 개수가 다른 형태를 가져야 한다.
class Box {
private int i_vol;
private double d_vol;
//생성자 오버로딩
public Box(int w, int h, int d) {
volume(w, h, d);
}
public Box(double w, double h, double d) {
volume(w, h, d);
}
//메소드 오버로딩
private void volume(int w, int h, int d) {
i_vol = w * h * d;
}
private void volume(double w, double h, double d) {
d_vol = w * h * d;
}
public int get_i_vol() {
return i_vol;
}
public double get_d_vol() {
return d_vol;
}
}
public class BoxTest{
public static void main(String args[]) {
Box mybox1 = new Box(10, 20, 30);
Box mybox2 = new Box(10.5, 20.5, 30.5);
System.out.println("정수박스의 부피=" + mybox1.get_i_vol());
System.out.println("실수박스의 부피=" + mybox2.get_d_vol());
}
}
/*
출력결과
정수박스의 부피=6000
실수박스의 부피=6565.125
*/
생성자 오버로딩과 메소드 오버로딩이 구현된 코드이다.
'Language > JAVA' 카테고리의 다른 글
자바언어의 구조와 기본문법 (0) | 2021.01.02 |
---|---|
[JAVA] 상속 (0) | 2020.06.20 |
[JAVA] 객체지향 개념 (0) | 2020.06.15 |