본문 바로가기

개발일지/Java + Spring

211027 Java - 클래스 상속 후 부모 생성자 호출 (4)

상속 받았을 때 생성자에서 생성하기

부모에게서 상속을 받았을 때 모두 쓸 수 있지만 그 중에서 쓸 수 없는 것이 있다. 바로 부모의 생성자와 초기화인데 생성자를 쓸 수 없지만 내부적으로 호출하는 방법은 가능하다. 그래서 이번에 호출 하는 방법을 배워 볼 것이다. 

 

※프로젝트를 할 땐 3개로 나누어서 파일을 만들어줘야한다※

 

class Point
{
	int x = 10;
	int y = 20;
	
//	Point(){}
	
	Point(int x, int y)
	{
		this.x = x;
		this.y = y; 
	}
}

인스턴스 변수 x, y이다.

 

별도의 메소드는 존재하지 않음

 

생성자명은 클래스 명과 동일한다. 매개변수는 몇 개가 와도 되고 타입이 달라도 됨. int x, int y 지역변수 

변수명이 중복될 때!! 인스턴스 변수를 가리킬 때는 this.x를 쓴다. 

class Point3D extends Point
{
	int z = 30;
	
	Point3D()
	{
		this(100, 200, 300);
		//Point3D 다른 생성자를 의미한다. 매개변수가 3개인
	}
	
	Point3D(int x, int y, int z)
	//생성자에서 생성자 호출하기
	{
		super(x, y);
		//부모의 매개변수가 2개니까 super에서도 매개변수를 넣음
		this.z = z;
	}
}

Point 클래스를 상속 받은 자식 클래스이다.

 

생성자 2개

 

this(100, 200, 300);

다른 생성자를 의미한다. 

같은 클래스에 있는 매개 변수가 다른 생성자를 가리킨다. 아래에 있는 생성자를 찾는다는 얘기임

 

매개변수를 받았을 때

여기서 말하는 super는 부모를 말한다. 

super.x;는 부모의 변수임

super(x, y);는 이건 무조건 첫째줄에 온다. 내거의 부모에 있는 매개변수 두개짜리 생성자를 호출하게 됨

this.z = z ; 내 z 인스턴스 변수임

 

public class Sample1027_3 {


	public static void main(String[] args) {
		Point3D p3 = new Point3D();
		
		System.out.println("p3.x : " + p3.x);
		System.out.println("p3.y : " + p3.y);
		System.out.println("p3.z : " + p3.z);
	}

}

 

p3.x : 100
p3.y : 200
p3.z : 300

 

 

메인에서 객체 생성을 하려는데 -> 포인트3을 메모리에 받음 -> 해당하는 값들 초기화 다 시킴 -> Point3D 뒤에 있는 매개변수 없는 애로 간다. 그런데 다른 생성자(매개변수 3개짜리)를 호출했다. -> 아래로 내려감 매개변수 세개를 가지고 -> 호출 하러 부모로 올라감 -> 다시 내려옴 호출해옴. 내거 z를 받음 -> 메인에 다시 와서 p3에 객체를 생성하고 끝남!!!

 

메인에서 객체 생성을 하려는데 (매개변수 없음)  Point3D(Child)에서 매개 변수 없는 생성자로 감 this(100,200,300)를 읽었는데 어? 매개변수 3개 어딨지? 아래에 있으니 아래로 내려감    슈퍼(부모)의 매개변수 2개가 있네? 부모님 집에 가봐야겠다!  ▶  부모로 올라가서 값들을 읽어 옴 아~ x와 y 변수가 있구나~ 세팅해주는 역할을 함 다시 집에 와야지  호출한 쪽으로 다시 온다. ▶  this.z 변수를 초기화 하고 모두 초기화가 끝남    아~ 100, 200, 300 이 값들이 x, y, z에 대한 값이었구나~ 이해를 하고 메인으로 돌아간다.     = 을 통해서 주소값을 p3에 넣는거임 (=연산자 마지막이니까)

 

point 클래스

인스턴스 변수 두 개임 

point(int x, int y) 2개를 초기화 해야 되고 

 


순서 따라가보기

class Point
{
	int x = 10;
	int y = 20;
	
//	Point(){}
	
	Point(int x, int y)
	{
		//super() 생략 됨
		System.out.println("3333333333");
		this.x = x;
		this.y = y; 
	}
}

class Point3D extends Point
{
	int z = 30;
	
	Point3D()
	{
		this(100, 200, 300);
		//Point3D 다른 생성자를 의미한다. 매개변수가 3개인
		System.out.println("1111111111");
	}
	
	Point3D(int x, int y, int z)
	//생성자에서 생성자 호출하기
	{
		//super()가 붙어야 하는데 안에 매개 변수가 없으니 내가 따로 만들어줘야한다.
		super(x, y);
		//부모의 매개변수가 2개니까 super에서도 매개변수를 넣음
		//매개변수가 없는 것은 알아서 컴파일러가 super() 만들어준다. 
		System.out.println("2222222222");
		this.z = z;
	}
}


public class Sample1027_3 {


	public static void main(String[] args) {
		Point3D p3 = new Point3D();
		
		System.out.println("p3.x : " + p3.x);
		System.out.println("p3.y : " + p3.y);
		System.out.println("p3.z : " + p3.z);
	}

}
3333333333
2222222222
1111111111
p3.x : 100
p3.y : 200
p3.z : 300

 

 


TIP

개발을 하기 전에 무슨 프로그램인지 파악을 해야한다. 그 과정은 코딩을 먼저 보고, 실행을 해서 왜 이 결과가 나오는지 하나하나 따라가서 흐름을 파악한다. 그리고 어떤 프로그램인지 깨닫게 되는 것이다. 

 

 

디버깅용 프로그램이 따로 있지만 시스템.아웃.프린트가 아직까지는 좋다.

이런 흐름을 알게 되면 jdk 메소드는 인터넷에서 찾아서 뽑아 쓰면 됨 

 

 

앞으로 추상클래스와 인터페이스 남음...