-
[자바] 생성자 및 상속자바 2022. 8. 4. 22:10728x90
초기화
객체를 생성하는 과정에서 기본적으로 값을 넣어준다. -> 사용자의 실수를 줄여준다
Calculator c1 = new Calculator(10,20); // 이렇게 데이터를 넣어준다
class Claculator { int left, right; // class 와 이름이 같아야 한다 -> 생성자라고 한다 public Claculator(int left, int right) { this.left = left this.right = right } public class CalculatorDemo { CalculatorDemo c1 = new CalculatorDemo(10,20); }
생성자
객체를 생성할때, 객체가 가장먼저 해야할일 즉, 초기화 작업을 해준다. (반드시 해야할일이 있는 객체는 생성자를 사용해 초기화 해주기)
- 인스턴스가 생성될 때 호출되는 ' 인스턴스 초기화 메서드 '
생성자는 메서드 처럼 클래스 내에 선언되며, 리턴값이 없고, 오버로딩이 가능하다.
1. 생성자의 이름은 클래스의 이름과 같아야 한다
2. 생성자는 리턴 값이 없다. ( void 사용하지 않고, 단지 아무 것도 적지 않는다. )
3. 생성자도 오버로딩이 가능하다 ( 하나의 클래스에 여러개의 생성자가 가능하다 )class Card { Card() { // 매개변수가 없는 생성자 } Card(String k, int num) { // 매개변수가 있는 생성자 } }
- 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
Card c = new Card(); 클래스타입 참조변수 = new 생성자(); 클래스이름() == 생성자 인것이다
기본 생성자
- 컴파일 할때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일함
-> 기본 생성자는 매개변수없고 아무런 내용이 없는 간단한 것이다.
매개 변수 있는 생성자
매개변수를 갖는 생성자를 사용하는 것은 코드를 간결하게 만든다
// 매개변수 없는 생성자 사용 Car c = new Car(); c.color = "white"; // 매개변수 있는 생성자 사용 Car c = new Car("white"); Car c = new Car("white","auto",4);
생성자에서 다른 생성자 호출하기 - this(), this
생성자 간에도 서로 호출이 가능하다
- 생성자 이름으로 클래스 이름 대신 this 사용
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출 가능class Car { String color; String type; int door; Car() { this("white", "auto", 4); } /* 위랑 같은 코드 Car() { color = "white"; type = "auto" door = 4; } */ Car(String color) { this(color, "auto", 4); } }
this : 인스턴스 자신을 가리키는 참조변수 ( 인스턴스의 주소가 저장되어 있다 )
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.생성자를 이용한 인스턴스 복사
현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성지 이용할 수 있다.
두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 모든 인스턴스 변수(상태)가 동일한 값을 갖고 있다는 뜻
class Car { String color; String type; int door; // 복사를 위한 생성자 Car(Car c) { color = c.color; type = c.type; door = c.door; } } class Test{ public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(c1); // c1의 복사본 c2를 생성한다 } }
알아야 할점은 c1값들이 변경이 되어도 c2는 영향을 받지 않는다.
인스턴스 생성시 2가지 사항 결정하기
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것 인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?좋아요상속
어떤 객체가 있을때, 그 객체의 변수와 메소드를 다른 객체가 물려 받을 수 있는 기능.
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
- 자바는 단일 상속만 허용
- 모든 클래스들에는 Object클래스가 최상위에 위치한다.// 기존의 클래스를 수정하지 않는다는게 핵심 class Calculator { int left, right; public void setOperands(int left, int right) { this.left = left; this.right = right; } public void sum() { System.out.println(this.left + this.right); } public void avg() { System.out.println((this.left + this.right) / 2); } } // 새로운 클래스를 추가 하고 상속 class SubstractionCalculator extends Calculator { public void substract() { System.out.println(this.left - this.right); } } class MultiCalculator extends Calculator { public void multi() { System.out.println(this.left * this.right); } } public class CalculatorDemo { public static void main(String[] args) { SubstractionCalculator s1 = new SubstractionCalculator(); // MultiCalculator m1 = new MultiCalculator(); // m1.multi(); 가능, 하지만 c1.multi() 는 불가능 c1.setOprands(10,20); c1.sum(); c1.avg(); c1.substract(); // 가능하다 } }
생성자 + 상속
자바는 자동적으로 기본 생성자를 만들어 준다.
매개변수가 있는 생성자를 명시적으로 만들었을때, 자바는 자동적으로 기본 생성자를 만들어 주지 않는다
위는 기본생성자 ( 에러x ), 아래는 매개변수 있는 생성자( 에러 o ) 아래의 예시는 매개변수가 있는 생성자를 만들어 놓았기에 인스턴스 생성시에 매개변수를 넣어주지 않으면 에러가 발생한다.
기본생성자가 아닌 매개변수가 있는 생성자를 가진 부모 클래스를 상속받을때는 그냥 사용하면 에러
해결방법
1. 부모 클래스에 기본 생성자를 명시적으로 적어준다
2. super을 사용한다 (super는 부모클래스를 의미한다. )class Calculator { int left, right; // 기본 생성자 public Claculator() {} // 매개 변수가 있는 생성자 public Claculator(int left, int right) { this.left = left this.right = right } public void setOprands(int left, int right) { this.left = left; this.right = right; } // .. 윗 코드 예제들과 동일 sum과 avg } class SubstractCalculator extends Calculator { public SubstractCalculator(int left, int right) { // 1. 부모클래스에 기본생성자를 선언한 경우 this.left = left; this.right = right; // 가능 // 2. 부모클래스에 기본생성자를 선언하지 않은 경우 super(left, right); // 하위 클래스의 초기화 코드들은 super 밑에 선언해야한다 } public void substract() { System.out.println(this.left - this.right); } } public class CalculatorDemo { CalculatorDemo c1 = new CalculatorDemo(10,20); }
super
- super()은 this()와 마찬가지로 생성자다.
-> 자주 나오는 에러 파트에 나올 수 있는 에러 파트 적었으니 확인! ( 12번 )
- 조상 클래스로부터 상속받은 멤버를 참조하는데, 멤버변수와 지역변수의 이름이 같을 때 this를 써 구별하듯, 상속받은 멤버와 자신의 멤버와 이름이 같을때, super로 구분
조상 클래스의 멤버와 자손클래스의 멤버가 중복 정의되어 서로 구별할때는 super 사용하기
- super는 static메서드에서는 사용할 수 없고 인스턴스메서드에서만 사용할 수 있다.
예시 - 조상의 메서드 호출
class Point { int x; int y; String getLocation() { return "x :" + x + "y : " + y; } } class Point3D extends Point { int z; String getLocation() { // 오버라이딩 // return "x :" + x + "y : " + y + "z : " + z; return super.getLocation() + "z : " + z; } }
첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출하는 예시
class PointTest { public static void main(String[] args) { Point3D p3 = new Point3D(1,2,3); } } class Point { int x,y; Point(int x, int y) { this.x = x; this.y = y; } Stirng getLocation() { return "x :" + x + "y :" + y; } } class Point3D extends Point { int z; /* Point3D(int x, int y, int z) { super(); this.x = x; this.y = y; this.z = z; } */ // or Point3D(int x, int y, int z) { super(x,y); // 조상 클래스의 생성자를 호출한다 this.z = z; } Stirng getLocation() { return "x :" + x + "y :" + y; } }
'자바' 카테고리의 다른 글
[자바] API와 API문서 보는 방법 (0) 2022.08.05 [자바] 오버로딩, 오버라이딩 (0) 2022.08.05 [자바] 유효범위 (0) 2022.08.04 [자바] 클래스 멤버와 인스턴스 멤버 (0) 2022.08.04 [자바] 메소드 (0) 2022.08.04