프로그래밍/Java 공부

인스턴스 멤버, 생성자(Constructor), 정적 멤버(static)

개발계발게발 2021. 6. 3. 17:31
반응형

생성자 Constructor

 

객체를 생성할 때 사용하는 메소드()
클래스가 객체화 되어질 때 실제 객체를 생성해주는 코드

생성자는 이외에도 아래와 같은 기능을 가지고 있다.
 1. 클래스의 객체 생성
 2. 멤버 필드 초기화
 3. 필요에 따라서 초기화 메소드 실행

다시 정리 : 생성자 없이는 객체를 만들 수 없다.


생성자의 형식


 생성자는 메소드왕 유사한 형식을 가지고 있다.
 하지만 메소드와는 기능적인 부분에서 차이가 있다.
  
 1. 생성자의 이름은 반드시 클래스 이름과 같아야 한다.
 2. 메소드가 아니기 때문에 리턴타입을 선언할 수 없다.
 

기본 생성자(Default Constructor)


자바에서는 모든 클래스마다 컴파일 시에 기본 생성자를 자동으로 생성

단, 클래스에 생성자가 하나라도 있다면 기본 생성자는 제공되지 않는다.

기본 생성자는 파라미터가 없는 생성자를 말하고
이를 이용해서 생성되는 객체를 기본 객체라고 한다.
또한 모든 필드 값은 기본 값으로 초기화 된다.

class ABC{
	public ABC() { // 생성자
		System.out.println("ABC 생성자");
	}		
	public void work() {		
	}
}

public class Constructor {
	public static void main(String[] args) {
		
		ABC a1 = new ABC();
	}
}

 

static

 static은 정적이라는 의미를 가지고 있다.
 자바에서는 정적 개념과 동적 개념을 구분

 쉽게 표현하면 정적은 클래스가 로그되는 시점을 이야기하고
 동적은 로드된 클래스가 실행된 이후를 이야기한다.

이 중 객체는 동적 데이터라고 해서 프로그램이 실행된 이후에 발생되는 대표적 형태


정적 멤버, 클래스 멤버 -> 객체를 통하지 않고 사용할 수 있는 멤버
모든 객체를 통틀어서 하나만 생성되고 모든 객체가 공유(!)한다.

인스턴스 멤버 : 인스턴스 생성시 가지고있는 자신의 변수
별도의 기억공간을 가지고 객체마다 각각 다른 값을 가진다.

정적 멤버 : 모든 객체가 공통적으로 사용하는 변수
 클래스.변수명으로 호출
 인스턴스를 생성하지 않고 사용
 하나의 클래스에 하나의 변수만 가능
 객체보다 클래스에 의지(클래스와 연결)
 static을 붙이면 된다. 

 정적 멤버처럼 정적 메소드도 만들수 있다. = static 붙이면 된다.
 main 메소드에 static 붙은 이유는 ?
 객체 생성없이 메인을 호출하기 위해
 
사용시 주의사항
 객체가 생성되지 않은 상태에서 호출되는 메소드 이므로
 객체 안에서만 존재하는 인스턴스 변수들을 사용할 수 없다.
 
정적 변수와 지역변수만 사용 가능
 정적 메소드에서 인스턴스 메소드를 호출하면 에러 발생
 인스턴스 메소드로 객체가 생성되어야 사용할 수 있기때문
 
 정적 메소드에서 정적 메소드를 호출하는 것은 가능
 정적 메소드는 this를 키워드로 사용할 수 없다.
 this가 참조할 인스턴스가 없기 때문

ex) final을 붙인 상수는 모두 다 같이 쓰는 변수
 객체를 만들지 않고 쓰면 좋다
 그래서 static을 붙여 주면 좋다.

 

class Animal{
	String name;
	int age;
	static int number; 	//정적으로 변경
	static String lang = "Kr";
	final static int CODE = 102; //상수
	
	public static void sleep() {
		System.out.println("Zzzzz");
		//eat(); 정적(static) 메소드에서 인스턴스 메소드 호출 불가
		sound();
		number =1;
		//this.name = "잠만보";  // 정적 메소드에서 this 사용 불가(참조할 인스턴스가 없다)
	}
	
	public static void sound() {
		System.out.println("소리냅니다");
	}
		
	public void eat() {
		System.out.println("먹습니다.");
		sleep();// 호출 가능
		work();
		name = "돼지";
	}
	
	public void work() {
		System.out.println("work");
	}
	
}
class Animal2{
	final static int CODE = 123;
}


public class Static01 {
	public static void main(String[] args) {
		//정적 멤버 호출 클래스명.static 변수명
		Animal.number = 100;
		
		//cat, dog, mouse....
		Animal cat = new Animal();
		Animal dog = new Animal();
		cat.name = "R2d2";
		cat.age = 149;
		cat.number = 0; // cat.number 변경시 dog.number 같이 변경
		Animal.number = 0; // static 멤버 호출시 클래스명.static 변수명으로 호출
		
		dog.name = "3po";
		dog.age = 127;
		
		
		System.out.println(cat.name); //R2d2
		System.out.println(cat.age);  //149
		System.out.println(cat.number);//0   호출시 Animal.number로

		System.out.println(dog.name);	//3po
		System.out.println(dog.age);	//127
		System.out.println(dog.number); //0
		
		Animal.sleep();
		dog.eat();
		dog.sleep();
		System.out.println(dog.name);
	}
}

 

같은 클래스에서 정의된 다른 생성자를 호출하는 키워드
 this(type, type...)
 호출하려는 생성자의 파라미터의 순서에 맞게 호출하면 된다.
 단 this 생성자 호출은 생성자 첫머리에서만 호출 가능
 딱 한번만 불러올 수 있다.

 

class Car{
	String model;
	String color;
	String maxSpeed;
	int id;
	static int number = 0;
	
	//생성자
public Car(String model) {
		this.model = model;		
		System.out.println("this(1개) 호출");
	}
	public Car(String model, String color) {
		this(model);
		System.out.println("this(2개) 호출");
		this.color = color;		
	}
	public Car(String model, String color, String maxSpeed) {
		this(model,color); //생성자 호출
		System.err.println("Car(2개 자리)를 호출합니다.");
		
		/*
		 * 같은 클래스에서 정의된 다른 생성자를 호출하는 키워드
		 * this(type, type...)
		 * 호출하려는 생성자의 파라미터의 순서에 맞게 호출하면 된다.
		 * 단 this 생성자 호출은 생성자 첫머리에서만 호출 가능
		 * 딱 한번만 불러올 수 있다.
		 */
		this.maxSpeed = maxSpeed;
		this.id = ++number;
		start();
		info();
	}

	public Car() {
		
	}
	
	public String toString() {
		return "model"+"color";
	}
	
	//메소드
	public void info() {
		System.out.println(this.model + this.color +this.maxSpeed);;
	}
	
	public void start() {
		System.out.println(this.id + "번 차량 완성");
	}
	
}

public class Static02 {
	public static void main(String[] args) {
		
		Car car1 = new Car("LF","화이트","260");
		System.out.println("--------------------");
		Car car2 = new Car("AD","블랙","240");
		System.out.println("--------------------");
		Car car3 = new Car("G80","그레이","300");
		System.out.println("--------------------");
		Car car4 = new Car("G80S","레드");
		System.out.println("--------------------");
		Car car5 = new Car("G70");
		System.out.println("--------------------");
		Car car6 = new Car();
//		Car.number++;
//		car6.id = Car.number;		
		
		System.out.println(Car.number);		
	}
}

 

 

반응형