본문 바로가기

Language/JAVA

[JAVA] 클래스의 기능

생성자 (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