2024.05.23.THU. <D + 3>
A. 생성자
=> 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'임.
=> 인스턴스의 초기화 작업에 주로 사용됨.
=> 인스턴스 생성 시, 실행되어야 할 작업을 위해서도 사용됨.
A-1. 생성자의 특징 : 구조가 메소드와 유사, 차이점은 반환값이 없음 (void 사용 X)
java MyMath mm = new MyMath(); // 현재의 생성자는 코드에 없음, 컴파일러가 기본적으로 제공해줌 !!java d1.value = 100;java Data1(100); // 생성자가 있는 클래스
class Data{
int value;
//디폴트 생성자
/**
* 해당 클래스에서 생성자가 하나도 없으면, 컴파일러가 제공해주지만,
* 클래스에 다른 생성자가 하나라도 있으면, 컴파일러가 기본 생성자를 제공하지 않음
* 따라서, 기본생성자를 사용하려면 명시적으로 추가하면 됨**/
Data(){
//Data(50) => 생성자 이름으로 생성자내에서 호출이 불가하다.
this(50); //=> 생성자 이름 대신에 this() 사용,
value = 100;
//Data(200); => 생성자 이름으로 생성자 내에서 호출 불가,
//this(200); => 초ㅛ기화 작업은 맨 앞에서 할 것. 생성자의 본질은 초기화 하는 것!!
}
// 매개변수가 있는 생성자
Data(int x){
value = x;
}
// 생성자도 함수의 한 형태이므로, 오버로딩된다.
Data(long x){
value = (int)x;
}
}
public class Constructor {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 인스턴스 생성하기.
Data d1 = new Data();
System.out.println("d1.value = " + d1.value);
Data d2 = new Data();
System.out.println("d2.value = " + d2.value);
Data d3 = new Data(777);
System.out.println("d3.value = " + d3.value);
}
}
B. 변수의 초기화
ex)
class car{
DoorType dt = new DoorType(); }
public class BlockEx {
static int staticVar = 0; //static 변수
// 클래스 변수 초기화 블럭
static {
System.out.println("StaticVar = " + staticVar);
System.out.println("클래스 변수 초기화 블럭 호출");
}
// 인스턴스 변수 초기화 블럭
static {
System.out.println("인스턴스 변수 초기화 블럭 호출");
}
public BlockEx() {
System.out.println("생성자 호출");
}
public static void main(String[] args) {
System.out.println("Staticvar(block()) = " + staticVar);
// 초기화 블럭 및 생성자 진행 순서 확인
BlockEx block = new BlockEx();
}
}
// 클래스 멤버 변수, 인스턴스 멤버 변수(Card class)
class Card{
// 클래스 변수의 대상: 카드의 크기
// 인스턴스 변수의 대상 : 숫자, 무늬
private String kind;
private int number;
// 클래스 멤버 변수(폭, 넓이) => 객체를 생성하지 않고도 사용이가능
static int width = 100; // 폭
static int height = 230; // 넓이
}
public class Member {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 클래스 변수와 인스턴스 변수
Card c1 = new Card();
System.out.println(c1.height);
/**
* 참조변수를 통한 멤버변수 사용은 인스턴스화가 되어야만 가능하다
* -> 즉, 에러가 나는 이유는 인스턴스화가 되지 않았기 때문에 오류가 발생하는 것,
* 따라서, 클래스 변수의 접근은 참조변수를 사용하면 안되고, 클래스 이름으로 접근해야 함.**/
System.out.println(Card.height);
System.out.println(Card.width);
Card.height = 100;
System.out.println(Card.height);
}
}
C. 상속
class Parent { int age; }
class Child1 extends Parent{}
class Child2 extends Parent{}
class Point2{
int x, y;
Point2 (int x, int y){
this.x = x;
this.y = y;
}
String getLocation() {
return "x: " + x + ", y " + y;
}
}
class Point3D extends Point2{ //파생된 클래스, 3차원
int z;
//오버로딩하기.
Point3D (int x){
super(x,0);
}
Point3D (int x, int y){
/**Point3D 는 파생된 클래스임으로, 기반 클래스인 Point가 없이는 존재할 수 없음
따라서 Point가 먼저 인스턴스로 생성되어야 Point3D 의 인스턴스를 생성할 수 있음
그래서, 파생 클래스의 생서앚에서 반드시 첫 줄에 기반 클래스의
생성자를 호출하여, 기반 클래스의 인스턴스를 먼저 생성하게 해야 함. **/
super(x, y); // + this: 자기 참조 연산자, [this() => 생성자 호출]
}
// 오버라이딩하기.
/**좌표 출력시,
* 1. 재사용을 생각할 것. (기반클래스의 메소드를 사용)
* 2. 파생 클래스 상태 정보는 파생클래스가 출력 => 추가적인 코드 작성
* 추전되는 오버라이딩 : 부모 클래스의 메소드를 사용,
* 조상 클래스의 메솓 내부의 내용이 변경되더라도, 변경된 내용이 파생 클래스에 영향을 주지 않고
* 자종적으로 반영이 되게 함. **/
String getLocation() {
return super.getLocation() + ", z: " + z;
}
}
D. super
class Parent2 {
int x = 10;
int y = 10;
}
class Child extends Parent2{
int y = 20;
void method1() {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("super.x = " + super.x);
}
void method2() {
System.out.println("y = " + y);
System.out.println("this.y = " + this.y);
System.out.println("super.y = " + super.y);
}
}