상속 받았을 때 생성자에서 생성하기
부모에게서 상속을 받았을 때 모두 쓸 수 있지만 그 중에서 쓸 수 없는 것이 있다. 바로 부모의 생성자와 초기화인데 생성자를 쓸 수 없지만 내부적으로 호출하는 방법은 가능하다. 그래서 이번에 호출 하는 방법을 배워 볼 것이다.
※프로젝트를 할 땐 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 메소드는 인터넷에서 찾아서 뽑아 쓰면 됨
앞으로 추상클래스와 인터페이스 남음...
'개발일지 > Java + Spring' 카테고리의 다른 글
211028(1) Java - 접근제한자와 캡슐화 (4) | 2021.10.28 |
---|---|
211027 java - 생성자에서 상수 초기화 (5) (0) | 2021.10.27 |
211027 Java - 상속과 오버라이딩, 상속 받고 생성자 호출 방법(3) (0) | 2021.10.27 |
211027 Java - 초기화 블록 순서, 생성자 없이 인스턴스 블록에서 구현 (2) (0) | 2021.10.27 |
211027 Java - 생성자를 통한 인스턴스 복사 (1) (0) | 2021.10.27 |